Kubernetes之ConfigMap

  • 2020 年 3 月 27 日
  • 筆記

1、何为configMap

kubernetes中提供了一个叫configMap的概念,为的就是让镜像和配置文件之间解耦,不需要在镜像中打包配置文件,实现了镜像的灵活性,因为一个configMap就是一系列配置信息的集合,将来是可以直接注入到Pod中的容器供其使用。

2、创建configMap

你可以通过使用kubectl create configmap或者yaml方式来创建configMap。

2.1、通过–from-literal创建

命令格式:

$ kubectl create configmap NAME [--from-file=[key=]source] [--from-literal=key1=value1]  

示例:

1.创建命令

$ kubectl create configmap test-config --from-literal=Username=root --from-literal=Password=123456  

2.结果如下data内容:

[root@hdss7-21 ~]# kubectl get configmap test-config -o yaml  apiVersion: v1  data:    Password: "123456"    Username: root  kind: ConfigMap  metadata:    creationTimestamp: "2020-03-27T12:25:59Z"    name: test-config    namespace: default    resourceVersion: "98418"    selfLink: /api/v1/namespaces/default/configmaps/test-config    uid: 7ce2d3dd-6b0d-4fa2-bb09-0a353a3a137a  

2.2、通过文件创建

我们可以指定文件创建configmap,系统会自动将文件的内容写入到configmap的data字段里。

命令格式:

$ kubectl create configmap NAME [--from-file=[key=]source]  

示例:

1.db.properties文件内容

db.user = root  db.pwd  = 123456  db.host = 10.4.7.11  db.port = 3306  db.lib  = devops  

2.创建命令

$ kubectl create configmap db-config --from-file=./db.properties  

–from-file 可以有多个

3.结果如下data内容:

[root@hdss7-21 ~]# kubectl get configmap db-config -o yaml  apiVersion: v1  data:    db.properties: |      db.user = root      db.pwd  = 123456      db.host = 10.4.7.11      db.port = 3306      db.lib  = devops  kind: ConfigMap  metadata:    creationTimestamp: "2020-03-27T12:33:57Z"    name: db-config    namespace: default    resourceVersion: "99103"    selfLink: /api/v1/namespaces/default/configmaps/db-config    uid: a3b76fd8-bf2d-483b-a455-eb4fb48450cb  

注意:我们可以看到指定文件创建时ConfigMap会创建一个key/value键值对,key是文件名,value是文件内容。

如果我们不想configmap中的key为默认的文件名,还可以在创建时自己指定key名字:

$ kubectl create configmap db-config --from-file=<key-name>=<path-to-file>  

2.3、通过目录创建

我们可以指定目录创建configmap,系统会自动将指定目录下的所有文件的内容写入到configmap的data字段里。

命令格式:

$ kubectl create configmap NAME [--from-file=[key=]source]  

示例:

1.查看文件内容

[root@hdss7-21 ~]# echo "123" >config/a.ini  [root@hdss7-21 ~]# echo "456" >config/b.ini  

2.创建命令

$ kubectl create configmap ab-config --from-file=./config  

–from-file 可以有多个。

3.结果如下data内容:

[root@hdss7-21 ~]# kubectl get configmap ab-config -o yaml  apiVersion: v1  data:    a.ini: |      123    b.ini: |      456  kind: ConfigMap  metadata:    creationTimestamp: "2020-03-27T12:45:15Z"    name: ab-config    namespace: default    resourceVersion: "100073"    selfLink: /api/v1/namespaces/default/configmaps/ab-config    uid: 0988dda0-c8b5-4944-ad16-cffba1d41bb3  

注意:我们可以看到指定目录创建时ConfigMap内容中的各个文件会创建一个key/value键值对,key是文件名,value是文件内容。

指定目录时只会识别该目录下的文件,而忽略子目录。

2.4、yaml文件创建

1.创建cache-db-config.yaml文件

apiVersion: v1  kind: ConfigMap  metadata:    name: cache-db-config    namespace: default  data:    redis.cnf: |      redis.db = 3      redis.host = 127.0.0.1      redis.user = admin      redis.pwd  = admin123      redis.port = 2379    mysql.cnf: |      mysql.db = devops      mysql.host = 127.0.0.1      mysql.user = root      mysql.pwd  = root123      mysql.port = 3306  

2.应用yaml

$ kubectl apply -f cache-db-config.yaml  

3、使用ConfigMap

那么前面介绍如何创建ConfigMap,但是怎么使用尼?下面讲解

使用ConfigMap三种方式:

  • 第一种是通过环境变量的方式,直接传递给pod
    • 使用configmap中指定的key
    • 使用configmap中所有的key
  • 第二种是通过在pod的命令行下运行的方式(启动命令中)
  • 第三种是作为volume的方式挂载到pod内

3.1、valueFrom方式

apiVersion: apps/v1  kind: Deployment  metadata:    name: nginx  spec:    selector:      matchLabels:        app: nginx    replicas: 1    template:      metadata:        labels:          app: nginx      spec:        containers:        - name: nginx          image: nginx:1.11          ports:          - containerPort: 80          env:          - name: User  # pod容器中的环境变量名字            valueFrom:              configMapKeyRef:                name: test-config       # configmap的名字                key: Username           # configmap中定义的key          - name: Pwd            valueFrom:              configMapKeyRef:                name: test-config                key: Password  

验证:

[root@hdss7-21 ~]# kubectl exec nginx-7cd5cbd997-zv6f4  printenv | egrep "User|Pwd"  User=root  Pwd=123456  

3.2、挂载方式

apiVersion: apps/v1  kind: Deployment  metadata:    name: nginx  spec:    selector:      matchLabels:        app: nginx    replicas: 1    template:      metadata:        labels:          app: nginx      spec:        containers:        - name: nginx          image: nginx:1.11          ports:          - containerPort: 80          volumeMounts:          - name: ab            mountPath: /etc/nginx/conf.d/            readOnly: true        volumes:        - name: ab          configMap:        # 存储卷类型            name: ab-config  

验证:

[root@hdss7-21 ~]# kubectl exec nginx-574c65d5b4-57j2p cat /etc/nginx/conf.d/a.ini  123  [root@hdss7-21 ~]# kubectl exec nginx-574c65d5b4-57j2p cat /etc/nginx/conf.d/b.ini  456