不少狀況下咱們爲某一應用作好鏡像,當咱們想修改其中的一些參數的時候,就變得比較麻煩,又要從新制做鏡像,咱們是否是有一種方式,讓鏡像根據不一樣的場景調用咱們不一樣的配置文件呢,那咱們就須要用到 k8s 的另一種資源,那就是 ConfigMap。mysql
咱們知道,在幾乎全部的應用開發中,都會涉及到配置文件的變動,好比說在web的程序中,須要鏈接數據庫,緩存甚至是隊列等等。而咱們的一個應用程序從寫第一行代碼開始,要經歷開發環境、測試環境、預發佈環境只到最終的線上環境。而每個環境都要定義其獨立的各類配置。若是咱們不能很好的管理這些配置文件,你的運維工做將頓時變的無比的繁瑣。爲此業內的一些大公司專門開發了本身的一套配置管理中心,如360的Qcon,百度的disconf等。kubernetes也提供了本身的一套方案,即ConfigMap。kubernetes經過ConfigMap來實現對容器中應用的配置管理。linux
ConfigMap是用來存儲配置文件的kubernetes資源對象,全部的配置內容都存儲在etcd中。web
建立ConfigMap的方式有4種:sql
--from-literal
;--from-file=<文件>
;--from-env-file=<文件>
;kubectl create -f
建立。kubectl create configmap test-config1 --from-literal=db.host=172.18.8.200 --from-literal=db.port='3306'
查看配置的內容。數據庫
[root@master ~]# kubectl get cm test-config1 -o yaml apiVersion: v1 data: db.host: 172.18.8.200 db.port: "3306" kind: ConfigMap metadata: creationTimestamp: "2018-12-16T04:32:42Z" name: test-config1 namespace: default resourceVersion: "3676" selfLink: /api/v1/namespaces/default/configmaps/test-config1 uid: a0ee762b-00eb-11e9-9fa7-000c291fb1b3
echo -n 172.18.8.200 > ./db.host echo -n 3306 > ./db.port kubectl create cm test-config2 --from-file=./db.host --from-file=./db.port
查看配置內容:api
[root@master ~]# kubectl get cm test-config2 -o yaml apiVersion: v1 data: db.host: 172.18.8.200 db.port: "3306" kind: ConfigMap metadata: creationTimestamp: "2018-12-16T04:37:50Z" name: test-config2 namespace: default resourceVersion: "4107" selfLink: /api/v1/namespaces/default/configmaps/test-config2 uid: 583ed4e7-00ec-11e9-9fa7-000c291fb1b3
每一個文件內容對應一個信息條目。緩存
cat << EOF > env.txt db.host=172.18.8.200 db.port=3306 EOF kubectl create cm test-config3 --from-env-file=env.txt
查看配置內容:app
[root@master ~]# kubectl get cm test-config3 -o yaml apiVersion: v1 data: db.host: 172.18.8.200 db.port: "3306" kind: ConfigMap metadata: creationTimestamp: "2018-12-16T04:43:02Z" name: test-config3 namespace: default resourceVersion: "4544" selfLink: /api/v1/namespaces/default/configmaps/test-config3 uid: 12746e5f-00ed-11e9-9fa7-000c291fb1b3
配置文件內容以下。運維
apiVersion: v1 kind: ConfigMap metadata: name: test-config4 data: db.host: 172.18.8.200 db.port: "3306"
建立並查看其內容。socket
[root@master ~]# kubectl apply -f db.yaml configmap/test-config4 created [root@master ~]# kubectl get cm test-config4 -o yaml apiVersion: v1 data: db.host: 172.18.8.200 db.port: "3306" kind: ConfigMap metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"v1","data":{"db.host":"172.18.8.200","db.port":"3306"},"kind":"ConfigMap","metadata":{"annotations":{},"name":"test-config4","namespace":"default"}} creationTimestamp: "2018-12-16T04:49:01Z" name: test-config4 namespace: default resourceVersion: "5045" selfLink: /api/v1/namespaces/default/configmaps/test-config4 uid: e87cdafa-00ed-11e9-9fa7-000c291fb1b3
使用ConfigMap有二種方式:
使用valueFrom
、configMapKeyRef
、name
、key
指定要用的key。
apiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - name: mypod image: busybox args: [ "/bin/sh", "-c", "sleep 3000" ] env: - name: DB_HOST valueFrom: configMapKeyRef: name: test-config4 key: db.host - name: DB_PORT valueFrom: configMapKeyRef: name: test-config4 key: db.port
還能夠經過envFrom
、configMapRef
、name
使得configmap中的全部key/value對都自動變成環境變量。
apiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - name: mypod image: busybox args: [ "/bin/sh", "-c", "sleep 3000" ] envFrom: - configMapRef: name: test-config3
把test-config4
全部key/value掛載進來:
apiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - name: mypod image: busybox args: [ "/bin/sh", "-c", "sleep 3000" ] volumeMounts: - name: db mountPath: "/etc/db" readOnly: true volumes: - name: db configMap: name: test-config4
進入容器查看,看到在db文件夾下以每個key爲文件名value爲值建立了多個文件。
[root@master ~]# kubectl exec -it mypod -- /bin/sh / # cd /etc/db /etc/db # ls -al total 0 drwxrwxrwx 3 root root 89 Dec 16 05:23 . drwxr-xr-x 1 root root 16 Dec 16 05:23 .. drwxr-xr-x 2 root root 36 Dec 16 05:23 ..2018_12_16_05_23_04.654058863 lrwxrwxrwx 1 root root 31 Dec 16 05:23 ..data -> ..2018_12_16_05_23_04.654058863 lrwxrwxrwx 1 root root 14 Dec 16 05:23 db.host -> ..data/db.host lrwxrwxrwx 1 root root 14 Dec 16 05:23 db.port -> ..data/db.port /etc/db # cat db.host 172.18.8.200/etc/db #
使用該 ConfigMap 掛載的 Env 不會同步更新;
使用該 ConfigMap 掛載的 Volume 中的數據須要一段時間(實測大概10秒)才能同步更新。
大多數狀況下,配置信息都以文件形式提供,因此在建立 ConfigMap 時一般採用 --from-file 或 YAML 方式,讀取 ConfigMap 時一般採用 Volume 方式。
好比咱們的 MySQL 配置文件/etc/my.cnf
。
[mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock symbolic-links=0 [mysqld_safe] log-error=/var/log/mariadb/mariadb.log pid-file=/var/run/mariadb/mariadb.pid !includedir /etc/my.cnf.d
建立CongifMap。
kubectl create cm mysql-cm --from-file=/etc/my.cnf
查看建立好的cm。
[root@master ~]# kubectl get cm mysql-cm -o yaml apiVersion: v1 data: my.cnf: | [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock symbolic-links=0 [mysqld_safe] log-error=/var/log/mariadb/mariadb.log pid-file=/var/run/mariadb/mariadb.pid !includedir /etc/my.cnf.d kind: ConfigMap metadata: creationTimestamp: "2018-12-16T05:38:29Z" name: mysql-cm namespace: default resourceVersion: "9273" selfLink: /api/v1/namespaces/default/configmaps/mysql-cm uid: d1201233-00f4-11e9-9fa7-000c291fb1b3
在 Pod 中使用此 ConfigMap,配置文件爲:
apiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - name: mypod image: busybox args: [ "/bin/sh", "-c", "sleep 3000" ] volumeMounts: - name: mysql mountPath: "/tmp" volumes: - name: mysql configMap: name: mysql-cm items: - key: my.cnf path: mysql/my.cnf
建立 Pod 並讀取配置信息:
[root@master ~]# kubectl exec -it mypod sh / # cat /tmp/mysql/my.cnf [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock symbolic-links=0 [mysqld_safe] log-error=/var/log/mariadb/mariadb.log pid-file=/var/run/mariadb/mariadb.pid !includedir /etc/my.cnf.d / # exit
關於掛在路徑你們能夠自行進行修改。