我們在部署應用時常常會考慮將應用程式與配置檔案相分離,這樣可以使應用程式更好的複用,並且通過不同配置也能實現更靈活的功能。將應用製作成映象後,我們可以在啟動容器時通過環境變數或掛載檔案的方式注入,但是在面臨大規模容器叢集的場景下就顯得力不從心了,因此我們可以使用ConfigMap進行統一配置。
一、ConfigMap介紹
ConfigMap是Kubernetes中的一種資源物件,用於將應用配置資訊儲存到鍵值對中,Pod在使用時,將其用作環境變數、命令列引數或者儲存卷中的配置檔案。通過ConfigMap可以實現應用配置與容器解耦,極大方便應用配置的維護。我們通過Yaml定義一個ConfigMap並通過kubectl create建立:
$ cat cm-appvars.yaml apiVersion: v1 kind: ConfigMap metadata: name: cm-appvars data: var1: a var2: b var3: c $ sudo kubectl create -f cm-appvars.yaml configmap/cm-appvars created $ sudo kubectl get configmap NAME DATA AGE cm-appvars 3 13s kube-root-ca.crt 1 28d $ sudo kubectl describe configmap cm-appvars Name: cm-appvars Namespace: default Labels: <none> Annotations: <none> Data ==== var1: ---- a var2: ---- b var3: ---- c Events: <none>
二、在Pod中使用ConfigMap
1、通過環境變數方式使用ConfigMap
我們通過Busybox進行實驗,Pod定義如下:
apiVersion: v1 kind: Pod metadata: name: busybox-pod spec: containers: - name: busybox image: busybox command: ["/bin/sh", "-c", "env | grep VAR"] env: - name: VAR_A valueFrom: configMapKeyRef: name: cm-appvars key: var1 - name: VAR_B valueFrom: configMapKeyRef: name: cm-appvars key: var2 restartPolicy: Never
我們busybox-pod在定義時通過valueFrom.configMapKeyRef為要注入的環境變數賦值,pod啟動後通過env命令列印環境變數並退出。(這裡設定restartPolicy: Never避免Pod執行完命令退出後再次重啟)
我們建立Pod並通過kubectl logs命令進行驗證:
$ sudo kubectl create -f busy_pod.yaml pod/busybox-pod created $ sudo kubectl logs busybox-pod VAR_A=a VAR_B=b
根據輸出,我們可以得知容器內部的環境變數通過使用ConfigMap的值已經被正確配置。
2、通過掛載Volume使用ConfigMap
還是以busybox為例,我們在Pod定義中,將cm-appvars中的內容以檔案的形式掛載到容器內部的/vars目錄下。修改後的Pod定義檔案如下:
apiVersion: v1 kind: Pod metadata: name: busybox-pod spec: containers: - name: busybox image: busybox command: ["/bin/sh", "-c", "top"] volumeMounts: - name: vars mountPath: /vars volumes: - name: vars configMap: name: cm-appvars items: - key: var1 # key=var1 path: var1 # value將以var1檔名方式進行掛載 - key: var2 # key=var2 path: var2 # value將以var2檔名方式進行掛載
接著我們建立Pod並進入容器中檢視是否有對應配置資訊的檔案:
$ sudo kubectl create -f busy_pod.yaml pod/busybox-pod created $ sudo kubectl exec -it busybox-pod /bin/sh kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead. / # ls bin dev etc home proc root sys tmp usr var vars / # cd vars /vars # ls var1 var2 /vars # cat var1 a/vars #
其實我們這裡的例子很簡單,在實際使用時,我們可以在ConfigMap中儲存配置檔案內容(如redis.conf、server.xml等),然後通過volume方式掛載到Pod中供應用載入。
三、ConfigMap的使用注意事項
在使用ConfigMap時需要注意以下幾點:
1)ConfigMap必須在Pod之前建立,這樣Pod才能使用它;
2)ConfigMap只能用於相同名稱空間中的Pod;
3)ConfigMap無法用於靜態Pod。