将主机的环境变量注入 K8s Pod

Inject host's environment variable into K8s Pod

我想 运行 我的一个 IoT 设备上的一个 pod。 这些设备中的每一个都包含一个我希望此 pod 使用的环境变量。 有什么方法可以使用 helm/kubectl 的内置模板将此 env 变量注入到 pod 中吗? 我在我的 deployment.yaml 文件上尝试了以下操作:

env: 
  - name: XXX
    value: $ENV_FROM_HOST

但是在执行 pod 并尝试获取 XXX 值时,我从主机获取字符串 $ENV_FROM_HOST 而不是它的值:

$ echo $XXX
$ENV_FROM_HOST

谢谢。

无法将主机的环境变量直接传递给 pods。我经常通过创建 ConfigMap 来做到这一点。

  1. 使用 from-lireral 选项创建 ConfigMap:

    kubectl create configmap testcm --from-literal=hostname=$HOSTNAME
    
  2. 参考 Pod 清单中的内容:

    - name: TEST
      valueFrom:
        configMapKeyRef:
          name: testcm
          key: hostname
    

这会将主机的 $HOSTNAME 注入 Pod 的 $TEST。

如果是敏感信息,可以使用Secrets代替ConfigMap。

谈到 Kubernetes,假设之一是 pod 只是 sharing resources between containers in the pod:

A Pod (as in a pod of whales or pea pod) is a group of one or more containers, with shared storage and network resources, and a specification for how to run the containers. A Pod's contents are always co-located and co-scheduled, and run in a shared context.

这意味着 pod 与位于(节点)运行 的主机隔离,因此您不能直接从节点读取环境变量。

但是,我想到了一些解决方法。

如果所有节点的环境变量都相同:

  • 如果你使用的是CI/CD,那么你可以实现下面的代码。 在部署定义中 - deployment.yaml

    env: 
      - name: XXX
        value: ENV_TO_CHANGE
    

    命令:

    sed "s/ENV_TO_CHANGE/{YOUR_VALUE}/g" deployment.yaml | kubectl apply -f -
    

    它不会编辑现有文件;它将输出编辑后的 ​​deployment.yaml 文件,并将通过管道传输到 kubectl apply 命令

如果每个节点的环境变量不同:

  • 将您的环境变量设置为节点标签,然后将它们注入 pods - 中提供了一些解决方案。
  • (不推荐)- 将节点上的环境变量保存为特定目录中的文件,然后使用 hostPath volume 在 pod 上读取它。请记住,hostPath 存在许多安全风险,最好避免它。