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

特性状态: Kubernetes v1.35 [beta](默认启用)

本页展示如何通过文件为 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 Env 文件标准

在容器初始化期间,kubelet 从 emptyDir 卷中指定的文件中获取环境变量, 并将这些环境变量暴露给容器。

创建 Pod:

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

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

# 如果新 Pod 尚未就绪,多次运行此命令。
kubectl get pods

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

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

输出显示所选环境变量的值:

DB_ADDRESS=address

Env 文件语法

Kubernetes 使用的 Env 文件格式是符合 POSIX 标准的 Bash 环境变量语义的一个定义明确的子集。 Kubernetes 所支持的所有 Env 文件都会生成与被符合 POSIX 标准的 Bash 解释时相同的环境变量。但是,符合 POSIX 标准的 Bash 支持一些 Kubernetes 不接受的额外格式。

事例:

MY_VAR='my-literal-value'

规则

  • 变量声明:使用 VAR='value' 的形式。= 前后空格将被忽略;行首空格将被忽略;空行将被忽略。
  • 带引号的值:值必须用单引号(')括起来。
    • 单引号内的内容将按原样保留。不会进行转义序列处理、空格折叠或字符解释。
    • 单引号内的换行符将被保留(支持多行值)。
  • 注释:以 # 开头的行将被视为注释并被忽略。单引号内的值中的 # 字符不是注释。

事例:

# comment
DB_ADDRESS='address'

MULTI='line1
line2'

不支持的表单

  • 禁止使用未加引号的值:
    • VAR=value — 不支持。
  • 禁止使用双引号的值:
    • VAR="value" — 不支持。
  • 禁止使用多个相邻的带引号的字符串:
    • VAR='val1''val2' — 不支持。
  • 禁止使用任何形式的插值、扩展或连接:
    • VAR='a'$OTHERVAR=${OTHER} — 不支持。

严格的单引号要求确保 kubelet 在从文件中加载环境变量时,能够按字面意思理解该值。

接下来

最后修改 February 17, 2026 at 11:01 AM PST: [zh-cn]sync define-environment-variable-via-file (5063a6d086)