将单独的 env 变量传递给 statefulset pod

问题描述

我正在部署两个作为无头服务运行的相同映像的 statefulset pod。我希望将单独的 env 变量传递给在 statefulset pod 中运行相同图像的容器。谁能告诉我如何实现这一目标?

解决方法

不可能将同一环境变量的不同值暴露给 Statefulsets 的不同容器,因为 Statefulsets 中的 pod 是同一应用程序的相同副本。

来自docs

与 Deployment 一样,StatefulSet 管理基于 相同的容器规格。与 Deployment 不同,StatefulSet 维护 每个 Pod 的粘性标识。这些 Pod 是从 相同的规格,但不可互换:每个都有一个持久的 它在任何重新调度期间维护的标识符。

但是,如上述文档中所述,由于 Statefulset 的每个 pod 都具有粘性标识,您可以使用它向 pod 传递相同的环境变量集,并根据身份使用不同的环境变量执行适当的操作豆荚。

您可以通过环境变量通过 Downward API 将 pod 名称公开给容器,并在脚本中使用它来采取适当的操作:

env:
  - name: MY_POD_NAME
      valueFrom:
        fieldRef:
          fieldPath: metadata.name
  - name: env0
    value: value0
  - name: env1
    value: value1

因此,如果您有两个名称为 Statefulsetmyapp 副本,那么 Pod 的名称将为 myapp-0myapp-1,然后您就可以使用环境基于 pod 名称的变量(如果 pod 名称为 env0,则为 myapp-0;如果 pod 名称为 env1,则为 myapp-1)。

注意:虽然该解决方案有效,但它不应该是首选,我们应该使用单独的 statefulsets 对象来根据用例公开不同的环境变量。