apiVersion: v1
kind: ConfigMap
metadata:
name: test-config
data:
config.yml: |-
start-message: 'Hello, World!'
log-level: INFO
bootstrap.yml:
listen-address: '127.0.0.1:8080'
-
使用 configMapKeyRef 取用 ConfigMap 中某個檔案的內容作為 Pod 中容器的環境變數;
-
將所有 ConfigMap 中的檔案寫到一個臨時目錄中,將臨時目錄作為 Volume 掛載到容器裡,也就是 ConfigMap 型別的 Volume;
-
最好是在當 ConfigMap 發生變更時,直接進行熱更新,從而做到不影響 Pod 的正常執行
-
假如無法熱更新或熱更新完成不了需求,就需要觸發對應的 Deployment 做一次滾動更新
-
假如應用對配置熱更新有實時性要求,那麼就需要在業務邏輯裡自己到 ApiServer 上去 watch 對應的 ConfigMap 來做更新。或者,乾脆不要用 ConfigMap,換成 etcd 這樣的一致性 KV 儲存來管理配置;
-
假如沒有實時性要求,那我們其實可以依賴 ConfigMap 本身的更新邏輯來完成配置熱更新。
-
應用本身沒有實現熱更新邏輯,而一般來說自己寫的大部分應用都不會特意去設計這個邏輯;
-
使用 subPath 進行 ConfigMap 的掛載,導致 ConfigMap 無法自動更新;
-
在環境變數或 init-container 中依賴了 ConfigMap 的內容;
...
spec:
template:
metadata:
annotations:
com.aylei.configmap/hash: ${CONFIGMAP_HASH}
...
-
Reloader:https://github.com/stakater/Reloader
-
ConfigmapController:https://github.com/fabric8io/configmapcontroller
-
k8s-trigger-controller:https://github.com/mfojtik/k8s-trigger-controller