首页 > 解决方案 > Kubernetes:在 claimName 中使用序数?

问题描述

我有一个运行良好的有状态集,并且有状态集具有 ReadWriteMany PVC。我需要与另一个 statefulset 共享这个 PVC。

有谁知道我如何将序号添加到 claimName 中。

基本上我有一个 backendService,它是一个有 2 个副本的 statefulset,所以它定义了一个 volumeClaimTemplate - 因此它有 2 个卷 service-data-service-0 和 service-data-service-1 例如。

在另一个 statefulset 中 - 它有自己的数据量,但我需要共享来自另一个 statefulset 的数据量。

存在一对一的映射 - 这意味着需要将较低服务中序号为 0 的卷添加到 pod0 中,序号为 1 的卷需要添加到 pod1 中。

我有点困惑我是如何做到这一点的。部署很容易,因为从技术上讲,您有 2 个部署。所以每个部署都可以严格发送到正确的 service-data-service-XX(其中 XX 是较低服务器的序号,即 0,1 等)

在我的脑海中,伪代码 - 我有这个。任何人都可以帮忙吗?

      volumes:
        - name: lnd2-data-volume
          persistentVolumeClaim:

            # This volumes section is in the higher service but shares a data volume
            # with the lower service
 
            claimName: service-data-service-{{ "SOME TEMPLATE HERE to give me either 0 or 1 for the current POD ordinal number }}

有任何想法吗 ?

标签: kuberneteskubernetes-statefulsetkubernetes-pvcpersistent-volume-claims

解决方案


要查看 TLDR 版本,请转到以下解决方案。

您想要实现的目标在今天的 Statefulset (STS) 中是不可行的。

由于 StatefulSet 控制器的设计,Claims 需要有唯一的标识符,以便映射到其对应的 Pod,并且不能在不同的 StatefulSet 应用程序之间重用。

因此,无论您在 Volumes 中指定什么声明名称作为 StatefulSet 定义中 Pod 模板的一部分(例如claimName=service-data-service-0),StatefulSet 控制器总是会使用以下命名方案为每个由它控制的 Pod 覆盖它:

  PVC name = claim.Name + set.Name + ordinal number

在哪里:

claim.Name- 在 PodTemplateSpec中与“volumeMount”匹配的 STS 的volumeClaimTemplates列表中声明

set.Name- StatefulSet 名称

ordinal- Pod(复制品 - 1)

我的观察

STS 可以使用现有的 PVC(R​​eadWriteMany 模式),只有当您在集群中首次引入 StatefulSet 时(=它还没有被其他工作负载拥有)。

例如,像这样的 STS:

 apiVersion: apps/v1
  kind: StatefulSet
  metadata:
    name: peb
  spec:
  ...
  volumeClaimTemplates:
  - metadata:
      name: fileserver-claim
    spec:
      accessModes: [ "ReadWriteMany" ]
      storageClassName: ""
      resources:
        requests:
          storage: 1Gi

将消耗现有的 PVC:

fileserver-claim-peb-0

在 API 服务器日志中看到伴随的事件:

PVC 'fileserver-claim-peb-0' 已经存在

并且因为不能有任何不同的同名 STS(Pod 'peb-0' 在集群中是唯一的,它的 claimName 也是如此),你的选择就在这里。

解决方案:

手动预置一对 PV,它们使用相同的关联存储资产(例如,支持 RWX 访问模式的基于 NFS 的卷),并且在您的 STS 中的 PVC 列表中按名称 (volumeName) 引用现有的未绑定 PV,例如:

...
  volumeClaimTemplates:
  - metadata:
      name: datadir
    spec:
      accessModes:
        - "ReadWriteOnce"
      volumeName: fileserver-claim-peb
      resources:
        requests:
          storage: 1Gi

我认为这是在不同 StatefulSet(s) 之间共享相同数据存储的方法。


推荐阅读