使用 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` 卷中指定的文件中检索环境变量,并将其暴露给容器。
注意
所有容器类型(initContainer、常规容器、sidecar 容器和临时容器)都支持从文件加载环境变量。
虽然这些环境变量可以存储敏感信息,但 `emptyDir` 卷无法提供与专用 Secret 对象相同的保护机制。因此,通过此功能将机密环境变量暴露给容器不被视为安全最佳实践。
创建 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
下一步
- 了解更多关于环境变量的信息。
- 阅读 为容器定义环境变量
- 阅读 通过环境变量向容器公开 Pod 信息