Kubernetes允许为pod中的每一个容器都指定自定义的环境变量列表,如图7.1所示。(即环境变量是隔离的?)
注意:与容器的命令和参数设置相同,环境变量列表无法在pod创建后被修改。
使fortune镜像中的INTERVAL参数可通过环境变量配置
#然后重新构建镜像,并推送到镜像仓库。
mkdir -p /root/Dockerfile/fortune-env
cd /root/Dockerfile/fortune-env
cat >fortuneloop.sh <<'EOF'
#!/bin/bash
trap "exit" SIGINT
echo Configured to generate new fortune every $INTERVAL seconds
mkdir -p /var/htdocs
while :
do
echo $(date) Writing fortune to /var/htdocs/index.html
/usr/games/fortune > /var/htdocs/index.html
sleep $INTERVAL
done
EOF
chmod +x fortuneloop.sh
cat >Dockerfile <<'EOF'
FROM ubuntu:latest
RUN apt-get update ; apt-get -y install fortune
ADD fortuneloop.sh /bin/fortuneloop.sh
ENTRYPOINT ["/bin/fortuneloop.sh"]
CMD ["10"]
EOF
docker build -t 10.0.0.10:5000/luksa/fortune:env .
docker push 10.0.0.10:5000/luksa/fortune:env
7.3.1 在容器定义文件中指定环境变量
环境变量是被设置在容器定义中的,并非是pod级别。
注意:不要忘记在每个容器中,Kubernetes会在相同命名空间下自动为每个service暴露对应的环境变量。这些环境变量基本上可以被看作自动注入的配置。
cd /root/k8s/
cat >fortune-pod-env.yaml <<'EOF'
apiVersion: v1
kind: Pod
metadata:
name: fortune-env
spec:
containers:
- image: 10.0.0.10:5000/luksa/fortune:env
env:
- name: INTERVAL
value: "30"
name: html-generator
volumeMounts:
- name: html
mountPath: /var/htdocs
- image: 10.0.0.10:5000/luksa/nginx
name: web-server
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
readOnly: true
ports:
- containerPort: 80
protocol: TCP
volumes:
- name: html
emptyDir: {}
EOF
kubectl create -f fortune-pod-env.yaml
#检查实验结果(方法一)
kubectl port-forward fortune-env 8080:80
#另开一个终端
curl localhost:8080
#检查实验结果(方法二)
kubectl logs fortune-env -c html-generator
7.3.2 在环境变量值中引用其他环境变量
可以采用 $(VAR) 语法在环境变量中引用其他的环境变量。假设定义了两个环境变量,第二个变量定义中可包含第一个环境变量的值。
变量SECOND_VAR 的值是 “foobar” 。
7.3.3了解硬编码环境变量的不足之处
让变量值硬编码在pod定义中,意味着你需要区分生产与开发环境的pod定义。为了能在多个环境下复用pod的定义,需要将配置从pod描述文件(descriptor)中解耦出来。幸运的是,你可通过使用ConfigMap资源完成解耦,用valueFrom字段代替value字段来使ConfigMap成为环境变量值的来源。