腾讯云TKE使用之ConfigMap挂载

2020-05-17 16:29:41 浏览数 (1)

1. CM简介

ConfigMap(Kubernetes简称cm)作为Kubernetes 提供的一种资源,可以将配置信息,跟业务镜像解耦开来,提高业务镜像的移植性。

2. 使用场景

其内部核心数据结构,可以理解为一个key-value 映射。

key 为配置名称,限定为string 类型,有语法约束;value 为配置值,限定为string 类型。参照官方文档,其用法有以下四种:

  1. 用作环境变量
  2. 用作镜像CMD参数
  3. 用作Pod卷挂载
  4. 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 使用

添加数据卷 使用全部key添加数据卷 使用全部key
配置挂载点 环境变量配置挂载点 环境变量

4.2 运行效果

环境变量,配置文件挂载均生效。

env volume挂载效果env volume挂载效果

5. 参考文档

https://kubernetes.io/docs/concepts/configuration/configmap/

https://cloud.tencent.com/document/product/457/31717

0 人点赞