在部署應用程序時,咱們都會涉及到應用的配置,在容器中,如Docker容器中,若是將配置文件打入容器鏡像,這種行爲等同於寫死配置,每次修改完配置,鏡像就得從新構建。固然,咱們也能夠經過掛載包含該文件的捲進行配置管理和修改。而在k8s中,咱們要講一種更好的方式,即ConfigMap,這種資源對象的出現,更是極大的方便了應用程序的配置管理。
ConfigMap是一個或多個key/value的形式保存在k8s中,內部能夠管理變量也能夠管理完整的配置文件內容。shell
spec.env
或者spec.envFrom
進行引用。spec.volumes
引用。在使用命令的時候注意單詞: configmap等價於cm,cm算是簡寫,相似於deployment能夠使用命令時寫成deploy,service能夠寫成svc,namespace能夠寫成ns,pod能夠寫成po。vim
1)yaml文件方式建立
樣例:api
apiVersion: v1 kind: ConfigMap metadata: name: cm-test01 data: appconf01: value01 appconf02: value02
命令:
$ kubectl create -f configmap-test01.yaml
tomcat
2)命令行方式建立bash
--from-file
參數從文件中讀取。能夠指定key的名稱,若不指定,則默認使用文件名爲key。key01:value01 key02:value02 conf01: value03
$ kubectl create cm cm-test-file --from-file=test.properties
app
--from-literal
指定keyxx=valuexx建立confimap中的data內配置屬性。$ kubectl create configmap cm-test-literal --from-literal=key01=value01 --from-literal=key02=value02
1)查看configmap列表
$ kubectl get cm
ui
[root@k8s /cm/test]# kubectl get cm NAME DATA AGE cm-test-file 1 1m cm-test-literal 2 2s cm-test01 2 1h
2)查看configmap詳情
$ kubectl describe cm cm-test01
spa
[root@k8s /cm/test]# kubectl describe cm cm-test01 Name: cm-test01 Namespace: system-pro Labels: <none> Annotations: <none> Data ==== appconf01: ---- value01 appconf02: ---- value02
$ kubectl describe configmap cm-test-file
命令行
[root@k8s /cm/test]# kubectl describe configmap cm-test-file Name: cm-test-file Namespace: system-pro Labels: <none> Annotations: <none> Data ==== test.properties: ---- key01:value01 key02:value02 conf01: value03
$ kubectl describe cm cm-test-literal
rest
[root@k8s /cm/test]# kubectl describe cm cm-test-literal Name: cm-test-literal Namespace: system-pro Labels: <none> Annotations: <none> Data ==== key01: ---- value01 key02: ---- value02
3)查看yaml輸出
$ kubectl get cm cm-test01 -o yaml
[root@k8s /cm/test]# kubectl get cm cm-test01 -o yaml apiVersion: v1 data: appconf01: value01 appconf02: value02 kind: ConfigMap metadata: creationTimestamp: 2020-03-13T13:06:21Z name: cm-test01 namespace: system-pro resourceVersion: "594861" selfLink: /api/v1/namespaces/system-pro/configmaps/cm-test01 uid: 6f5e7efb-652b-11ea-adf9-fa163e4464a5
$ kubectl get configmap cm-test-file -o yaml
[root@k8s /cm/test]# kubectl get configmap cm-test-file -o yaml apiVersion: v1 data: test.properties: | key01:value01 key02:value02 conf01: value03 kind: ConfigMap metadata: creationTimestamp: 2020-03-13T14:29:30Z name: cm-test-file namespace: system-pro resourceVersion: "598548" selfLink: /api/v1/namespaces/system-pro/configmaps/cm-test-file uid: 0d226ad2-6537-11ea-adf9-fa163e4464a5
$ kubectl get cm cm-test-literal -o yaml
[root@k8s /cm/test]# kubectl get cm cm-test-literal -o yaml apiVersion: v1 data: key01: value01 key02: value02 kind: ConfigMap metadata: creationTimestamp: 2020-03-13T14:30:57Z name: cm-test-literal namespace: system-pro resourceVersion: "598613" selfLink: /api/v1/namespaces/system-pro/configmaps/cm-test-literal uid: 412affd4-6537-11ea-adf9-fa163e4464a5
1)edit
$ kubectl edit cm cm-test01
經過kubectl describe cm cm-test01
查看更新是否生效
2)apply
直接更改yaml文件裏面的值,經過kubectl apply -f configmap-test01.yaml
從新發布一遍進行更新。
1)經過yaml文件的方式刪除
$ kubectl delete -f configmap-test01.yaml
2)直接刪除資源
$ kubectl delete cm cm-test01
容器應用對ConfigMap的使用主要是兩種:
1)經過環境變量獲取ConfigMap的內容:spec.env
和spec.envFrom
2)經過卷volume掛載的方式將ConfigMap的內容掛載到容器內部的文件或目錄:spec.volumes
如下內容均以上述的ConfigMap資源cm-test01爲例
1)建立pod
[root@k8s /cm/test]# vim pod-test01.yaml apiVersion: v1 kind: Pod metadata: name: cm-pod-test001 spec: containers: - name: cm-test image: tomcat:8 command: [ "/bin/sh", "-c", "env | grep APP"] env: - name: APPCONF01 # 定義環境變量的名稱 valueFrom: # key 「appconf01」的值獲取 configMapKeyRef: name: cm-test01 # 環境變量的值來自於configmap cm-test01 key: appconf01 # configmap中的配置key爲appconf01 - name: APPCONF02 # 定義環境變量的名稱 valueFrom: # key 「appconf02」的值獲取 configMapKeyRef: name: cm-test01 # 環境變量的值來自於configmap cm-test01 key: appconf02 # configmap中的配置key爲appconf02 restartPolicy: Never # 重啓策略:從不。
執行建立pod:
$ kubectl create -f pod-test01.yaml
2)查看pod
$ kubectl get pods
[root@k8s /cm/test]# kubectl get pods NAME READY STATUS RESTARTS AGE cm-pod-test001 0/1 Completed 0 1h
3)查看pod日誌
$ kubectl logs cm-pod-test001
[root@k8s /cm/test]# kubectl logs cm-pod-test001 APPCONF01=value01 APPCONF02=value02
說明容器內部的環境變量使用ConfigMap中進行讀取的。
1)建立pod
yaml文件
[root@k8s /cm/test]# vim pod-test02.yaml apiVersion: v1 kind: Pod metadata: name: cm-pod-test002 spec: containers: - name: cm-test2 image: tomcat:8 command: [ "/bin/sh", "-c", "env"] envFrom: - configMapRef: name: cm-test01 # 根據ConfigMap cm-test01資源自動生成環境變量 restartPolicy: Never
執行建立pod:
$ kubectl create -f pod-test02.yaml
2)查看pod
$ kubectl get po
[root@k8s /cm/test]# kubectl get po NAME READY STATUS RESTARTS AGE cm-pod-test001 0/1 Completed 0 2h cm-pod-test002 0/1 Completed 0 1h
注意:
環境變量的名稱受限制:[a-zA-Z][a-zA-Z0-9_]*
,不能以數字或非法字符開頭。
[root@k8s /cm/test]# vim pod-test03.yaml apiVersion: v1 kind: Pod metadata: name: cm-pod-test003 spec: containers: - name: cm-test3 image: tomcat:8 volumeMounts: - name: vm-01-1 mountPath: /conf volumes: - name: vm-01-1 configMap: name: cm-test-file items: - key: key-testproperties path: test.properties restartPolicy: Never
[root@k8s /cm/test]# vim pod-test04.yaml apiVersion: v1 kind: Pod metadata: name: cm-pod-test004 spec: containers: - name: cm-test4 image: tomcat:8 volumeMounts: - name: vm-02-2 mountPath: /conf volumes: - name: vm-02-2 configMap: name: cm-test-file restartPolicy: Never
進入容器中查看
$ kubectl exec -it cm-pod-test004 -c cm-test4 -- bash
進入容器後,ls /conf
查看是否有test.properties文件。
[root@k8s /cm/test]# kubectl exec -it cm-pod-test004 -c cm-test4 -- bash root@cm-pod-test004:/usr/local/tomcat# ls /conf test.properties
關於--from-file
的方式的建立指定key和不指定key的區別
1)不指定key名
建立:
$ kubectl create cm cm-test-file --from-file=test.properties
輸出:
$ kubectl get cm cm-test-file -o yaml
2)指定key
建立:
$ kubectl create cm cm-test-file02 --from-file=tp=test.properties
輸出:
$ kubectl get cm cm-test-file -o yaml
若指定key的名稱,configmap中將會使用指定名稱;若不指定,則默認使用文件名爲key。