传统的应用程序在部署时往往需要通过命令行参数、环境变量、配置文件等方式配置应用程序。Kubernetes应用程序可以通过ConfigMap和Secret来配置应用程序。ConfigMap和Secret的区别主要是Secret用于敏感数据配置,数据在Kubernetes中是加密存储的。
选择ConfigMap和Secret的原则比较简单:
非敏感数据则使用ConfigMap配置;
敏感数据使用Secret配置;
如果既有敏感数据又有非敏感数据则使用Secret配置。
ConfigMap和Secret使用方式类似,这里主要描述ConfigMap的使用方式。
这次还是以fortune应用程序为例,通过ConfigMap向fortune传递参数调整程序刷新的时间间隔。首先我看一下不借助ConfigMap我们如何通过命令参数和环境变量配置应用。
1.使用命令参数配置应用
修改fortune镜像,增加间隔参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #! /bin/bash trap "exit" SIGINTINTERVAL=$1 mkdir /var/htdocsmkdir /var/fortuneecho Configured to generate new fortune every $INTERVAL seconds.while :do echo $(date ) writing fortune to /var/htdocs/index.html >> /var/log/fortune/$(date +%Y-%m-%d).log /usr/games/fortune > /var/htdocs/index.html sleep $INTERVAL done
1 2 3 4 5 6 FROM ubuntu:latestRUN apt update ; apt install -y fortune ADD fortuneloop.sh /bin/fortuneloop.sh ENTRYPOINT ["/bin/fortuneloop.sh" ] CMD ["10" ]
重新制作镜像:docker build -t 172.17.0.1:5000/fortune:args .
,并推送本地镜像仓库
1 2 docker run --name fortune-args -it 172.17.0.1:5000/fortune:args 15 Configured to generate new fortune every 15 seconds.
在POD中使用args覆盖容器参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 apiVersion: v1 kind: Pod metadata: name: fortune labels: app: fortune spec: containers: - name: html-gen image: 172.17 .0 .1 :5000/fortune:args args: ["30" ] volumeMounts: - name: html mountPath: /var/htdocs - name: log mountPath: /var/log/fortune - name: web-server image: 172.17 .0 .1 :500/nginx:alpine volumeMounts: - name: html mountPath: /usr/share/nginx/html readOnly: true ports: - containerPort: 80 protocol: TCP - name: log-server image: 172.17 .0 .1 :5000/nginx:log volumeMounts: - name: log mountPath: /usr/share/nginx/log readOnly: true ports: - containerPort: 8080 protocol: TCP volumes: - name: html emptyDir: {} - name: log emptyDir: {}
这样重新创建POD即可看到应用参数更新成"30"秒。
2.使用环境变量配置应用
修改fortune镜像,增加间隔环境变量
修改fortuneloop.sh,使用INTERVAL代替默认值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 #! /bin/bash trap "exit" SIGINTmkdir /var/htdocsmkdir /var/fortuneecho Configured to generate new fortune every $INTERVAL seconds.while :do echo $(date ) writing fortune to /var/htdocs/index.html >> /var/log/fortune/$(date +%Y-%m-%d).log /usr/games/fortune > /var/htdocs/index.html sleep $INTERVAL done
1 2 3 4 5 FROM ubuntu:latestRUN apt update ; apt install -y fortune ADD fortuneloop.sh /bin/fortuneloop.sh ENTRYPOINT ["/bin/fortuneloop.sh" ]
重新制作镜像:docker build -t 172.17.0.1:5000/fortune:env .
,并推送本地镜像仓库
在POD中使用env覆盖容器参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 apiVersion: v1 kind: Pod metadata: name: fortune labels: app: fortune spec: containers: - name: html-gen image: 172.17 .0 .1 :5000/fortune:env env: - name: INTERVAL value: "45" volumeMounts: - name: html mountPath: /var/htdocs - name: log mountPath: /var/log/fortune - name: web-server image: 172.17 .0 .1 :500/nginx:alpine volumeMounts: - name: html mountPath: /usr/share/nginx/html readOnly: true ports: - containerPort: 80 protocol: TCP - name: log-server image: 172.17 .0 .1 :5000/nginx:log volumeMounts: - name: log mountPath: /usr/share/nginx/log readOnly: true ports: - containerPort: 8080 protocol: TCP volumes: - name: html emptyDir: {} - name: log emptyDir: {}
这样重新创建POD即可看到应用参数更新成"45"秒。
上述两种方式,无论时通过args方式还是env方式都是将配置参数硬编码在POD配置文件中。实际应用部署的过程中,我们希望配置参数和POD配置能够解藕,这个就需要用到Kubernetes提供的ConfigMap来实现。