问题描述
我正在部署两个作为无头服务运行的相同映像的 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
因此,如果您有两个名称为 Statefulset
的 myapp
副本,那么 Pod 的名称将为 myapp-0
和 myapp-1
,然后您就可以使用环境基于 pod 名称的变量(如果 pod 名称为 env0
,则为 myapp-0
;如果 pod 名称为 env1
,则为 myapp-1
)。
注意:虽然该解决方案有效,但它不应该是首选,我们应该使用单独的 statefulsets 对象来根据用例公开不同的环境变量。