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

How to extract volumeClaimTemplates to a separate PersistentVolumeClaim yaml file?

假设我有一个 StatefulSet 定义

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

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

我怎么能写出这样的东西

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

并将它与 StatefulSet 连接起来,以便它仍然为每个 pod 创建 PVC 和 PV?

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

我即将向您介绍的解决方案已经过我自己的测试,似乎有效。

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

volumeClaimTemplates is a list of claims that pods are allowed to reference. The StatefulSet controller is responsible for mapping network identities to claims in a way that maintains the identity of a pod. Every claim in this list must have at least one matching (by name) volumeMount in one container in the template. A claim in this list takes precedence over any volumes in the template, with the same name.

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

您需要做的就是正确命名您的 pvc。这个名字应该是什么样子的? 这是第一部分:

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

第二部分是 pod 名称。

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

这两个部分组合在一起创建了 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配置。请记住,在 运行ning kubectl apply.

之前,某些 yaml 文件可能需要稍作修改