首页 > 解决方案 > 如果我们需要的是一组相同 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?

标签: kubernetesdeploymenthorizontal-scaling

解决方案


Statefulset的,如果 pod 需要以某种方式定义其身份,这是一种可行的方法。

这是来自文档相关部分的引用:

与 Deployment 类似,StatefulSet 管理基于相同容器规范的 Pod。与 Deployment 不同,StatefulSet 为其每个 Pod 维护一个粘性标识。这些 pod 是根据相同的规范创建的,但不可互换:每个 pod 都有一个持久标识符,它在任何重新调度时都会维护该标识符。

因此,如果您有一个以 3 个副本Statefulset命名的对象myapp,那么 pod 将被命名为myapp-0,myapp-1myapp-2.

此外,如果任何 pod 死了,myapp-1那么作为替代而创建的新 pod 将再次是myapp-1.

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

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

我没有提到的一个相关注意事项是,StatefulsetsDeployments. 所以,对于上面的例子myapp,只有在准备好myapp-1之后才会开始myapp-0


推荐阅读