如何将volumeClaimTemplates提取到单独的PersistentVolumeClaim Yaml文件?

时间:2020-06-06 21:53:19

标签: kubernetes persistent-volumes kubernetes-statefulset

假设我有一个StatefulSet定义

apiVersion: v1
kind: StatefulSet
metadata:
  name: web
spec:
  ...
  volumeClaimTemplates:
  — metadata:
      name: www
    spec:
      resources:
        requests:
          storage: 1Gi

这将为我创建一个PersistentVolumeClaim(PVC),每个吊舱的PersistentVolume(PV)为1 GiB。

我怎么写这样的东西

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: www
spec:
  ...
  resources:
    requests:
      storage: 1Gi
...

是否将其与StatefulSet连接起来,使其仍然为每个吊舱创建PVC和PV?

1 个答案:

答案 0 :(得分:1)

我猜在您的问题中,您使用的是this website中的statfulset示例,因此我将遵循其命名约定。

我要为您提供的解决方案已经过我自己的测试,似乎可行。

k8s api reference中,您可以找到以下定义:

volumeClaimTemplates是允许窗格引用的声明列表。 StatefulSet控制器负责以维持容器身份的方式将网络身份映射到声明。此列表中的每个声明必须在模板的一个容器中至少具有一个匹配的(按名称)volumeMount。此列表中的声明优先于模板中具有相同名称的任何卷。

因此,这意味着只要您具有特定名称的volumeclaim,staefulset便会使用它而无需创建新名称。这意味着您可以手动创建一些pv / pvc,statefulset将使用它们。

您需要做的就是正确命名您的pvc。这个名字应该看起来如何? 这是第一部分:

volumeClaimTemplates:
  - metadata:
      name: www        <-here is the first part

第二部分是广告连播名称。

(请查看can-i-rely-on-volumeclaimtemplates-naming-convention上的Stack问题。)

这两个部分结合在一起创建了pvc的名称(用破折号分隔),例如

www-web-0        <- this is how you are supposed to name one of your pvcs
│   └ second part (pod name)
└ first part

如果您已经拥有(自动配置的)PVC,请使用

kubectl get pvc <pvcname> -oyaml > pvcname.yaml
kubectl get pv  <pvname>  -oyaml > pvname.yaml

将其规范保存到磁盘。然后您可以运行:

kubectl apply -f pvcname.yaml
kubectl apply -f pvname.yaml

应用pvc / pv配置。请记住,某些yaml文件在运行kubectl apply之前可能需要进行一些修改。