Docker 與 K8S學習筆記(十九)—— Pod的配置管理

阿拉懶神燈發表於2022-01-22

我們在部署應用時常常會考慮將應用程式與配置檔案相分離,這樣可以使應用程式更好的複用,並且通過不同配置也能實現更靈活的功能。將應用製作成映象後,我們可以在啟動容器時通過環境變數或掛載檔案的方式注入,但是在面臨大規模容器叢集的場景下就顯得力不從心了,因此我們可以使用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。

相關文章