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

Loading

Facebook评论