如何解决如果我们只需要一组相同 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?
解决方法
是的,如果 Pod 需要以某种方式定义其身份,那么 Statefulset
是要走的路。
以下是 docs 中相关部分的引述:
与 Deployment 一样,StatefulSet 管理基于 相同的容器规格。与 Deployment 不同,StatefulSet 维护 每个 Pod 的粘性标识。这些 Pod 是从 相同的规格,但不可互换:每个都有一个持久的 它在任何重新调度期间维护的标识符。
因此,如果您有一个名为 Statefulset
的 myapp
对象和 3 个副本,那么 Pod 将被命名为 myapp-0
、myapp-1
和 myapp-2
。
此外,如果任何 Pod 死掉,则说 myapp-1
,那么创建的新 Pod 将再次成为 myapp-1
。
您可以通过环境变量通过 Downward API
将 pod 名称暴露给容器并在脚本中使用它:
env:
- name: MY_POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
我没有提到的一个相关说明是,与 Statefulsets
不同,Deployments
的 Pod 是一个接一个地出现的。因此,对于上面的示例 myapp
,myapp-1
只会在 myapp-0
准备就绪后开始。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。