1. CM简介
ConfigMap(Kubernetes简称cm)作为Kubernetes 提供的一种资源,可以将配置信息,跟业务镜像解耦开来,提高业务镜像的移植性。
2. 使用场景
其内部核心数据结构,可以理解为一个key-value 映射。
key 为配置名称,限定为string 类型,有语法约束;value 为配置值,限定为string 类型。参照官方文档,其用法有以下四种:
- 用作环境变量
- 用作镜像CMD参数
- 用作Pod卷挂载
- kubernetes API 调用使用
说明:
1. ConfigMap 对象,须在Pod 启动前创建,才能被Pod引入使用。
2. ConfigMap 对象,需要和业务Pod 在同一个NameSpace,才可以被Pod 引入使用(如果是Pod 内部,使用kubernetes API 调用,则无该限制)。
3. ConfigMap 对象,不适宜存储敏感数据,如数据库密码,访问密钥等。如有安全性要求,请参考Secret 资源。
3. 举例说明
这里,首先在集群develop namespace 下,创建一个cm 对象:cm-001
其主要信息如下:核心数据data, 包含4个配置key:dbhost,dbport,env,redis.conf
代码语言:javascript复制root@VM-128-4-ubuntu:~# kubectl get cm cm-001 -n develop -o yaml
apiVersion: v1
data:
dbhost: 10.2.33.4
dbport: "3306"
env: develop
redis.conf: port 6380
kind: ConfigMap
metadata:
creationTimestamp: "2020-05-17T05:47:13Z"
name: cm-001
namespace: develop
resourceVersion: "1499686372"
selfLink: /api/v1/namespaces/develop/configmaps/cm-001
uid: ab12fc40-ac57-41da-8e42-252a07e864ee
root@VM-128-4-ubuntu:~#
3.1 用作环境变量
创建一个Pod:cm-001-pod
代码语言:javascript复制root@VM-128-4-ubuntu:~# cat redis-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: cm-001-pod
namespace: develop
spec:
containers:
- name: demo
image: redis
env:
- name: env
valueFrom:
configMapKeyRef:
name: cm-001
key: env
root@VM-128-4-ubuntu:~#
root@VM-128-4-ubuntu:~#
root@VM-128-4-ubuntu:~# kubectl get pod -n develop
NAME READY STATUS RESTARTS AGE
cm-001-pod 1/1 Running 0 17s
验证结果如下:环境变量 env=develop ,在pod 内生效:
代码语言:javascript复制root@VM-128-4-ubuntu:~# kubectl exec -it cm-001-pod /bin/bash -n develop
root@cm-001-pod:/data# env
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_SERVICE_PORT=443
env=develop
HOSTNAME=cm-001-pod
*
*
3.2 用作镜像CMD 启动参数
这里,本质上还是先以env环境变量形式,引入到Pod 内部。然后,CMD 启动命令使用环境变量,参考官方例子:
代码语言:javascript复制apiVersion: v1
kind: Pod
metadata:
name: dapi-test-pod
spec:
containers:
- name: test-container
image: k8s.gcr.io/busybox
command: [ "/bin/sh", "-c", "echo $(SPECIAL_LEVEL_KEY) $(SPECIAL_TYPE_KEY)" ]
env:
- name: SPECIAL_LEVEL_KEY
valueFrom:
configMapKeyRef:
name: special-config
key: SPECIAL_LEVEL
- name: SPECIAL_TYPE_KEY
valueFrom:
configMapKeyRef:
name: special-config
key: SPECIAL_TYPE
restartPolicy: Never
3.3 用作Pod 卷挂载
config map 对象,用作Pod 内部卷挂载时,对应的key,会自动生成为同名文件,供业务使用。
代码语言:javascript复制apiVersion: v1
kind: Pod
metadata:
name: cm-001-pod
namespace: develop
spec:
containers:
- name: demo
image: redis
volumeMounts:
- name: config
mountPath: "/tmp/conf"
readOnly: true
volumes:
- name: config
configMap:
name: cm-001
验证挂载结果:
代码语言:javascript复制root@VM-128-4-ubuntu:~# kubectl exec -it cm-001-pod -n develop bash
root@cm-001-pod:/data# ls
root@cm-001-pod:/data# ls /tmp/
conf
root@cm-001-pod:/data# ls /tmp/conf
dbhost dbport env redis.conf
root@cm-001-pod:/data# cat /tmp/conf/redis.conf
port 6380root@cm-001-pod:/data# cat /tmp/conf/dbhost
10.2.33.4root@cm-001-pod:/data#
3.4 kubernetes API 调用
API 调用时,使用的ConfigMap 对象不再局限于当前namespace。这里不再举例。
4. TKE平台使用
结合腾讯云容器服务TKE:
4.1 创建deploy,配置cm 挂载,env 使用
4.2 运行效果
环境变量,配置文件挂载均生效。
5. 参考文档
https://kubernetes.io/docs/concepts/configuration/configmap/
https://cloud.tencent.com/document/product/457/31717