CKA [Storage] – ConfigMaps讲解

无需hardcoded 数据库的密码写在代码当中,如果把数据库密码写在代码当中,每次需要改数据库密码的时候都需要rebuild image, 这非常麻烦,而且把数据库密码写入代码当中也不方便做安全的管理。
所以这种情况下就需要使用ConfigMap来存储数据库密码,那么需要改数据库密码的时候就直接可以改ConfigMap了,无需重新build过image。
技术上数据库密码是能够存入ConfigMap的,但是不推荐把机密凭证存入ConfigMap当中。ConfigMap只是用于存储普通的环境变量。
🔒 为什么不要把密码放在 ConfigMap?
- ConfigMap 的内容可以被所有有读取权限的人看到。
- 无法启用 KMS 加密存储(默认是明文存在 etcd 中)。
- 安全审计也推荐将敏感信息使用 Secret 管理,方便设置 RBAC 权限控制。
实践创建ConfigMap
1. 创建ConfigMap
【使用from-literal的方式】
【可以在尾部添加这个 --dry-run=client -o yaml 来输出yaml】
kubectl create configmap test --from-literal=dbname=test --from-literal=dbuser=testuser
可以添加 | 符号来达到multiline的功能,这个就必须edit yaml来操作了

以下是添加configmap的其他方式,如果你的configmap很多参数,输入命令行也不方便,那么就能够使用–from-file的方式来读取,这个file是key value的结构
【举例 config.txt】
dbname=testdb
username=testuser

2. 创建好了test configmap之后,我们就需要创建Pod来读取configmap

有2中方式来注入configmap
- VolumeMounts 就是把configmap 装换成文件然后注入到pod当中
- EnviromentVariables就是把configmap注入pod内的环境变量当中


【方法1:使用VolumeMount】
kubectl apply -f pod1.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod1
spec:
containers:
- name: nginx-container
image: nginx
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: test
【方法2:使用EnvironmentVariable】
kubectl apply -f pod2.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod2
spec:
containers:
- name: nginx-container
image: nginx
envFrom:
- configMapRef:
name: test
3. pod1和pod2都创建好之后我们就进入pod内检查
【方法1:使用VolumeMount】
kubectl exec -it pod1 -c nginx-container -- sh

【方法2:使用EnvironmentVariable】
kubectl exec -it pod2 -c nginx-container -- sh

4. 最后我们做个实验区更改原本的configmap
【1.输入这个命令】
kubectl edit configmap test
【2. 进入到vim editor】
在vim editor 点击键盘的 i 按键
【3. 进行key value的更改】
【4. 退出vim edit mode】
点击键盘的ECS键
【5. 保存并退出,输入键盘】
:wq
5. 执行回part 3的步骤去检查pod1和pod2是否都有同步更改已经被二次更改的configmap value
结果:
- VolumeMount 是能够同步ConfigMap所更改的value的
- EnvironmentVariable 是不会同步ConfigMap所更改的value,因为EnvironmentVariable的注入是在Pod一开始被创建的时候就注入了无法进行二次更改,如果想要更改最新的EnvironmentVariable的话,那么就只好重建Pod
![]()
Facebook评论