在Kubernetes中,ConfigMap允許我們將配置數(shù)據(jù)與應(yīng)用程序代碼分離,從而提高應(yīng)用程序的可移植性和可維護(hù)性。通過(guò)使用ConfigMap,我們可以將配置文件、環(huán)境變量和其他配置信息作為鍵值對(duì)存儲(chǔ)在ConfigMap中,并在Pod中使用這些配置信息。
ConfigMap 概念允許將配置清單與鏡像內(nèi)容分離,以保持容器化的應(yīng)用程序的可移植性。 例如,可以下載并運(yùn)行相同的容器鏡像來(lái)啟動(dòng)容器, 用于本地開(kāi)發(fā)、系統(tǒng)測(cè)試或運(yùn)行實(shí)時(shí)終端用戶工作負(fù)載。
本頁(yè)提供了一系列使用示例,這些示例演示了如何創(chuàng)建 ConfigMap 以及配置 Pod 使用存儲(chǔ)在 ConfigMap 中的數(shù)據(jù)。
一、準(zhǔn)備
必須擁有一個(gè) Kubernetes 的集群,同時(shí)必須配置 kubectl 命令行工具與集群通信。 建議在至少有兩個(gè)不作為控制平面主機(jī)的節(jié)點(diǎn)的集群上運(yùn)行本教程。 如果還沒(méi)有集群,可以通過(guò) Minikube 構(gòu)建一個(gè)自己的集群,或者可以使用下面的 Kubernetes 練習(xí)環(huán)境之一:
- Killercoda
- 玩轉(zhuǎn) Kubernetes
需要安裝 wget 工具。如果有不同的工具,例如 curl,而沒(méi)有 wget, 則需要調(diào)整下載示例數(shù)據(jù)的步驟。
二、創(chuàng)建ConfigMap
可以使用 kubectl create configmap 或者在 kustomization.yaml 中的 ConfigMap 生成器來(lái)創(chuàng)建 ConfigMap。
1、使用 kubectl create configmap 創(chuàng)建 ConfigMap
可以使用 kubectl create configmap 命令基于目錄、 文件或者字面值來(lái)創(chuàng)建 ConfigMap:
kubectl create configmap <映射名稱> <數(shù)據(jù)源>
其中,<映射名稱> 是為 ConfigMap 指定的名稱,<數(shù)據(jù)源> 是要從中提取數(shù)據(jù)的目錄、 文件或者字面值。ConfigMap 對(duì)象的名稱必須是合法的 DNS 子域名.
在基于文件來(lái)創(chuàng)建 ConfigMap 時(shí),<數(shù)據(jù)源> 中的鍵名默認(rèn)取自文件的基本名, 而對(duì)應(yīng)的值則默認(rèn)為文件的內(nèi)容??梢允褂?kubectl describe 或者 kubectl get 獲取有關(guān) ConfigMap 的信息。
2、基于一個(gè)目錄來(lái)創(chuàng)建 ConfigMap
可以使用 kubectl create configmap 基于同一目錄中的多個(gè)文件創(chuàng)建 ConfigMap。 當(dāng)基于目錄來(lái)創(chuàng)建 ConfigMap 時(shí),kubectl 識(shí)別目錄下文件名可以作為合法鍵名的文件, 并將這些文件打包到新的 ConfigMap 中。普通文件之外的所有目錄項(xiàng)都會(huì)被忽略 (例如:子目錄、符號(hào)鏈接、設(shè)備、管道等等)。
用于創(chuàng)建 ConfigMap 的每個(gè)文件名必須由可接受的字符組成,即:字母(A 到 Z 和 a 到 z)、數(shù)字(0 到 9)、’-‘、’_’或’.’。 如果在一個(gè)目錄中使用 kubectl create configmap,而其中任一文件名包含不可接受的字符, 則 kubectl 命令可能會(huì)失敗。
kubectl 命令在遇到不合法的文件名時(shí)不會(huì)打印錯(cuò)誤。
創(chuàng)建本地目錄:
mkdir -p configure-pod-container/configmap/
現(xiàn)在,下載示例的配置并創(chuàng)建 ConfigMap:
# 將示例文件下載到 `configure-pod-container/configmap/` 目錄 wget https://kubernetes.io/examples/configmap/game.properties -O configure-pod-container/configmap/game.properties wget https://kubernetes.io/examples/configmap/ui.properties -O configure-pod-container/configmap/ui.properties # 創(chuàng)建 ConfigMap kubectl create configmap game-config --from-file=configure-pod-container/configmap/
以上命令將 configure-pod-container/configmap 目錄下的所有文件,也就是 game.properties 和 ui.properties 打包到 game-config ConfigMap 中??梢允褂孟旅娴拿铒@示 ConfigMap 的詳細(xì)信息:
kubectl describe configmaps game-config
輸出類(lèi)似以下內(nèi)容:
Name: game-config Namespace: default Labels: <none> Annotations: <none> Data ==== game.properties: ---- enemies=aliens lives=3 enemies.cheat=true enemies.cheat.level=noGoodRotten secret.code.passphrase=UUDDLRLRBABAS secret.code.allowed=true secret.code.lives=30 ui.properties: ---- color.good=purple color.bad=yellow allow.textmode=true how.nice.to.look=fairlyNice
configure-pod-container/configmap/ 目錄中的 game.properties 和 ui.properties 文件出現(xiàn)在 ConfigMap 的 data 部分。
kubectl get configmaps game-config -o yaml
輸出類(lèi)似以下內(nèi)容:
apiVersion: v1 kind: ConfigMap metadata: creationTimestamp: 2022-02-18T18:52:05Z name: game-config namespace: default resourceVersion: "516" uid: b4952dc3-d670-11e5-8cd0-68f728db1985 data: game.properties: | enemies=aliens lives=3 enemies.cheat=true enemies.cheat.level=noGoodRotten secret.code.passphrase=UUDDLRLRBABAS secret.code.allowed=true secret.code.lives=30 ui.properties: | color.good=purple color.bad=yellow allow.textmode=true how.nice.to.look=fairlyNice
3、基于文件創(chuàng)建 ConfigMap
可以使用 kubectl create configmap 基于單個(gè)文件或多個(gè)文件創(chuàng)建 ConfigMap。例如:
kubectl create configmap game-config-2 --from-file=configure-pod-container/configmap/game.properties
將產(chǎn)生以下 ConfigMap:
kubectl describe configmaps game-config-2
輸出類(lèi)似以下內(nèi)容:
Name: game-config-2 Namespace: default Labels: <none> Annotations: <none> Data ==== game.properties: ---- enemies=aliens lives=3 enemies.cheat=true enemies.cheat.level=noGoodRotten secret.code.passphrase=UUDDLRLRBABAS secret.code.allowed=true secret.code.lives=30
可以多次使用 –from-file 參數(shù),從多個(gè)數(shù)據(jù)源創(chuàng)建 ConfigMap。
kubectl create configmap game-config-2 --from-file=configure-pod-container/configmap/game.properties --from-file=configure-pod-container/configmap/ui.properties
可以使用以下命令顯示 game-config-2 ConfigMap 的詳細(xì)信息:
kubectl describe configmaps game-config-2
輸出類(lèi)似以下內(nèi)容:
Name: game-config-2 Namespace: default Labels: <none> Annotations: <none> Data ==== game.properties: ---- enemies=aliens lives=3 enemies.cheat=true enemies.cheat.level=noGoodRotten secret.code.passphrase=UUDDLRLRBABAS secret.code.allowed=true secret.code.lives=30 ui.properties: ---- color.good=purple color.bad=yellow allow.textmode=true how.nice.to.look=fairlyNice
使用 –from-env-file 選項(xiàng)基于 env 文件創(chuàng)建 ConfigMap,例如:
# Env 文件包含環(huán)境變量列表。其中適用以下語(yǔ)法規(guī)則: # 這些語(yǔ)法規(guī)則適用: # Env 文件中的每一行必須為 VAR=VAL 格式。 # 以#開(kāi)頭的行(即注釋?zhuān)⒈缓雎浴? # 空行將被忽略。 # 引號(hào)不會(huì)被特殊處理(即它們將成為 ConfigMap 值的一部分)。 # 將示例文件下載到 `configure-pod-container/configmap/` 目錄 wget https://kubernetes.io/examples/configmap/game-env-file.properties -O configure-pod-container/configmap/game-env-file.properties wget https://kubernetes.io/examples/configmap/ui-env-file.properties -O configure-pod-container/configmap/ui-env-file.properties # Env 文件 `game-env-file.properties` 如下所示 cat configure-pod-container/configmap/game-env-file.properties enemies=aliens lives=3 allowed="true" # 此注釋和上方的空行將被忽略
kubectl create configmap game-config-env-file \ --from-env-file=configure-pod-container/configmap/game-env-file.properties
將產(chǎn)生以下 ConfigMap。查看 ConfigMap:
kubectl get configmap game-config-env-file -o yaml
輸出類(lèi)似以下內(nèi)容:
apiVersion: v1 kind: ConfigMap metadata: creationTimestamp: 2019-12-27T18:36:28Z name: game-config-env-file namespace: default resourceVersion: "809965" uid: d9d1ca5b-eb34-11e7-887b-42010a8002b8 data: allowed: '"true"' enemies: aliens lives: "3"
從 Kubernetes 1.23 版本開(kāi)始,kubectl 支持多次指定 –from-env-file 參數(shù)來(lái)從多個(gè)數(shù)據(jù)源創(chuàng)建 ConfigMap。
kubectl create configmap config-multi-env-files \ --from-env-file=configure-pod-container/configmap/game-env-file.properties \ --from-env-file=configure-pod-container/configmap/ui-env-file.properties
將產(chǎn)生以下 ConfigMap:
kubectl get configmap config-multi-env-files -o yaml
輸出類(lèi)似以下內(nèi)容:
apiVersion: v1 kind: ConfigMap metadata: creationTimestamp: 2019-12-27T18:38:34Z name: config-multi-env-files namespace: default resourceVersion: "810136" uid: 252c4572-eb35-11e7-887b-42010a8002b8 data: allowed: '"true"' color: purple enemies: aliens how: fairlyNice lives: "3" textmode: "true"
4、定義從文件創(chuàng)建 ConfigMap 時(shí)要使用的鍵
在使用 –from-file 參數(shù)時(shí),可以定義在 ConfigMap 的 data 部分出現(xiàn)鍵名, 而不是按默認(rèn)行為使用文件名:
kubectl create configmap game-config-3 --from-file=<我的鍵名>=<文件路徑>
<我的鍵名> 是要在 ConfigMap 中使用的鍵名,<文件路徑> 是想要鍵所表示的數(shù)據(jù)源文件的位置。例如:
kubectl create configmap game-config-3 --from-file=game-special-key=configure-pod-container/configmap/game.properties
將產(chǎn)生以下 ConfigMap:
kubectl get configmaps game-config-3 -o yaml
輸出類(lèi)似以下內(nèi)容:
apiVersion: v1 kind: ConfigMap metadata: creationTimestamp: 2022-02-18T18:54:22Z name: game-config-3 namespace: default resourceVersion: "530" uid: 05f8da22-d671-11e5-8cd0-68f728db1985 data: game-special-key: | enemies=aliens lives=3 enemies.cheat=true enemies.cheat.level=noGoodRotten secret.code.passphrase=UUDDLRLRBABAS secret.code.allowed=true secret.code.lives=30
5、根據(jù)字面值創(chuàng)建 ConfigMap
可以將 kubectl create configmap 與 –from-literal 參數(shù)一起使用, 通過(guò)命令行定義文字值:
kubectl create configmap special-config --from-literal=special.how=very --from-literal=special.type=charm
可以傳入多個(gè)鍵值對(duì)。命令行中提供的每對(duì)鍵值在 ConfigMap 的 data 部分中均表示為單獨(dú)的條目。
kubectl get configmaps special-config -o yaml
輸出類(lèi)似以下內(nèi)容:
apiVersion: v1 kind: ConfigMap metadata: creationTimestamp: 2022-02-18T19:14:38Z name: special-config namespace: default resourceVersion: "651" uid: dadce046-d673-11e5-8cd0-68f728db1985 data: special.how: very special.type: charm
6、基于生成器創(chuàng)建 ConfigMap
還可以基于生成器(Generators)創(chuàng)建 ConfigMap,然后將其應(yīng)用于集群的 API 服務(wù)器上創(chuàng)建對(duì)象。 生成器應(yīng)在目錄內(nèi)的 kustomization.yaml 中指定。
7、基于文件生成 ConfigMap
例如,要基于 configure-pod-container/configmap/game.properties 文件生成一個(gè) ConfigMap:
# 創(chuàng)建包含 ConfigMapGenerator 的 kustomization.yaml 文件 cat <<EOF >./kustomization.yaml configMapGenerator: - name: game-config-4 options: labels: game-config: config-4 files: - configure-pod-container/configmap/game.properties EOF
應(yīng)用(Apply)kustomization 目錄創(chuàng)建 ConfigMap 對(duì)象:
kubectl apply -k .
configmap/game-config-4-m9dm2f92bt created
可以像這樣檢查 ConfigMap 已經(jīng)被創(chuàng)建:
kubectl get configmap
NAME DATA AGE game-config-4-m9dm2f92bt 1 37s
也可以這樣:
kubectl describe configmaps/game-config-4-m9dm2f92bt
Name: game-config-4-m9dm2f92bt Namespace: default Labels: game-config=config-4 Annotations: kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"v1","data":{"game.properties":"enemies=aliens\nlives=3\nenemies.cheat=true\nenemies.cheat.level=noGoodRotten\nsecret.code.p... Data ==== game.properties: ---- enemies=aliens lives=3 enemies.cheat=true enemies.cheat.level=noGoodRotten secret.code.passphrase=UUDDLRLRBABAS secret.code.allowed=true secret.code.lives=30 Events: <none>
請(qǐng)注意,生成的 ConfigMap 名稱具有通過(guò)對(duì)內(nèi)容進(jìn)行散列而附加的后綴, 這樣可以確保每次修改內(nèi)容時(shí)都會(huì)生成新的 ConfigMap。
8、定義從文件生成 ConfigMap 時(shí)要使用的鍵
在 ConfigMap 生成器中,可以定義一個(gè)非文件名的鍵名。 例如,從 configure-pod-container/configmap/game.properties 文件生成 ConfigMap, 但使用 game-special-key 作為鍵名:
# 創(chuàng)建包含 ConfigMapGenerator 的 kustomization.yaml 文件 cat <<EOF >./kustomization.yaml configMapGenerator: - name: game-config-5 options: labels: game-config: config-5 files: - game-special-key=configure-pod-container/configmap/game.properties EOF
應(yīng)用 Kustomization 目錄創(chuàng)建 ConfigMap 對(duì)象。
kubectl apply -k .
configmap/game-config-5-m67dt67794 created
9、基于字面值生成 ConfigMap
此示例向展示如何使用 Kustomize 和 kubectl,基于兩個(gè)字面鍵/值對(duì) special.type=charm 和 special.how=very 創(chuàng)建一個(gè) ConfigMap。 為了實(shí)現(xiàn)這一點(diǎn),可以配置 ConfigMap 生成器。 創(chuàng)建(或替換)kustomization.yaml,使其具有以下內(nèi)容。
--- # 基于字面創(chuàng)建 ConfigMap 的 kustomization.yaml 內(nèi)容 configMapGenerator: - name: special-config-2 literals: - special.how=very - special.type=charm EOF
應(yīng)用 Kustomization 目錄創(chuàng)建 ConfigMap 對(duì)象。
kubectl apply -k .
configmap/special-config-2-c92b5mmcf2 created
三、臨時(shí)清理
在繼續(xù)之前,清理創(chuàng)建的一些 ConfigMap:
kubectl delete configmap special-config kubectl delete configmap env-config kubectl delete configmap -l 'game-config in (config-4,config-5)'
四、定義容器環(huán)境變量
1、使用單個(gè) ConfigMap 中的數(shù)據(jù)定義容器環(huán)境變量
在 ConfigMap 中將環(huán)境變量定義為鍵值對(duì):
kubectl create configmap special-config --from-literal=special.how=very
將 ConfigMap 中定義的 special.how 賦值給 Pod 規(guī)約中的 SPECIAL_LEVEL_KEY 環(huán)境變量。
apiVersion: v1 kind: Pod metadata: name: dapi-test-pod spec: containers: - name: test-container image: registry.k8s.io/busybox command: [ "/bin/sh", "-c", "env" ] env: # 定義環(huán)境變量 - name: SPECIAL_LEVEL_KEY valueFrom: configMapKeyRef: # ConfigMap 包含要賦給 SPECIAL_LEVEL_KEY 的值 name: special-config # 指定與取值相關(guān)的鍵名 key: special.how restartPolicy: Never
創(chuàng)建 Pod:
kubectl create -f https://kubernetes.io/examples/pods/pod-single-configmap-env-variable.yaml
現(xiàn)在,Pod 的輸出包含環(huán)境變量 SPECIAL_LEVEL_KEY=very。
2、使用來(lái)自多個(gè) ConfigMap 的數(shù)據(jù)定義容器環(huán)境變量
與前面的示例一樣,首先創(chuàng)建 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
創(chuàng)建 ConfigMap:
kubectl create -f https://kubernetes.io/examples/configmap/configmaps.yaml
在 Pod 規(guī)約中定義環(huán)境變量。
apiVersion: v1 kind: Pod metadata: name: dapi-test-pod spec: containers: - name: test-container image: registry.k8s.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
創(chuàng)建 Pod:
kubectl create -f https://kubernetes.io/examples/pods/pod-multiple-configmap-env-variable.yaml
現(xiàn)在,Pod 的輸出包含環(huán)境變量 SPECIAL_LEVEL_KEY=very 和 LOG_LEVEL=INFO。一旦樂(lè)意繼續(xù)前進(jìn),刪除該 Pod:
kubectl delete pod dapi-test-pod --now
五、容器環(huán)境變量
創(chuàng)建一個(gè)包含多個(gè)鍵值對(duì)的 ConfigMap。
apiVersion: v1 kind: ConfigMap metadata: name: special-config namespace: default data: SPECIAL_LEVEL: very SPECIAL_TYPE: charm
創(chuàng)建 ConfigMap:
kubectl create -f https://kubernetes.io/examples/configmap/configmap-multikeys.yaml
使用 envFrom 將所有 ConfigMap 的數(shù)據(jù)定義為容器環(huán)境變量,ConfigMap 中的鍵成為 Pod 中的環(huán)境變量名稱。
apiVersion: v1 kind: Pod metadata: name: dapi-test-pod spec: containers: - name: test-container image: registry.k8s.io/busybox command: [ "/bin/sh", "-c", "env" ] envFrom: - configMapRef: name: special-config restartPolicy: Never
創(chuàng)建 Pod:
kubectl create -f https://kubernetes.io/examples/pods/pod-configmap-envFrom.yaml
現(xiàn)在,Pod 的輸出包含環(huán)境變量 SPECIAL_LEVEL=very 和 SPECIAL_TYPE=charm。一旦樂(lè)意繼續(xù)前進(jìn),刪除該 Pod:
kubectl delete pod dapi-test-pod --now
六、在Pod命令中使用
可以使用 $(VAR_NAME) Kubernetes 替換語(yǔ)法在容器的 command 和 args 屬性中使用 ConfigMap 定義的環(huán)境變量。
例如,以下 Pod 清單:
apiVersion: v1 kind: Pod metadata: name: dapi-test-pod spec: containers: - name: test-container image: registry.k8s.io/busybox command: [ "/bin/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
通過(guò)運(yùn)行下面命令創(chuàng)建該 Pod:
kubectl create -f https://kubernetes.io/examples/pods/pod-configmap-env-var-valueFrom.yaml
此 Pod 在 test-container 容器中產(chǎn)生以下輸出:
kubectl logs dapi-test-pod
very charm
一旦樂(lè)意繼續(xù)前進(jìn),刪除該 Pod:
kubectl delete pod dapi-test-pod --now
七、添加到一個(gè)卷中
如基于文件創(chuàng)建 ConfigMap 中所述,當(dāng)使用 –from-file 創(chuàng)建 ConfigMap 時(shí),文件名成為存儲(chǔ)在 ConfigMap 的 data 部分中的鍵, 文件內(nèi)容成為鍵對(duì)應(yīng)的值。
本節(jié)中的示例引用了一個(gè)名為 special-config 的 ConfigMap:
apiVersion: v1 kind: ConfigMap metadata: name: special-config namespace: default data: SPECIAL_LEVEL: very SPECIAL_TYPE: charm
創(chuàng)建 ConfigMap:
kubectl create -f https://kubernetes.io/examples/configmap/configmap-multikeys.yaml
1、使用存儲(chǔ)在 ConfigMap 中的數(shù)據(jù)填充卷
在 Pod 規(guī)約的 volumes 部分下添加 ConfigMap 名稱。 這會(huì)將 ConfigMap 數(shù)據(jù)添加到 volumeMounts.mountPath 所指定的目錄 (在本例中為 /etc/config)。 command 部分列出了名稱與 ConfigMap 中的鍵匹配的目錄文件。
apiVersion: v1 kind: Pod metadata: name: dapi-test-pod spec: containers: - name: test-container image: registry.k8s.io/busybox command: [ "/bin/sh", "-c", "ls /etc/config/" ] volumeMounts: - name: config-volume mountPath: /etc/config volumes: - name: config-volume configMap: # 提供包含要添加到容器中的文件的 ConfigMap 的名稱 name: special-config restartPolicy: Never
創(chuàng)建 Pod:
kubectl create -f https://kubernetes.io/examples/pods/pod-configmap-volume.yaml
Pod 運(yùn)行時(shí),命令 ls /etc/config/ 產(chǎn)生下面的輸出:
SPECIAL_LEVEL SPECIAL_TYPE
文本數(shù)據(jù)會(huì)展現(xiàn)為 UTF-8 字符編碼的文件。如果使用其他字符編碼, 可以使用 binaryData(詳情參閱 ConfigMap 對(duì)象)。
如果該容器鏡像的 /etc/config 目錄中有一些文件,卷掛載將使該鏡像中的這些文件無(wú)法訪問(wèn)。一旦樂(lè)意繼續(xù)前進(jìn),刪除該 Pod:
kubectl delete pod dapi-test-pod --now
2、將 ConfigMap 數(shù)據(jù)添加到卷中的特定路徑
使用 path 字段為特定的 ConfigMap 項(xiàng)目指定預(yù)期的文件路徑。 在這里,ConfigMap 中鍵 SPECIAL_LEVEL 的內(nèi)容將掛載在 config-volume 卷中 /etc/config/keys 文件中。
apiVersion: v1 kind: Pod metadata: name: dapi-test-pod spec: containers: - name: test-container image: registry.k8s.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
創(chuàng)建 Pod:
kubectl create -f https://kubernetes.io/examples/pods/pod-configmap-volume-specific-key.yaml
當(dāng) Pod 運(yùn)行時(shí),命令 cat /etc/config/keys 產(chǎn)生以下輸出:
very
注意:如前,/etc/config/ 目錄中所有先前的文件都將被刪除。
刪除該 Pod:
kubectl delete pod dapi-test-pod --now
3、映射鍵到指定路徑并設(shè)置文件訪問(wèn)權(quán)限
可以將指定鍵名投射到特定目錄,也可以逐個(gè)文件地設(shè)定訪問(wèn)權(quán)限。 Secret 指南中為這一語(yǔ)法提供了解釋。
4、可選引用
ConfigMap 引用可以被標(biāo)記為可選。 如果 ConfigMap 不存在,則掛載的卷將為空。 如果 ConfigMap 存在,但引用的鍵不存在,則掛載點(diǎn)下的路徑將不存在。 有關(guān)更多信息,請(qǐng)參閱可選 ConfigMap 細(xì)節(jié)。
5、掛載的 ConfigMap 會(huì)被自動(dòng)更新
當(dāng)已掛載的 ConfigMap 被更新時(shí),所投射的內(nèi)容最終也會(huì)被更新。 這適用于 Pod 啟動(dòng)后可選引用的 ConfigMap 重新出現(xiàn)的情況。
Kubelet 在每次定期同步時(shí)都會(huì)檢查所掛載的 ConfigMap 是否是最新的。 然而,它使用其基于 TTL 機(jī)制的本地緩存來(lái)獲取 ConfigMap 的當(dāng)前值。 因此,從 ConfigMap 更新到新鍵映射到 Pod 的總延遲可能與 kubelet 同步周期(默認(rèn)為1分鐘)+ kubelet 中 ConfigMap 緩存的 TTL(默認(rèn)為1分鐘)一樣長(zhǎng)。 可以通過(guò)更新 Pod 的一個(gè)注解來(lái)觸發(fā)立即刷新。
使用 ConfigMap 作為 subPath 卷的容器將不會(huì)收到 ConfigMap 更新。
八、ConfigMap和Pod
ConfigMap API 資源將配置數(shù)據(jù)存儲(chǔ)為鍵值對(duì)。 數(shù)據(jù)可以在 Pod 中使用,也可以用來(lái)提供系統(tǒng)組件(如控制器)的配置。 ConfigMap 與 Secret 類(lèi)似, 但是提供的是一種處理不含敏感信息的字符串的方法。 用戶和系統(tǒng)組件都可以在 ConfigMap 中存儲(chǔ)配置數(shù)據(jù)。
ConfigMap 應(yīng)該引用屬性文件,而不是替換它們??梢詫?ConfigMap 理解為類(lèi)似于 Linux /etc 目錄及其內(nèi)容的東西。例如,如果基于 ConfigMap 創(chuàng)建 Kubernetes 卷,則 ConfigMap 中的每個(gè)數(shù)據(jù)項(xiàng)都由該數(shù)據(jù)卷中的某個(gè)獨(dú)立的文件表示。
ConfigMap 的 data 字段包含配置數(shù)據(jù)。如下例所示,它可以簡(jiǎn)單 (如用 –from-literal 的單個(gè)屬性定義)或復(fù)雜 (如用 –from-file 的配置文件或 JSON blob 定義)。
apiVersion: v1 kind: ConfigMap metadata: creationTimestamp: 2016-02-18T19:14:38Z name: example-config namespace: default data: # 使用 --from-literal 定義的簡(jiǎn)單屬性 example.property.1: hello example.property.2: world # 使用 --from-file 定義復(fù)雜屬性的例子 example.property.file: |- property.1=value-1 property.2=value-2 property.3=value-3
當(dāng) kubectl 從非 ASCII 或 UTF-8 編碼的輸入創(chuàng)建 ConfigMap 時(shí), 該工具將這些輸入放入 ConfigMap 的 binaryData 字段,而不是 data 字段。 文本和二進(jìn)制數(shù)據(jù)源都可以組合在一個(gè) ConfigMap 中。
如果想查看 ConfigMap 中的 binaryData 鍵(及其值), 可以運(yùn)行 kubectl get configmap -o jsonpath='{.binaryData}’ <name>。
Pod 可以從使用 data 或 binaryData 的 ConfigMap 中加載數(shù)據(jù)。
1、可選的 ConfigMap
可以在 Pod 規(guī)約中將對(duì) ConfigMap 的引用標(biāo)記為可選(optional)。 如果 ConfigMap 不存在,那么它在 Pod 中為其提供數(shù)據(jù)的配置(例如:環(huán)境變量、掛載的卷)將為空。 如果 ConfigMap 存在,但引用的鍵不存在,那么數(shù)據(jù)也是空的。
例如,以下 Pod 規(guī)約將 ConfigMap 中的環(huán)境變量標(biāo)記為可選:
apiVersion: v1 kind: Pod metadata: name: dapi-test-pod spec: containers: - name: test-container image: gcr.io/google_containers/busybox command: ["/bin/sh", "-c", "env"] env: - name: SPECIAL_LEVEL_KEY valueFrom: configMapKeyRef: name: a-config key: akey optional: true # 將環(huán)境變量標(biāo)記為可選 restartPolicy: Never
當(dāng)運(yùn)行這個(gè) Pod 并且名稱為 a-config 的 ConfigMap 不存在時(shí),輸出空值。 當(dāng)運(yùn)行這個(gè) Pod 并且名稱為 a-config 的 ConfigMap 存在, 但是在 ConfigMap 中沒(méi)有名稱為 akey 的鍵時(shí),控制臺(tái)輸出也會(huì)為空。 如果確實(shí)在名為 a-config 的 ConfigMap 中為 akey 設(shè)置了鍵值, 那么這個(gè) Pod 會(huì)打印該值,然后終止。
也可以在 Pod 規(guī)約中將 ConfigMap 提供的卷和文件標(biāo)記為可選。 此時(shí) Kubernetes 將總是為卷創(chuàng)建掛載路徑,即使引用的 ConfigMap 或鍵不存在。 例如,以下 Pod 規(guī)約將所引用得 ConfigMap 的卷標(biāo)記為可選:
apiVersion: v1 kind: Pod metadata: name: dapi-test-pod spec: containers: - name: test-container image: gcr.io/google_containers/busybox command: ["/bin/sh", "-c", "ls /etc/config"] volumeMounts: - name: config-volume mountPath: /etc/config volumes: - name: config-volume configMap: name: no-config optional: true # 將引用的 ConfigMap 的卷標(biāo)記為可選 restartPolicy: Never
2、限制
在 Pod 規(guī)約中引用某個(gè) ConfigMap 之前,必須先創(chuàng)建這個(gè)對(duì)象, 或者在 Pod 規(guī)約中將 ConfigMap 標(biāo)記為 optional(請(qǐng)參閱可選的 ConfigMaps)。 如果所引用的 ConfigMap 不存在,并且沒(méi)有將應(yīng)用標(biāo)記為 optional 則 Pod 將無(wú)法啟動(dòng)。 同樣,引用 ConfigMap 中不存在的主鍵也會(huì)令 Pod 無(wú)法啟動(dòng),除非將 Configmap 標(biāo)記為 optional。
如果使用 envFrom 來(lái)基于 ConfigMap 定義環(huán)境變量,那么無(wú)效的鍵將被忽略。 Pod 可以被啟動(dòng),但無(wú)效名稱將被記錄在事件日志中(InvalidVariableNames)。 日志消息列出了每個(gè)被跳過(guò)的鍵。例如:
kubectl get events
輸出與此類(lèi)似:
LASTSEEN FIRSTSEEN COUNT NAME KIND SUBOBJECT TYPE REASON SOURCE MESSAGE 0s 0s 1 dapi-test-pod Pod Warning InvalidEnvironmentVariableNames {kubelet, 127.0.0.1} Keys [1badkey, 2alsobad] from the EnvFrom configMap default/myconfig were skipped since they are considered invalid environment variable names.
ConfigMap 位于確定的名字空間中。 每個(gè) ConfigMap 只能被同一名字空間中的 Pod 引用。
不能將 ConfigMap 用于靜態(tài) Pod, 因?yàn)?Kubernetes 不支持這種用法。
九、清理現(xiàn)場(chǎng)
刪除創(chuàng)建那些的 ConfigMap 和 Pod:
kubectl delete configmaps/game-config configmaps/game-config-2 configmaps/game-config-3 \ configmaps/game-config-env-file kubectl delete pod dapi-test-pod --now # 可能已經(jīng)刪除了下一組內(nèi)容 kubectl delete configmaps/special-config configmaps/env-config kubectl delete configmap -l 'game-config in (config-4,config-5)'
如果創(chuàng)建了一個(gè)目錄 configure-pod-container 并且不再需要它,也應(yīng)該刪除這個(gè)目錄, 或者將該目錄移動(dòng)到回收站/刪除文件的位置。