使用 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 卷中指定的文件中获取环境变量,
并将这些环境变量暴露给容器。
说明:
所有类型的容器(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 文件格式是符合 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'$OTHER或VAR=${OTHER}— 不支持。
严格的单引号要求确保 kubelet 在从文件中加载环境变量时,能够按字面意思理解该值。
接下来
- 进一步学习环境变量。
- 阅读为容器定义环境变量。
- 阅读通过环境变量向容器暴露 Pod 信息。