Kubernetes-配置字典ConfigMap
1、ConfigMap概述
很多生產環境中的應用程式配置較為複雜,可能需要多個config檔案、命令列引數和環境變數的組合。使用容器部署時,把配置應該從應用程式映象中解耦出來,以保證映象的可移植性。儘管Secret允許類似於驗證資訊和祕鑰等資訊從應用中解耦出來,但在K8S1.2前並沒有為了普通的或者非secret配置而存在的物件。在K8S1.2後引入ConfigMap來處理這種型別的配置資料。
ConfigMap是儲存通用的配置變數的,類似於配置檔案,使使用者可以將分散式系統中用於不同模組的環境變數統一到一個物件中管理;而它與配置檔案的區別在於它是存在叢集的“環境”中的,並且支援K8S叢集中所有通用的操作呼叫方式。從資料角度來看,ConfigMap的型別只是鍵值組,用於儲存被Pod或者其他資源物件(如RC)訪問的資訊。這與secret的設計理念有異曲同工之妙,主要區別在於ConfigMap通常不用於儲存敏感資訊,而只儲存簡單的文字資訊。
建立pod時,對configmap進行繫結,pod內的應用可以直接引用ConfigMap的配置。相當於configmap為應用/執行環境封裝配置。pod使用ConfigMap,通常用於:設定環境變數的值、設定命令列引數、建立配置檔案。
Kubernetes是為了解決“如何合理使用容器支撐企業級複雜應用”這個問題而誕生的,所以它的設計理念是要支援絕大多數應用的原生形態。例如,很多應用程式的配置需要通過配置檔案,命令列引數和環境變數的組合配置來完成(“十二要素應用”等均要求去配置)。這些配置應該從image內容中解耦,以此來保持容器化應用程式的可移植性。ConfigMap API資源提供了將配置資料注入容器的方式,同時保證該機制對容器來說是透明的。ConfigMap可以被用來儲存單個屬性,也可以用來儲存整個配置檔案或者JSON二進位制大物件。
ConfigMap API以鍵值對的方式儲存配置資料。ConfigMap的資料可以被Pod和控制器等系統元件使用。onfigMap和Secret類似,但ConfigMap用於儲存不包含敏感資訊的資料。使用者和系統元件一樣能夠在ConfigMap中儲存配置資料。ConfigMap可以儲存環境變數的屬性,也可以儲存配置檔案。ConfigMap的data field包含配置資料。如下面例子所示,ConfigMap可以包含細粒度的配置項,如:example.property.1;也可以包含粗粒度的配置檔案,如:example.property.file。
kind: ConfigMap apiVersion: v1 metadata: creationTimestamp: 2016-02-18T19:14:38Z name: example-config namespace: default data: # example of a simple property defined using --from-literal example.property.1: hello example.property.2: world # example of a complex property defined using --from-file example.property.file: |- property.1=value-1 property.2=value-2
在使用Config時需要注意的事項:
- 在Pod 規格應用ConfigMap之前,ConfigMap必須存在。如果Pod引用的ConfigMap不存在,Pod將不能啟動。
- ConfigMap只能被在同一一個名稱空間中的Pod所引用。
2、建立ConfigMap
在Kubernetes中,可以使用kubectl create configmap命令,通過目錄、檔案和指定值(literal value)來建立:
$ kubectl create configmap <map-name> <data-source>
這裡的 <map-name> 是希望建立的ConfigMap的名稱,<data-source>是一個目錄、檔案和具體值。
在ConfigMap中,鍵值對的資料來源如下所述:
- key = 檔名或者在命令列中提供的鍵
- value = 檔案內容或者在命令列中提供的具體值
能夠使用kubectl describe或者kubectl get獲取ConfigMap的資訊。
2.1 通過目錄建立ConfigMaps
1)通過在一個目錄下的多個檔案建立ConfigMap,例如:
$kubectl create configmap game-config \ --from-file=https://k8s.io/docs/tasks/configure-pod-container/configmap/kubectl
2)docs/tasks/configure-pod-container/configmap/kubectl/目錄下的檔案包括:
$ ls docs/tasks/configure-pod-container/configmap/kubectl/
- game.properties
- ui.properties
3)檢視game-config ConfigMap的資訊:
$ kubectl describe configmaps game-config
4)在docs/tasks/configure-pod-container/configmap/kubectl/ 目錄下的game.properties和ui.properties檔案的內容在ConfigMap中的data區域進行顯示:
$ kubectl get configmaps game-config -o yaml
2.2 通過檔案建立ConfigMaps
2.2.1 通過單個檔案建立
1)通過單個檔案建立ConfigMap,例如:
$ kubectl create configmap game-config-2 \ --from-file=https://k8s.io/docs/tasks/configure-pod-container/configmap/kubectl/game.properties
2)檢視生產的ConfigMap資訊:
$ kubectl describe configmaps game-config-2
2.2.2 通過多個檔案生成
1)通過多個檔案建立ConfigMap
$ kubectl create configmap game-config-3 \ --from-file=https://k8s.io/docs/tasks/configure-pod-container/configmap/kubectl/game.properties \ --from-file=https://k8s.io/docs/tasks/configure-pod-container/configmap/kubectl/ui.properties
2)檢視生產的ConfigMap資訊:
$ kubectl describe configmaps game-config-3
2.2.3 通過檔案建立ConfigMap時可以定義檔案的鍵
$ kubectl create configmap game-config-4 --from-file=<my-key-name>=<path-to-file>
這裡的<my-key-name>是在ConfigMap裡想要被使用的鍵,<path-to-file>是檔案的路徑。例如:
$ kubectl create configmap game-config-4 \ --from-file=game-special-key=https://k8s.io/docs/tasks/configure-pod-container/configmap/kubectl/game.properties $ kubectl get configmaps game-config-4 -o yaml
2.3 通過具體值建立ConfigMaps
通過kubectl create configmap命令,能夠使用–from-literal引數來定義具體值來建立ConfigMap:
$ kubectl create configmap special-config --from-literal=special.how=very --from-literal=special.type=charm
在命令列中可以輸入多個鍵-值對。每一一個鍵值對會成為ConfigMap data部分的一條記錄。
$ kubectl get configmaps special-config -o yaml
3、使用ConfigMap
3.1 使用ConfigMap資料定義Pod環境變數
3.1.1 Pod環境變數的值來自於單一ConfigMap
1)在ConfigMap中定義一個環境變數作為鍵值對:
$ kubectl create configmap special-config --from-literal=special.how=very
2)指派ConfigMap中定義的special.how的值給Pod中
SPECIAL_LEVEL_KEY環境變數:
$ kubectl edit pod dapi-test-pod
apiVersion:v1 kind:Pod metadata: name:dapi-test-pod spec: containers: - name:test-container image:k8s.gcr.io/busybox command:["/bin/sh","-c","env"] env: # Define the environment variable - name:SPECIAL_LEVEL_KEY valueFrom:configMapKeyRef:# The ConfigMap containing the value you want to assign to SPECIAL_LEVEL_KEYname:special-config# Specify the key associated with the valuekey:special.how restartPolicy:Never
儲存Pod規格的變化,Pod將輸出SPECIAL_LEVEL_KEY=very。
3.1.2 Pod環境變數的值來自於多個ConfigMap
首先建立兩個ConfigMap:
apiVersion:v1 kind:ConfigMap metadata: name:special-config namespace:default data: special.how:very
apiVersion:v1 kind:ConfigMap metadata: name:env-config namespace:default data: log_level:INFO
在Pod規格中定義環境變數:
apiVersion:v1 kind:Pod metadata: name:dapi-test-pod spec: containers: - name:test-container image:k8s.gcr.io/busybox command:["/bin/sh","-c","env"] env: - name:SPECIAL_LEVEL_KEY valueFrom: configMapKeyRef: name:special-config key:special.how - name:LOG_LEVEL valueFrom: configMapKeyRef: name:env-config key:log_level restartPolicy:Never
儲存變更後的Pod,Pod將會輸出 SPECIAL_LEVEL_KEY=very和
LOG_LEVEL=info。
3.2 在一個ConfigMap中配置的鍵值對都作為一個Pod的環境變數
注意:此能力在Kubernetes v1.6+可用。建立包含多個鍵-值對的ConfigMap。
apiVersion:v1 kind:ConfigMap metadata: name:special-config namespace:default data: SPECIAL_LEVEL:very SPECIAL_TYPE:charm
使用envFrom定義所有的ConfigMap資料作為Pod的環境變數。來自於Config的鍵成為Pod中環境變數的名。
apiVersion:v1 kind:Pod metadata: name:dapi-test-pod spec: containers: - name:test-container image:k8s.gcr.io/busybox command:["/bin/sh","-c","env"] envFrom: - configMapRef: name:special-config restartPolicy:Never
儲存Pod規範的變更,現在Pod的輸出包括:SPECIAL_LEVEL=very 和 SPECIAL_TYPE=charm
3.3 在Pod命令列中使用ConfigMap定義的環境變數
在Pod規範的command 中使用$(VAR_NAME) ,獲取ConfigMap定義的環境變數。例如:下面的Pod規範:
apiVersion:v1 kind:Pod metadata: name:dapi-test-pod spec: containers: - name:test-container image:k8s.gcr.io/busybox command:["/bin/sh","-c","echo $(SPECIAL_LEVEL_KEY) $(SPECIAL_TYPE_KEY)"] env: - name:SPECIAL_LEVEL_KEY valueFrom: configMapKeyRef: name:special-config key:SPECIAL_LEVEL - name:SPECIAL_TYPE_KEY valueFrom: configMapKeyRef: name:special-config key:SPECIAL_TYPE restartPolicy:Never
test-container容器的輸入如下:
very charm
4、新增ConfigMap資料至儲存卷
當通過–from-file建立的ConfigMap時,檔案將作為一個鍵儲存在ConfigMap中,而此檔案的內容將作為值。
apiVersion:v1 kind:ConfigMap metadata: name:special-config namespace:default data: special.level:very special.type:charm
4.1 將ConfigMap中的資料傳播到指定目錄
在Pod的儲存卷區域新增ConfigMap的名稱。這將新增ConfigMap資料到volumeMounts.mountPath指定的目錄下(在此例子為/etc/config)。command區域將引用儲存在ConfigMap中的special.level條目。
apiVersion:v1 kind:Pod metadata: name:dapi-test-pod spec: containers: - name:test-container image:k8s.gcr.io/busybox command:["/bin/sh","-c","ls /etc/config/"] volumeMounts: - name:config-volume mountPath:/etc/config volumes: - name:config-volume configMap: # Provide the name of the ConfigMap containing the files you want # to add to the container name:special-config restartPolicy:Never
當Pod執行時,command (“ls /etc/config/”)將輸出下面的內容:
special.level special.type
注意:如果在/etc/config/目錄下存在檔案,將不會刪除。
4.2 新增ConfigMap資料至儲存卷指定的目錄
為ConfigMap條目,使用path指定檔案路徑。在此示例中,special.level將在config-volume儲存卷中被掛接至/etc/config/keys。
apiVersion:v1 kind:Pod metadata: name:dapi-test-pod spec: containers: - name:test-container image:k8s.gcr.io/busybox command:["/bin/sh","-c","cat /etc/config/keys"] volumeMounts: - name:config-volume mountPath:/etc/config volumes: - name:config-volume configMap: name:special-config items: - key:special.level path:keys restartPolicy:Never
當Pod執行時,(“cat /etc/config/keys”) 將輸出:
very
本文轉自中文社群- ofollow,noindex">Kubernetes-配置字典ConfigMap