【问题标题】:Kubernetes Pods - Inject environment variable from host nodeKubernetes Pods - 从主机节点注入环境变量
【发布时间】:2020-06-28 23:56:16
【问题描述】:

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

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”或任何其他变量,它将动态转发/注入到容器中。

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

编辑以进一步解释:

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

【问题讨论】:

  • 我仍然不确定你想要实现什么。您可以考虑使用ConfigMapKustomizeinitContainer,但是您需要以不同的方式描述此场景。
  • 我正在尝试从运行 pod 的节点中提取环境变量,并能够从 pod/容器中访问该环境变量

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


【解决方案1】:

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

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

【讨论】:

  • 虽然这绝对有用,而且是一篇非常好的源文章,但我认为它不能解决问题。创建配置映射会将我的所有容器设置为使用相同的配置值。在创建 Pod 时,我不知道我将在哪个节点上,并且每个节点本身可以​​有不同的 DISPLAY 变量。所以我需要从节点本身获取变量,不幸的是配置不起作用
  • 想象一个 pod,它是一个简单的 http 服务器,当你用浏览器访问它时,它会向你显示它正在运行的节点的操作系统。假设节点有一个名为 OPERATING_SYSTEM 的环境变量。节点 A 的 OPERATING_SYSTEM=Windows 节点 B 的 OPERATING_SYSTEM=Linux。我如何配置这个 pod 来显示节点的操作系统。 不是集装箱操作系统
【解决方案2】:

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

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

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

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

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

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

您可以在问题中添加一些tagsansiblepython 等。也许如果你会使用一些脚本/库,它可以完成,但你不会使用 pure Kubernetes 来实现这一点。

【讨论】:

  • 是的,我也这么认为。为什么你不想要这样是有道理的,我认为我的用例非常适合。也许我可以拥有一个主机名->显示变量的映射,然后在其中注册我的所有节点,然后以某种方式在脚本级别拉出该主机名并将其分配到那里。感谢您的回复,非常有帮助!
猜你喜欢
  • 2022-01-11
  • 2018-04-20
  • 2017-10-23
  • 1970-01-01
  • 1970-01-01
  • 2015-06-26
  • 2021-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多