【问题标题】:How to extract volumeClaimTemplates to a separate PersistentVolumeClaim yaml file?如何将 volumeClaimTemplates 提取到单独的 PersistentVolumeClaim yaml 文件中?
【发布时间】:2023-04-07 19:03:01
【问题描述】:

假设我有一个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?

【问题讨论】:

  • 你不能那样做。
  • @AmitKumarGupta 接受的答案有问题吗?

标签: kubernetes persistent-volumes kubernetes-statefulset


【解决方案1】:

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

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

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

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

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

您需要做的就是正确命名您的 pvcs。这个名字应该怎么看? 这是第一部分:

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

第二部分是一个 pod 名称。

(在 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 配置。请记住,在运行 kubectl apply 之前,某些 yaml 文件可能需要稍作修改。

【讨论】:

    猜你喜欢
    • 2021-01-15
    • 1970-01-01
    • 2020-09-04
    • 2017-03-28
    • 1970-01-01
    • 2018-02-15
    • 2017-10-07
    • 2021-02-12
    • 1970-01-01
    相关资源
    最近更新 更多