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
传递环境变量的方法很少。
- 在容器中定义环境变量,例如 this doc.
- 在 Pod/Deployment 配置中定义为 here。
- 来自 this example 的秘密。
要将新环境变量传递给容器,您需要使用 ConfigMap
或 Secret
。
不幸的是,由于 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.
你可以加一些tags
和ansible
、python
等来提问。也许如果你会使用一些 scripts/libraries 它可以完成,但你不会使用 pure Kubernetes
.
我有一个具有以下规格的容器:
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
传递环境变量的方法很少。
- 在容器中定义环境变量,例如 this doc.
- 在 Pod/Deployment 配置中定义为 here。
- 来自 this example 的秘密。
要将新环境变量传递给容器,您需要使用 ConfigMap
或 Secret
。
不幸的是,由于 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.
你可以加一些tags
和ansible
、python
等来提问。也许如果你会使用一些 scripts/libraries 它可以完成,但你不会使用 pure Kubernetes
.