Kubernetes ConfigMap / Secret

本文将介绍 Kubernetes 中的 ConfigMap / Secret。

一、什么是 ConfigMap / Secret?

应用往往无法直接运行,而是需要配置文件做各种配置,我们容易想到的配置文件处理方式是:

  • 在编写 Dockerfile 时,将配置文件拷贝到镜像中

    这种做法相当于在镜像中固定了配置文件,灵活性较差

  • 在容器运行时使用 docker cp 或 docker run -v 动态设置配置文件

    这种做法较为麻烦,无法自动化运维

这两个做法都有各自的问题,Kubernetes 提供了 ConfigMap / Secret 作为解决方案,其中:

  • ConfigMap:
    • 针对明文配置
    • 例如服务端口、运行参数、文件路径等
  • Secret:
    • 针对机密配置
    • 例如密码、证书等

二、ConfigMap 的配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
# Kubernetes的KPI版本号
apiVersion: v1
# 元信息,用于标记资源对象
kind: ConfigMap
# 元信息,用于标记资源对象
metadata:
# 名称
name: test-configMap
# 数据,即配置信息
data:
count: '10'
debug: 'on'
path: '/etc/systemd'

三、Secret 的配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
# Kubernetes的KPI版本号
apiVersion: v1
# 资源对象的类型 【Pod、Node、Job、Service等】
kind: Secret
# 元信息,用于标记资源对象
metadata:
# 名称
name: test-secret
# 数据,即配置信息,其中的value通常会使用base64做简单处理
data:
name: cm9vdA== # root
pwd: MTIzNDU2 # 123456
db: bXlzcWw= # mysql

四、ConfigMap / Secret 的使用

1. 环境变量

可以在配置 Pod 时,可以通过 pod.spec.containers.env.valueFrom 关联单个 KV,也可以通过 envFrom 一次性关联整个 ConfigMap / Secret。

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
42
43
44
# Kubernetes的KPI版本号
apiVersion: v1
# 资源对象的类型 【Pod、Node、Job、Service等】
kind: Pod
# 元信息,用于标记资源对象
metadata:
# 名称
name: test-pod
# 标签,方便归类与识别
labels:
owner: chrono
env: demo
region: north
tier: back
# 说明,描述资源对象的目标状态
spec:
# 容器数组数组
containers:
# 容器名
- name: busy
···
# 环境变量
env:
- name: debug
valueFrom:
configMapKeyRef:
name: test-configMap
key: debug
- name: pwd
valueFrom:
secretKeyRef:
name: test-secret
key: pwd
# 关联外部环境变量
envFrom:
- configMapRef:
name: test-configMap
# 增加前缀
prefix: 'test-configMap-'
- secretRef:
name: test-secret
# 增加前缀
prefix: 'test-secret-'
···

2. Volume

可以将 ConfigMap / Secret 作为存储卷挂载。

通过 Volumes 将配置文件挂载在 Pod 中,再通过 volumeMounts 将 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
# Kubernetes的KPI版本号
apiVersion: v1
# 资源对象的类型 【Pod、Node、Job、Service等】
kind: Pod
# 元信息,用于标记资源对象
metadata:
# 名称
name: test-pod
# 标签,方便归类与识别
labels:
owner: chrono
env: demo
region: north
tier: back
# 说明,描述资源对象的目标状态
spec:
# 存储卷数组
volumes:
- name: my-configMap
configMap:
name: test-configMap
- name: my-secret
secret:
secretName: test-secret
# 容器数组
containers:
# 容器名
- name: busy
# 存储卷挂载
- volumeMounts: /tmp
name: my-configMap

参考

  • Kubernetes
  • Kubernetes 入门实战课
  • 深入剖析 Kubernetes