将单独的环境变量传递给有状态 Pod

med*_*gai 3 kubernetes kubernetes-statefulset

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

Kri*_*sia 12

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

来自文档

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

但是,如上面文档中所述,由于 Statefulset 的每个 pod 都具有粘性身份,您可以使用该身份将同一组环境变量传递给 pod,并根据 pod 的身份使用不同的环境变量采取适当的操作。

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

env:
  - name: MY_POD_NAME
      valueFrom:
        fieldRef:
          fieldPath: metadata.name
  - name: env0
    value: value0
  - name: env1
    value: value1
Run Code Online (Sandbox Code Playgroud)

Statefulset因此,如果您有两个具有 name的副本myapp,那么 pod 的名称将是myapp-0myapp-1,然后您可以根据 pod 的名称使用环境变量(env0如果 pod name 是myapp-0env1如果 pod name 是myapp-1)。

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

  • valueFrom 的缩进应与“name”的缩进相同 (2认同)