1 ConfigMap介紹
1.1 概述
在部署應用程序時,我們都會涉及到應用的配置,在容器中,如Docker容器中,如果將配置文件打入容器鏡像,這種行為等同於寫死配置,每次修改完配置,鏡像就得重新構建。當然,我們也可以通過掛載包含該文件的卷進行配置管理和修改。而在k8s中,我們要講一種更好的方式,即ConfigMap,這種資源對象的出現,更是極大的方便了應用程序的配置管理。
ConfigMap是一個或多個key/value的形式保存在k8s中,內部可以管理變量也可以管理完整的配置文件內容。
1.2 用法
- 生成容器內的環境變量,在pod中可以通過
spec.env
或者spec.envFrom
進行引用。 - 設置容器啟動命令的啟動參數,前提是設置為環境變量。
- 以卷volume的方式掛載到容器內部的文件或目錄,通過
spec.volumes
引用。
2 ConfigMap用法
在使用命令的時候注意單詞: configmap等價於cm,cm算是簡寫,類似於deployment可以使用命令時寫成deploy,service可以寫成svc,namespace可以寫成ns,pod可以寫成po。
2.1 創建
1)yaml文件方式創建
樣例:
apiVersion: v1
kind: ConfigMap
metadata:
name: cm-test01
data:
appconf01: value01
appconf02: value02
命令:
$ kubectl create -f configmap-test01.yaml
2)命令行方式創建
- 讀取文件方式(也可以是目錄)通過
--from-file
參數從文件中讀取。可以指定key的名稱,若不指定,則默認使用文件名為key。
如當前目錄有一個配置文件為test.properties
key01:value01
key02:value02
conf01: value03
$ kubectl create cm cm-test-file --from-file=test.properties
- 指定參數方式,通過
--from-literal
指定keyxx=valuexx創建confimap中的data內配置屬性。
$ kubectl create configmap cm-test-literal --from-literal=key01=value01 --from-literal=key02=value02
2.2 查詢
1)查看configmap列表
$ kubectl get cm
[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
[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
[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
2.3 更新
1)edit
$ kubectl edit cm cm-test01
通過kubectl describe cm cm-test01
查看更新是否生效
2)apply
直接更改yaml文件里面的值,通過kubectl apply -f configmap-test01.yaml
重新發布一遍進行更新。
2.4 刪除
1)通過yaml文件的方式刪除
$ kubectl delete -f configmap-test01.yaml
2)直接刪除資源
$ kubectl delete cm cm-test01
3 ConfigMap和Pod的使用
容器應用對ConfigMap的使用主要是兩種:
1)通過環境變量獲取ConfigMap的內容:spec.env
和spec.envFrom
2)通過卷volume掛載的方式將ConfigMap的內容掛載到容器內部的文件或目錄:spec.volumes
以下內容均以上述的ConfigMap資源cm-test01為例
3.1 環境變量方式
spec.env方式
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中進行讀取的。
spec.envFrom方式
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_]*
,不能以數字或非法字符開頭。
3.2 卷掛載方式
指定items
[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
不指定items
[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。