kubernetes - 如果我们需要的是一组相同 Pod 中每个 Pod 的一致标识符,那么 Kubernetes StatefulSet 是否是正确的答案?
问题描述
我们正在研究一个 Kubernetes 场景,该场景需要我们为给定的 Deployment 维护N个 Pod(让我们简单地假设N是静态的并且N = 3)。目前我们正在为此使用 Deployment 和 ReplicaSet。
在每个 pod 中,我们是否有任何方法(通过环境变量注入或类似方法)获得一个唯一标识符,该标识符显示该 pod 是哪个 pod(即“1”、“2”、“3”或类似...格式不重要)。
尤其重要的是(因为这些 pod 连接到的系统)如果 pod “2” 死亡,替换 pod 也将其标识符报告为“2”,而不是新的东西,例如“4”......换句话说,标识符的集合不会随时间改变,除非集合的大小增加/减少。目前我们使用的是 pod 名称,但这种方式不稳定;pod 名称每次都是新的且唯一的。
这就是StatefulSet的用途吗?该文档似乎特别关注存储卷,但这不是我们的优先事项。我们如何在代码中实际获取容器内唯一且稳定的 ID?
解决方案
是Statefulset
的,如果 pod 需要以某种方式定义其身份,这是一种可行的方法。
这是来自文档相关部分的引用:
与 Deployment 类似,StatefulSet 管理基于相同容器规范的 Pod。与 Deployment 不同,StatefulSet 为其每个 Pod 维护一个粘性标识。这些 pod 是根据相同的规范创建的,但不可互换:每个 pod 都有一个持久标识符,它在任何重新调度时都会维护该标识符。
因此,如果您有一个以 3 个副本Statefulset
命名的对象myapp
,那么 pod 将被命名为myapp-0
,myapp-1
和myapp-2
.
此外,如果任何 pod 死了,myapp-1
那么作为替代而创建的新 pod 将再次是myapp-1
.
您可以通过环境变量将 pod 名称暴露给容器,Downward API
并在脚本中使用它:
env:
- name: MY_POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
我没有提到的一个相关注意事项是,Statefulsets
与Deployments
. 所以,对于上面的例子myapp
,只有在准备好myapp-1
之后才会开始myapp-0
。