为容器定义环境变量
本页面展示了如何为 Kubernetes Pod 中的容器定义环境变量。
准备工作
你需要拥有一个 Kubernetes 集群,并且 kubectl 命令行工具已配置为与你的集群通信。 建议在至少有两个不充当控制平面主机的节点的集群上运行本教程。 如果你还没有集群,你可以使用 minikube 创建一个,或者使用这些 Kubernetes 游乐场之一:
为容器定义环境变量
当你创建一个 Pod 时,你可以为运行在该 Pod 中的容器设置环境变量。要设置环境变量,请在配置文件中包含 `env` 或 `envFrom` 字段。
`env` 和 `envFrom` 字段具有不同的效果。
env
- 允许你为容器设置环境变量,直接为每个你命名的变量指定一个值。
envFrom
- 允许你通过引用 ConfigMap 或 Secret 为容器设置环境变量。当你使用 `envFrom` 时,所引用的 ConfigMap 或 Secret 中的所有键值对都将设置为容器的环境变量。你还可以指定一个公共前缀字符串。
你可以阅读更多关于 ConfigMap 和 Secret 的信息。
本页面解释了如何使用 `env`。
在本练习中,你将创建一个运行一个容器的 Pod。该 Pod 的配置文件定义了一个名为 `DEMO_GREETING` 且值为 `"Hello from the environment"` 的环境变量。下面是该 Pod 的配置清单:
apiVersion: v1
kind: Pod
metadata:
name: envar-demo
labels:
purpose: demonstrate-envars
spec:
containers:
- name: envar-demo-container
image: gcr.io/google-samples/hello-app:2.0
env:
- name: DEMO_GREETING
value: "Hello from the environment"
- name: DEMO_FAREWELL
value: "Such a sweet sorrow"
根据该清单创建一个 Pod
kubectl apply -f https://k8s.io/examples/pods/inject/envars.yaml
列出正在运行的 Pod
kubectl get pods -l purpose=demonstrate-envars
输出类似于:
NAME READY STATUS RESTARTS AGE envar-demo 1/1 Running 0 9s
列出 Pod 容器的环境变量
kubectl exec envar-demo -- printenv
输出类似于:
NODE_VERSION=4.4.2 EXAMPLE_SERVICE_PORT_8080_TCP_ADDR=10.3.245.237 HOSTNAME=envar-demo ... DEMO_GREETING=Hello from the environment DEMO_FAREWELL=Such a sweet sorrow
注意
使用 `env` 或 `envFrom` 字段设置的环境变量会覆盖容器镜像中指定的任何环境变量。注意
环境变量可以相互引用,但顺序很重要。使用在同一上下文中定义的其他变量的变量必须在列表中靠后。同样,避免循环引用。在你的配置中使用环境变量
你在 Pod 配置中 `.spec.containers[*].env[*]` 下定义的环境变量可以在配置的其他地方使用,例如在为 Pod 容器设置的命令和参数中。在下面的示例配置中,`GREETING`、`HONORIFIC` 和 `NAME` 环境变量分别设置为 `Warm greetings to`、`The Most Honorable` 和 `Kubernetes`。环境变量 `MESSAGE` 组合了所有这些环境变量的集合,然后将其用作传递给 `env-print-demo` 容器的 CLI 参数。
环境变量名称可以由除了“=”之外的任何可打印 ASCII 字符组成。
apiVersion: v1
kind: Pod
metadata:
name: print-greeting
spec:
containers:
- name: env-print-demo
image: bash
env:
- name: GREETING
value: "Warm greetings to"
- name: HONORIFIC
value: "The Most Honorable"
- name: NAME
value: "Kubernetes"
- name: MESSAGE
value: "$(GREETING) $(HONORIFIC) $(NAME)"
command: ["echo"]
args: ["$(MESSAGE)"]
创建后,命令 `echo Warm greetings to The Most Honorable Kubernetes` 将在容器上运行。
下一步
- 了解更多关于环境变量的信息。
- 了解将 Secret 用作环境变量。
- 参见EnvVarSource。