Kubernetes Pods - 从主机节点注入环境变量

Kubernetes Pods - Inject environment variable from host node

我有一个具有以下规格的容器:

containers:
      - name: test-container
        image: REDACTED
        env:
        - name: DISPLAY
          value: ":10.0"   <---------------------
        - name: NODE_ENV
          value: "production"
        - name: ENDPOINT
          value: REDACTED
        ports:
        - containerPort: 8080
        volumeMounts:
        - name: x11
          mountPath: /tmp/.X11-unix
      volumes:
      - name: x11
        hostPath:
          path: /tmp/.X11-unix

旁注:这样做是允许我在主机节点上渲染组件,但在我的容器内执行计算。

现在我将 DISPLAY 硬编码为“:10.0”,但我想做类似的事情:

env:
        - name: DISPLAY
          value: ":$HOST_DISPLAY"

这将挂载主机节点的 DISPLAY 变量(而不是硬编码和猜测它将是什么),因此如果节点设置了“:0”或任何其他变量,它将 forward/inject 放入动态容器。

有什么方法可以做到这一点?如果有帮助,我可以使用 ansible operator

编辑进一步解释:

想象一个 pod 是一个简单的 http 服务器,当您使用浏览器访问它时,它会向您显示它所在节点的操作系统 运行。假设节点有一个名为 OPERATING_SYSTEM 的环境变量。节点 A 有 OPERATING_SYSTEM=Windows 节点 B 有 OPERATING_SYSTEM=Linux。我如何配置此 pod 以显示节点的操作系统。 不是容器操作系统

另一个例子:

想象一个 pod 是一个简单的 http 服务器,当您使用浏览器访问它时,它会返回它所在节点的 ID 运行。假设节点 1 有一个名为 NODE_ID=123 的环境变量,节点 2 有一个名为 NODE_ID=456 的环境变量。当任何 pod 被安排在这两个任意节点之一上时,它可以访问这些 NODE 环境变量以正确显示它运行正在

上的节点

我几乎想这样做,除了node.fields:https://v1-15.docs.kubernetes.io/docs/tasks/inject-data-application/environment-variable-expose-pod-information/

您可以使用ConfigMap。在配置映射中创建一个键=值并在您的环境中引用

https://medium.com/google-cloud/kubernetes-configmaps-and-secrets-68d061f7ab5b

传递环境变量的方法很少。

  1. 在容器中定义环境变量,例如 this doc.
  2. 在 Pod/Deployment 配置中定义为 here
  3. 来自 this example 的秘密。

要将新环境变量传递给容器,您需要使用 ConfigMapSecret

不幸的是,由于 Kubernetes concepts,您想要实现的在纯 Kubernetes 中是不可能实现的。根据 doc:

A Pod encapsulates an application’s container (or, in some cases, multiple containers), storage resources, a unique network IP, and options that govern how the container(s) should run. A Pod represents a unit of deployment: a single instance of an application in Kubernetes, which might consist of either a single container or a small number of containers that are tightly coupled and that share resources.

如果你愿意 kubectl describe <pod-name> 你将只有主机名,因为这就是 Kubernetes 所需要的。 Kubernetes 确保 运行 整个部署应用程序,而不是在什么节点上(你指定的单位 nodeSelector)。这就是 Kubernetes 的设计方式。有关详细信息,您应该阅读 this docs.

你可以加一些tagsansiblepython等来提问。也许如果你会使用一些 scripts/libraries 它可以完成,但你不会使用 pure Kubernetes.