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

时间:2020-03-17 21:07:14

标签: kubernetes google-kubernetes-engine kubernetes-pod

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

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

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

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

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

将挂载主机节点的DISPLAY变量(而不是硬编码和猜测变量的名称),以便如果节点设置为“:0”或任何其他变量,它将动态地将其转发/注入到容器中。 / p>

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

编辑以进一步说明:

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

另一个例子:

想象一下一个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/

之外,我几乎都想这样做。

2 个答案:

答案 0 :(得分:1)

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

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

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

不幸的是,由于Kubernetes concepts,在纯Kubernetes中无法实现您想要的目标。根据{{​​3}}:

Pod封装了应用程序的容器(或者在某些情况下, 多个容器),存储资源,唯一的网络IP和 用于控制容器运行方式的选项。荚代表 部署单元:中的一个应用程序实例 Kubernetes,可能由单个容器或一个容器组成 少量紧密耦合且共享的容器 资源。

如果您愿意kubectl describe <pod-name>,则只有主机名,因为这就是Kubernetes所需要的。 Kubernetes确保在整个节点上运行整个部署应用程序,而不用担心(您指定nodeSelector的unitl)。 Kubernetes就是这样设计的。有关详细信息,您应该休息doc

您可以添加一些tagsansiblepython等来提问。也许您可以使用某些脚本/库,但是可以使用pure Kubernetes来实现。

答案 1 :(得分:0)

您可以使用ConfigMap。在配置映射中创建key = value并在您的环境中引用

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