Kubernetes资源对象ConfigMap

------ ## 一:ConfigMap ​ 用来存储配置文件的kubernetes资源对象,所有的配置内容都存储在etcd中;ConfigMap与 Secret 类似 #### 1.ConfigMap与 Secret 的区别 ​ ConfigMap 保存的是不需要加密的、应用所需的配置信息 ​ ConfigMap 的用法几乎与 Secret 完全相同:可以使用 kubectl create configmap 从文件或者目录创建 ConfigMap,也可以直接编写 ConfigMap 对象的 YAML 文件 #### 2.创建ConfigMap ​ 方式1:通过直接在命令行中指定configmap参数创建,即--from-literal ​ 方式2:通过指定文件创建,即将一个配置文件创建为一个ConfigMap--from-file=<文件> ​ 方式3:通过指定目录创建,即将一个目录下的所有配置文件创建为一个ConfigMap,--from-file=<目录> ​ 方式4:事先写好标准的configmap的yaml文件,然后kubectl create -f 创建 通过命令行参数--from-literal创建: ​ 创建命令 ```shell [root@master yaml]# kubectl create configmap test-config1 --from-literal=db.host=10.5.10.116 --from-literal=db.port='3306' configmap/test-config1 created ``` ​ 结果如下面的data内容所示 ```shell [root@master yaml]# kubectl get configmap test-config1 -o yaml apiVersion: v1 data: db.host: 10.5.10.116 db.port: "3306" kind: ConfigMap metadata: creationTimestamp: "2019-02-14T08:22:34Z" name: test-config1 namespace: default resourceVersion: "7587" selfLink: /api/v1/namespaces/default/configmaps/test-config1 uid: adfff64c-3031-11e9-abbe-000c290a5b8b ``` 通过指定文件创建: ​ 编辑配置文件app.properties内容如下 ```shell [root@master yaml]# cat app.properties property.1 = value-1 property.2 = value-2 property.3 = value-3 property.4 = value-4 [mysqld] !include /home/wing/mysql/etc/mysqld.cnf port = 3306 socket = /home/wing/mysql/tmp/mysql.sock pid-file = /wing/mysql/mysql/var/mysql.pid basedir = /home/mysql/mysql datadir = /wing/mysql/mysql/var ``` ​ 创建(可以有多个--from-file) ```shell [root@master yaml]# kubectl create configmap test-config2 --from-file=./app.properties ``` ​ 结果如下面data内容所示 ```shell [root@master yaml]# kubectl get configmap test-config2 -o yaml apiVersion: v1 data: app.properties: | property.1 = value-1 property.2 = value-2 property.3 = value-3 property.4 = value-4 [mysqld] !include /home/wing/mysql/etc/mysqld.cnf port = 3306 socket = /home/wing/mysql/tmp/mysql.sock pid-file = /wing/mysql/mysql/var/mysql.pid basedir = /home/mysql/mysql datadir = /wing/mysql/mysql/var kind: ConfigMap metadata: creationTimestamp: "2019-02-14T08:29:33Z" name: test-config2 namespace: default resourceVersion: "8176" selfLink: /api/v1/namespaces/default/configmaps/test-config2 uid: a8237769-3032-11e9-abbe-000c290a5b8b ``` ​ 通过指定文件创建时,configmap会创建一个key/value对,key是文件名,value是文件内容。如不想configmap中的key为默认的文件名,可以在创建时指定key名字 ```shell [root@master yaml]# kubectl create configmap game-config-3 --from-file== ``` 指定目录创建: ​ configs 目录下的config-1和config-2内容如下所示 ```shell [root@master yaml]# tail configs/config-1 aaa bbb c=d [root@master yaml]# tail configs/config-2 eee fff h=k ``` ​ 创建 ```shell [root@master yaml]# kubectl create configmap test-config3 --from-file=./configs ``` ​ 结果下面data内容所示 ```shell [root@master yaml]# kubectl get configmap test-config3 -o yaml apiVersion: v1 data: config-1: | aaa bbb c=d config-2: | eee fff h=k kind: ConfigMap metadata: creationTimestamp: "2019-02-14T08:37:05Z" name: test-config3 namespace: default resourceVersion: "8808" selfLink: /api/v1/namespaces/default/configmaps/test-config3 uid: b55ffbeb-3033-11e9-abbe-000c290a5b8b ``` ​ 指定目录创建时,configmap内容中的各个文件会创建一个key/value对,key是文件名,value是文件内容,忽略子目录 通过事先写好configmap的标准yaml文件创建: ​ yaml文件内容如下: 注意其中一个key的value有多行内容时的写法 ```shell [root@master yaml]# cat configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: test-config4 namespace: default data: cache_host: memcached-gcxt cache_port: "11211" cache_prefix: gcxt my.cnf: | [mysqld] log-bin = mysql-bin haha = hehe ``` ​ 创建 ```shell [root@master yaml]# kubectl apply -f configmap.yaml configmap/test-config4 created ``` ​ 结果如下面data内容所示 ```shell [root@master yaml]# kubectl get configmap test-config4 -o yaml apiVersion: v1 data: cache_host: memcached-gcxt cache_port: "11211" cache_prefix: gcxt my.cnf: | [mysqld] log-bin = mysql-bin haha = hehe kind: ConfigMap metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"v1","data":{"cache_host":"memcached-gcxt","cache_port":"11211","cache_prefix":"gcxt","my.cnf":"[mysqld]\nlog-bin = mysql-bin\nhaha = hehe\n"},"kind":"ConfigMap","metadata":{"annotations":{},"name":"test-config4","namespace":"default"}} creationTimestamp: "2019-02-14T08:46:57Z" name: test-config4 namespace: default resourceVersion: "9639" selfLink: /api/v1/namespaces/default/configmaps/test-config4 uid: 163fbe1e-3035-11e9-abbe-000c290a5b8b ``` ​ 查看configmap的详细信息 ```shell [root@master yaml]# kubectl describe configmap ``` #### 3.使用ConfigMap ​ 通过环境变量的方式,直接传递pod ​ 通过在pod的命令行下运行的方式 ​ 使用volume的方式挂载入到pod内 示例ConfigMap文件: ```shell apiVersion: v1 kind: ConfigMap metadata: name: special-config namespace: default data: special.how: very special.type: charm ``` 通过环境变量使用: ​ 使用valueFrom、configMapKeyRef、name、key指定要用的key ```shell [root@master yaml]# cat testpod.yaml apiVersion: v1 kind: Pod metadata: name: dapi-test-pod spec: containers: - name: test-container image: daocloud.io/library/nginx env: - name: SPECIAL_LEVEL_KEY //这里是容器里设置的新变量的名字 valueFrom: configMapKeyRef: name: special-config //这里是来源于哪个configMap key: special.how //configMap里的key - name: SPECIAL_TYPE_KEY valueFrom: configMapKeyRef: name: special-config key: special.type restartPolicy: Never ``` ​ 测试 ```shell [root@master yaml]# kubectl exec -it dapi-test-pod /bin/bash root@dapi-test-pod:/# echo $SPECIAL_TYPE_KEY charm ``` ​ 通过envFrom、configMapRef、name使得configmap中的所有key/value对都自动变成环境变量 ```shell apiVersion: v1 kind: Pod metadata: name: dapi-test-pod spec: containers: - name: test-container image: daocloud.io/library/nginx envFrom: - configMapRef: name: special-config restartPolicy: Never ``` ​ 这样容器里的变量名称直接使用configMap里的key名 ```shell [root@master yaml]# kubectl exec -it dapi-test-pod /bin/bash root@dapi-test-pod:/# env HOSTNAME=dapi-test-pod NJS_VERSION=1.15.8.0.2.7-1~stretch NGINX_VERSION=1.15.8-1~stretch KUBERNETES_PORT_443_TCP_PROTO=tcp KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1 KUBERNETES_PORT=tcp://10.96.0.1:443 PWD=/ special.how=very HOME=/root KUBERNETES_SERVICE_PORT_HTTPS=443 KUBERNETES_PORT_443_TCP_PORT=443 KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443 TERM=xterm SHLVL=1 KUBERNETES_SERVICE_PORT=443 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin special.type=charm KUBERNETES_SERVICE_HOST=10.96.0.1 ``` 作为volume挂载使用: ```shell apiVersion: apps/v1 kind: Deployment metadata: name: nginx-configmap spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx-configmap image: daocloud.io/library/nginx:latest ports: - containerPort: 80 volumeMounts: - name: config-volume3 mountPath: /tmp/config3 volumes: - name: config-volume3 configMap: name: test-config-3 ``` ​ 进入容器中/tmp/config4查看 ```shell [root@master yaml]# kubectl exec -it nginx-configmap-7447bf77d6-svj2t /bin/bash root@nginx-configmap-7447bf77d6-svj2t:/# ls /tmp/config4/ cache_host cache_port cache_prefix my.cnf root@nginx-configmap-7447bf77d6-svj2t:/# cat /tmp/config4/cache_host memcached-gcxt 可以看到,在config4文件夹下以每一个key为文件名value为值创建了多个文件。 ``` ​ 假如不想以key名作为配置文件名可以引入items 字段,在其中逐个指定要用相对路径path替换的key: ```shell volumes: - name: config-volume4 configMap: name: test-config4 items: - key: my.cnf //原来的key名 path: mysql-key - key: cache_host //原来的key名 path: cache-host ``` 注意: ​ 删除configmap后原pod不受影响;然后再删除pod后,重启的pod的events会报找不到cofigmap的volume ​ pod起来后再通过kubectl edit configmap …修改configmap,过一会pod内部的配置也会刷新 ​ 在容器内部修改挂进去的配置文件后,过一会内容会再次被刷新为原始configmap内容