使用 Init 容器定义环境变量值
Kubernetes v1.34 [alpha](disabled by default)本页展示如何通过文件为 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 卷中指定的文件中获取环境变量,并将这些环境变量暴露给容器。
说明:
所有类型的容器(initContainers、普通容器、边车容器和临时容器)都支持从文件加载环境变量。
虽然这些环境变量可以存储敏感信息,但 emptyDir 卷并不提供与专用 Secret 对象相同的保护机制。
因此,通过此特性向容器暴露机密环境变量不被视为安全最佳实践。
创建 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 文件格式源自 .env 文件。
在 Shell 环境中,.env 文件通常使用 source .env 命令加载。
对于 Kubernetes,定义的 Env 文件格式遵循更严格的语法规则:
-
空行:空行会被忽略。
-
行首空格:所有行的行首空格会被忽略。
-
变量声明:变量必须声明为
VAR=VAL。=两侧的空格和行尾空格会被忽略。VAR=VAL → VAL
-
注释:以 # 开头的行被视为注释并忽略。
# 注释 VAR=VAL → VAL VAR=VAL # 不是注释 → VAL # 不是注释
-
换行续行:在变量声明行末使用反斜杠 (
\) 表示值在下一行继续。行与行之间用单个空格连接。VAR=VAL \ VAL2 → VAL VAL2
接下来
- 进一步学习环境变量。
- 阅读为容器定义环境变量。
- 阅读通过环境变量向容器暴露 Pod 信息。