如果我们所需要的只是一组相同 Pods 中每个 Pod 的一致标识符,Kubernetes StatefulSet 是正确的答案吗?
Is a Kubernetes StatefulSet the right answer if all we need is a consistent identifier for each Pod in a group of identical Pods?
我们正在研究一个 Kubernetes 场景,它要求我们为给定的 Deployment 维护 N pods(让我们简单地假设 N 是静态的并且 N = 3)。目前我们为此使用 Deployment 和 ReplicaSet。
在每个 pod 中,是否有任何方法(通过环境变量注入或类似方式)让我们获得一个唯一标识符,显示该 pod 是哪个 pod(即“1”、“2”、“3”或类似的...确切的格式并不重要)。
特别重要的(因为这些 pods 连接到的系统)是如果 pod“2”死了,替换 pod 也会报告其标识符为“2”,而不是新的东西,例如“4”...换句话说,除非集合的大小增加/减少,否则标识符集合不会随时间变化。目前我们正在使用 pod 名称,但这种方式并不稳定; pod 名称每次都是新的且唯一的。
这是 StatefulSet 的用途吗?该文档似乎特别关注存储量,但这不是我们的优先事项。我们如何在代码中真正获得容器内唯一且稳定的ID?
是的,如果 pods 需要以某种方式定义他们的身份,Statefulset
是可行的方法。
这里引用自 docs 的相关部分:
Like a Deployment, a StatefulSet manages Pods that are based on an
identical container spec. Unlike a Deployment, a StatefulSet maintains
a sticky identity for each of their Pods. These pods are created from
the same spec, but are not interchangeable: each has a persistent
identifier that it maintains across any rescheduling.
因此,如果您有一个名为 myapp
且具有 3 个副本的 Statefulset
对象,那么 pods 将被命名为 myapp-0
、myapp-1
和 myapp-2
.
此外,如果 pods 中的任何一个说 myapp-1
,那么创建的新 pod 将再次成为 myapp-1
.
您可以通过 Downward API
通过环境变量将 pod 名称公开给容器,并在脚本中使用它:
env:
- name: MY_POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
我没有提到的一个相关说明是 Statefulsets
与 Deployments
不同,pods 是一个接一个地提出来的。所以,对于上面的例子myapp
,myapp-1
只会在myapp-0
准备好之后才开始。
我们正在研究一个 Kubernetes 场景,它要求我们为给定的 Deployment 维护 N pods(让我们简单地假设 N 是静态的并且 N = 3)。目前我们为此使用 Deployment 和 ReplicaSet。
在每个 pod 中,是否有任何方法(通过环境变量注入或类似方式)让我们获得一个唯一标识符,显示该 pod 是哪个 pod(即“1”、“2”、“3”或类似的...确切的格式并不重要)。
特别重要的(因为这些 pods 连接到的系统)是如果 pod“2”死了,替换 pod 也会报告其标识符为“2”,而不是新的东西,例如“4”...换句话说,除非集合的大小增加/减少,否则标识符集合不会随时间变化。目前我们正在使用 pod 名称,但这种方式并不稳定; pod 名称每次都是新的且唯一的。
这是 StatefulSet 的用途吗?该文档似乎特别关注存储量,但这不是我们的优先事项。我们如何在代码中真正获得容器内唯一且稳定的ID?
是的,如果 pods 需要以某种方式定义他们的身份,Statefulset
是可行的方法。
这里引用自 docs 的相关部分:
Like a Deployment, a StatefulSet manages Pods that are based on an identical container spec. Unlike a Deployment, a StatefulSet maintains a sticky identity for each of their Pods. These pods are created from the same spec, but are not interchangeable: each has a persistent identifier that it maintains across any rescheduling.
因此,如果您有一个名为 myapp
且具有 3 个副本的 Statefulset
对象,那么 pods 将被命名为 myapp-0
、myapp-1
和 myapp-2
.
此外,如果 pods 中的任何一个说 myapp-1
,那么创建的新 pod 将再次成为 myapp-1
.
您可以通过 Downward API
通过环境变量将 pod 名称公开给容器,并在脚本中使用它:
env:
- name: MY_POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
我没有提到的一个相关说明是 Statefulsets
与 Deployments
不同,pods 是一个接一个地提出来的。所以,对于上面的例子myapp
,myapp-1
只会在myapp-0
准备好之后才开始。