kubernetes - 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 }}
有任何想法吗 ?
解决方案
要查看 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(ReadWriteMany 模式),只有当您在集群中首次引入 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) 之间共享相同数据存储的方法。
推荐阅读
- python - 在 CatBoost 的交叉验证中,AUC 始终等于 1
- python - 如何在 python 编码中重复用户输入?
- javascript - 发出贝宝订阅 API 请求以获取服务器上的订阅信息 - 身份验证包装器?
- asp.net - 如何检查用户会话并在每个页面上即时重新创建一个?
- spring-boot - Swagger codegen Maven 插件在 SpringBoot 中没有生成正确的 dateFormat java.time.LocalDate
- c++ - 如果 sizeof(T) 大于 std::deque 中的块大小怎么办
? - spartacus-storefront - 将默认页面更改为登录
- javascript - 我刚刚在导航栏中添加了汉堡包按钮,但它现在不起作用?
- mysql - 数据库上的 i/o 如何与查询类型相关
- linux - cut -f 多个参数