如果我们所需要的只是一组相同 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-0myapp-1myapp-2.

此外,如果 pods 中的任何一个说 myapp-1,那么创建的新 pod 将再次成为 myapp-1.

您可以通过 Downward API 通过环境变量将 pod 名称公开给容器,并在脚本中使用它:

env:
  - name: MY_POD_NAME
      valueFrom:
        fieldRef:
          fieldPath: metadata.name

我没有提到的一个相关说明是 StatefulsetsDeployments 不同,pods 是一个接一个地提出来的。所以,对于上面的例子myappmyapp-1只会在myapp-0准备好之后才开始。