前言
本文為「Kubernetes 實作手冊:基礎入門篇」課程的學習筆記。
簡介
ConfigMap 是 Kubernetes 的一種 API 物件,用來將非機密性的資料保存到鍵值對中。使用時,Pod 可以將其用做環境變數、命令列參數,或者 Volume 中的配置檔案。
ConfigMap 將環境配置訊息和 Container 解耦,以便於應用配置的修改。
實作
以下使用 kind 的環境。
1 | cd vagrant/kind |
首先,查看範例資料夾中的 ConfigMap 配置檔。
1 | cat introduction/storage/configmap/conf.yaml |
配置檔如下:
1 | apiVersion: v1 |
使用配置檔創建 ConfigMap 資源。
1 | kubectl apply -f introduction/storage/configmap/conf.yaml |
查看 ConfigMap 列表。
1 | kubectl get cm |
檢查一下名為 config-test
的 ConfigMap。
1 | kubectl describe cm config-test |
Volume
查看範例資料夾中的 Deployment 配置檔,這是使用 Volume 的方式使用 ConfigMap。
1 | cat introduction/storage/configmap/pod-vol.yaml |
配置檔如下:
1 | apiVersion: apps/v1 |
使用配置檔創建 Deployment 資源。
1 | kubectl apply -f introduction/storage/configmap/pod-vol.yaml |
進到 Pod 中。
1 | kubectl exec -it config-vol-5455c65b48-fg4kc -- bash |
列出所有的 key 檔案。
1 | ls /tmp/config/ |
印出其中一個檔案。
1 | cat /tmp/config/version.date |
Env
查看範例資料夾中的 Pod 配置檔,這是使用 Env 的方式使用 ConfigMap。
1 | cat introduction/storage/configmap/pod-env.yaml |
配置檔如下:
1 | apiVersion: apps/v1 |
使用配置檔創建 Deployment 資源。
1 | kubectl apply -f introduction/storage/configmap/pod-env.yaml |
進到 Pod 中。
1 | kubectl exec -it config-env-7468975c6b-tshz2 -- bash |
列出所有的環境變數。
1 | env |
印出其中一個環境變數。
1 | env | grep -i version |
自動更新
進到名為 config-vol
的 Pod 中。
1 | kubectl exec -it config-vol-5455c65b48-fg4kc -- bash |
先使用 watch
指令監聽 yaml.config
檔。
1 | watch cat /tmp/config/yaml.config |
在另一個終端機視窗,將 conf.yaml
檔修改如下:
1 | apiVersion: v1 |
再套用一次 ConfigMap 資源。
1 | kubectl apply -f introduction/storage/configmap/conf.yaml |
過一陣子,yaml.config
檔的內容更新如下:
1 | Every 2.0s: cat /tmp/config/yaml.config Tue Jan 4 08:01:22 2022 |
至於容器中的應用程式是如何知道 ConfigMap 更新,需要透過其他方式去實現,例如使用 inotify 的方式去監聽特定檔案系統是否有檔案變動,來達到自動重載的功能。
補充
使用 Volume 來存取 ConfigMap 會比使用 Env 好,因為使用 Env 的情況下,容器內的環境變數可以透過節點的 /proc/$pid/environ
被存取;而使用 Volume 在預設情況下只有擁有使用 Docker 權限的使用者可以存取,多了一層保護。