Kubernetes允许为pod中的每一个容器都指定自定义的环境变量列表,如图7.1所示。(即环境变量是隔离的?)
image.png
注意:与容器的命令和参数设置相同,环境变量列表无法在pod创建后被修改。

使fortune镜像中的INTERVAL参数可通过环境变量配置

image.png
#然后重新构建镜像,并推送到镜像仓库。

  1. mkdir -p /root/Dockerfile/fortune-env
  2. cd /root/Dockerfile/fortune-env
  3. cat >fortuneloop.sh <<'EOF'
  4. #!/bin/bash
  5. trap "exit" SIGINT
  6. echo Configured to generate new fortune every $INTERVAL seconds
  7. mkdir -p /var/htdocs
  8. while :
  9. do
  10. echo $(date) Writing fortune to /var/htdocs/index.html
  11. /usr/games/fortune > /var/htdocs/index.html
  12. sleep $INTERVAL
  13. done
  14. EOF
  15. chmod +x fortuneloop.sh
  16. cat >Dockerfile <<'EOF'
  17. FROM ubuntu:latest
  18. RUN apt-get update ; apt-get -y install fortune
  19. ADD fortuneloop.sh /bin/fortuneloop.sh
  20. ENTRYPOINT ["/bin/fortuneloop.sh"]
  21. CMD ["10"]
  22. EOF
  23. docker build -t 10.0.0.10:5000/luksa/fortune:env .
  24. docker push 10.0.0.10:5000/luksa/fortune:env

7.3.1 在容器定义文件中指定环境变量

image.png
环境变量是被设置在容器定义中的,并非是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) 语法在环境变量中引用其他的环境变量。假设定义了两个环境变量,第二个变量定义中可包含第一个环境变量的值。
image.png
变量SECOND_VAR 的值是 “foobar” 。

7.3.3了解硬编码环境变量的不足之处

让变量值硬编码在pod定义中,意味着你需要区分生产与开发环境的pod定义。为了能在多个环境下复用pod的定义,需要将配置从pod描述文件(descriptor)中解耦出来。幸运的是,你可通过使用ConfigMap资源完成解耦,用valueFrom字段代替value字段来使ConfigMap成为环境变量的来源。