前言
本文為〈Kubernetes 官方文件〉的學習筆記。
環境
- macOS
- minikube
概述
ConfigMap 允許配置檔案與鏡像檔案分離,使得容器化的應用程式具有可移植性。
創建配置檔案
新增一個 configure-pod-container/configmap
資料夾。
1 | mkdir -p configure-pod-container/configmap/ |
使用 kubectl create configmap 指令
基於檔案
下載範例檔到 configure-pod-container/configmap
資料夾中。
1 | wget https://kubernetes.io/examples/configmap/game.properties -O configure-pod-container/configmap/game.properties |
使用 kubectl create configmap
指令將 configure-pod-container/configmap
資料夾下的所有檔案,即 game.properties
檔和 ui.properties
檔打包到名為 game-config
的 ConfigMap 中。
1 | kubectl create configmap game-config --from-file=configure-pod-container/configmap/ |
查看 game-config
的詳細資訊。
1 | kubectl describe configmaps game-config |
輸出如下,game.properties
檔和 ui.properties
檔的內容會出現在 ConfigMap 的 Data 部分。
1 | Name: game-config |
以 YAML 的形式查看。
1 | kubectl get configmaps game-config -o yaml |
輸出類似以下內容:
1 | apiVersion: v1 |
在使用 --from-file
參數時,可以定義在 ConfigMap 的 Data 部分出現的鍵名,而不是使用預設的檔案名稱當做鍵名。
1 | kubectl create configmap game-config-special-key --from-file=game-special-key=configure-pod-container/configmap/game.properties |
以 YAML 的形式查看。
1 | kubectl get configmaps game-config-special-key -o yaml |
輸出類似以下內容:
1 | apiVersion: v1 |
基於環境變數檔
使用 --from-env-file
參數,可以從 ENV 檔(環境變數檔)創建 ConfigMap。
ENV 檔的語法規則如下:
- 每一行必須為
VAR=VAL
的格式。 - 以
#
符號開頭的行,視為註解,將被忽略。 - 空行將被忽略。
- 引號不會被特別處理(會直接成為 ConfigMap 值的一部分)。
下載範例檔案到 configure-pod-container/configmap
資料夾中。
1 | wget https://kubernetes.io/examples/configmap/game-env-file.properties -O configure-pod-container/configmap/game-env-file.properties |
將 ENV 檔打包到名為 game-config-env-file
的 ConfigMap 中。注意,當多次使用 --from-env-file
參數時,只會採取最後一個 ENV 檔的內容。
1 | kubectl create configmap game-config-env-file --from-env-file=configure-pod-container/configmap/game-env-file.properties |
以 YAML 的形式查看。
1 | kubectl get configmap game-config-env-file -o yaml |
輸出類似以下內容:
1 | apiVersion: v1 |
基於字面值
使用 --from-literal
參數,可以從指令指定的字面值創建。
1 | kubectl create configmap special-config --from-literal=special.how=very --from-literal=special.type=charm |
以 YAML 的形式查看。
1 | kubectl get configmaps special-config -o yaml |
輸出類似以下內容:
1 | apiVersion: v1 |
若要查看所有的 ConfigMap,使用以下指令:
1 | kubectl get configmaps |
基於生成器創建
自版本 1.14 開始,kubectl 開始支援 kustomization.yaml
檔。可以基於生成器創建 ConfigMap,然後將其應用於 API 伺服器上的創建物件。
基於檔案
例如,要從 configure-pod-container/configmap/game.properties
檔生成一個 ConfigMap:
1 | cat <<EOF >./kustomization.yaml |
使用 kubectl apply
指令創建 ConfigMap 物件:
1 | kubectl apply -k . |
- 生成的 ConfigMap 名稱具有通過對內容進行雜湊而附加的後綴,這樣可以確保每次修改內容時,都會生成新的 ConfigMap。
如果要定義在 ConfigMap 的 Data 部分出現的鍵名,而不是使用預設的檔案名稱當做鍵名:
1 | cat <<EOF >./kustomization.yaml |
創建 ConfigMap 物件:
1 | kubectl apply -k . |
基於環境變數檔
從指令指定的字面值創建。
1 | cat <<EOF >./kustomization.yaml |
創建 ConfigMap 物件:
1 | kubectl apply -k . |
基於字面值
從指令指定的字面值創建。
1 | cat <<EOF >./kustomization.yaml |
創建 ConfigMap 物件:
1 | kubectl apply -k . |
定義容器的環境變數
使用單個 ConfigMap 定義
先清除舊的 ConfigMap 的範例。
1 | kubectl delete pods --all |
創建名為 special-config
的 ConfigMap。
1 | kubectl create configmap special-config --from-literal=special.how=very |
使用 Pod 定義檔創建 Pod 資源。
1 | kubectl create -f https://kubernetes.io/examples/pods/pod-single-configmap-env-variable.yaml |
現在,此 Pod 的輸出會包含環境變數 SPECIAL_LEVEL_KEY=very
。
使用多個 ConfigMap 定義
先清除舊的範例。
1 | kubectl delete pods --all |
創建名為 special-config
和 env-config
的 ConfigMaps。
1 | kubectl create -f https://kubernetes.io/examples/configmap/configmaps.yaml |
使用 Pod 定義檔創建 Pod 資源。
1 | kubectl create -f https://kubernetes.io/examples/pods/pod-multiple-configmap-env-variable.yaml |
現在,此 Pod 的輸出會包含環境變數 SPECIAL_LEVEL_KEY=very
和 LOG_LEVEL=INFO
。
配置所有 ConfigMap 的鍵值對
先清除舊的範例。
1 | kubectl delete pods --all |
創建一個包含多個鍵值對的 ConfigMap:
1 | kubectl create -f https://kubernetes.io/examples/configmap/configmap-multikeys.yaml |
使用 envFrom
將所有 ConfigMap 的鍵值對定義為容器的環境變數。
1 | apiVersion: v1 |
使用 Pod 定義檔創建 Pod 資源。
1 | kubectl create -f https://kubernetes.io/examples/pods/pod-configmap-envFrom.yaml |
現在,此 Pod 的輸出會包含環境變數 SPECIAL_LEVEL=very
和 SPECIAL_TYPE=charm
。
在 Pod 定義檔使用 ConfigMap 定義的環境變數
先清除舊的範例。
1 | kubectl delete pods --all |
使用 $(VAR_NAME)
的替換語法在 Pod 定義檔的 command
中使用 ConfigMap 定義的環境變數。
1 | apiVersion: v1 |
使用 Pod 定義檔創建 Pod 資源。
1 | kubectl create -f https://kubernetes.io/examples/pods/pod-configmap-env-var-valueFrom.yaml |
現在,此 Pod 的容器會輸出 very charm
。
定義資料卷的環境變數
創建名為 special-config
的 ConfigMap。
1 | kubectl create -f https://kubernetes.io/examples/configmap/configmap-multikeys.yaml |
將 ConfigMap 中的資料添加到資料卷
先清除舊的範例。
1 | kubectl delete pods --all |
在 Pod 定義檔的 volumes
字段下添加 ConfigMap 名稱。這會將 ConfigMap 資料添加到指定為 volumeMounts.mountPath
的資料夾(範例為 /etc/config
)。command
字段引用儲存在 ConfigMap 中的 special.level
。
1 | apiVersion: v1 |
使用 Pod 定義檔創建 Pod 資源。
1 | kubectl create -f https://kubernetes.io/examples/pods/pod-configmap-volume.yaml |
現在 Pod 運行時,指令 ls /etc/config/
會產生以下輸出:
1 | SPECIAL_LEVEL |
將 ConfigMap 中的資料添加到資料卷中的特定路徑
先清除舊的範例。
1 | kubectl delete pods --all |
使用 path
字段為特定的 ConfigMap 項目指定預期的檔案路徑。在這裡,SPECIAL_LEVEL
將掛載在 config-volume
資料卷中 /etc/config/keys
資料夾下。
1 | apiVersion: v1 |
使用 Pod 定義檔創建 Pod 資源。
1 | kubectl create -f https://kubernetes.io/examples/pods/pod-configmap-volume-specific-key.yaml |
當 Pod 運行時,指令 cat /etc/config/keys
會產生以下輸出:
1 | very |
補充
ConfigMap 的 data
字段包含配置資料。它可以很簡單(如用 --from-literal
的單個屬性定義)或很複雜(如用 --from-file
的配置檔案)
1 | apiVersion: v1 |
限制
一些限制如下:
- 在 Pod 定義檔引用之前,必須先創建一個 ConfigMap(除非將 ConfigMap 標記為「可選的」)。如果引用的 ConfigMap 不存在,則 Pod 不會啟動。同樣,引用 ConfigMap 中不存在的鍵,也會阻止 Pod 啟動。
- 如果使用
envFrom
來定義環境變數,無效的鍵會被忽略。啟動 Pod 時,無效名稱會被記錄在事件日誌中,使用kubectl get events
指令可以進行查看。 - ConfigMap 位於特定的命名空間中,每個 ConfigMap 只能被相同命名空間中的 Pod 引用。
- 不能將 ConfigMap 用於靜態 Pod,Kubernetes 不支援這種用法。