Kubernetes使用ConfigMap配置应用程序(一)

传统的应用程序在部署时往往需要通过命令行参数、环境变量、配置文件等方式配置应用程序。Kubernetes应用程序可以通过ConfigMap和Secret来配置应用程序。ConfigMap和Secret的区别主要是Secret用于敏感数据配置,数据在Kubernetes中是加密存储的。

选择ConfigMap和Secret的原则比较简单:

  • 非敏感数据则使用ConfigMap配置;
  • 敏感数据使用Secret配置;
  • 如果既有敏感数据又有非敏感数据则使用Secret配置。

ConfigMap和Secret使用方式类似,这里主要描述ConfigMap的使用方式。

这次还是以fortune应用程序为例,通过ConfigMap向fortune传递参数调整程序刷新的时间间隔。首先我看一下不借助ConfigMap我们如何通过命令参数和环境变量配置应用。

1.使用命令参数配置应用

修改fortune镜像,增加间隔参数

  • 修改fortuneloop.sh,增加间隔参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#! /bin/bash
trap "exit" SIGINT
INTERVAL=$1

mkdir /var/htdocs
mkdir /var/fortune

echo 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
  • 修改Dockerfile增加默认参数
1
2
3
4
5
6
FROM ubuntu:latest
RUN 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覆盖容器参数

  • 修改POD配置文件
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" SIGINT
mkdir /var/htdocs
mkdir /var/fortune

echo 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
  • 修改Dockerfile增加默认参数
1
2
3
4
5
FROM ubuntu:latest
RUN 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覆盖容器参数

  • 修改POD配置文件
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来实现。

Kubernetes使用ConfigMap配置应用程序(一)

http://mixiang.tech/2020/09/28/2020-09-28-22/

作者

Mixion

发布于

2020-09-28

更新于

2022-12-02

许可协议