使用 Init 容器定义环境变量值

功能状态: Kubernetes v1.34 [alpha] (默认禁用)

本页面展示了如何通过文件为 Pod 中的容器配置环境变量。

准备工作

你需要拥有一个 Kubernetes 集群,并且 kubectl 命令行工具已配置为与你的集群通信。建议在本教程中,在至少两个不充当控制平面主机的节点组成的集群上运行。如果你还没有集群,可以使用 minikube 创建一个,或者使用这些 Kubernetes 游乐场之一

你的 Kubernetes 服务器版本必须是 v1.34。

要检查版本,请输入 kubectl version

设计工作原理

在本练习中,你将创建一个 Pod,它从文件中获取环境变量,并将这些值投影到正在运行的容器中。

apiVersion: v1
kind: Pod
metadata:
  name: envfile-test-pod
spec:
  initContainers:
    - name: setup-envfile
      image:  nginx
      command: ['sh', '-c', 'echo "DB_ADDRESS=address\nREST_ENDPOINT=endpoint" > /data/config.env']
      volumeMounts:
        - name: config
          mountPath: /data
  containers:
    - name: use-envfile
      image: nginx
      command: [ "/bin/sh", "-c", "env" ]
      env:
        - name: DB_ADDRESS
          valueFrom:
            fileKeyRef:
              path: config.env
              volumeName: config
              key: DB_ADDRESS
              optional: false
  restartPolicy: Never
  volumes:
    - name: config
      emptyDir: {}

在此清单中,你可以看到 `initContainer` 挂载了一个 `emptyDir` 卷,并将环境变量写入其中的文件,而常规容器通过 `fileKeyRef` 字段引用文件和环境变量键,而无需挂载卷。当 `optional` 字段设置为 false 时,`fileKeyRef` 中指定的 `key` 必须存在于环境变量文件中。

该卷将仅挂载到写入文件的容器 (`initContainer`),而消耗环境变量的使用者容器将不会挂载该卷。

环境文件格式遵循 Kubernetes 环境文件标准

在容器初始化期间,kubelet 从 `emptyDir` 卷中指定的文件中检索环境变量,并将其暴露给容器。

创建 Pod

kubectl apply -f https://k8s.io/examples/pods/inject/envars-file-container.yaml

验证 Pod 中的容器是否正在运行

# If the new Pod isn't yet healthy, rerun this command a few times.
kubectl get pods

检查容器日志中的环境变量

kubectl logs dapi-test-pod -c use-envfile | grep DB_ADDRESS

输出显示了选定环境变量的值

DB_ADDRESS=address

环境变量文件语法

Kubernetes 环境变量文件的格式源自 `.env` 文件。

在 shell 环境中,`.env` 文件通常使用 `source .env` 命令加载。

对于 Kubernetes,定义的环境变量文件格式遵循更严格的语法规则

  • 空行:空行将被忽略。

  • 前导空格:所有行上的前导空格都将被忽略。

  • 变量声明:变量必须声明为 `VAR=VAL`。 `=` 周围的空格和尾随空格将被忽略。

    VAR=VAL → VAL
    
  • 注释:以 # 开头的行被视为注释并被忽略。

    # comment
    VAR=VAL → VAL
    
    VAR=VAL # not a comment → VAL # not a comment
    
  • 行继续:变量声明行末尾的反斜杠 (\) 表示值在下一行继续。这些行将用一个空格连接。

    VAR=VAL \
    VAL2
    → VAL VAL2
    

下一步

上次修改时间:2025 年 8 月 6 日太平洋标准时间晚上 11:39: 优化 envfile 文档 优化 envfile 文档 (82cf07f997)