文章目錄
- k8s熱更新-subPath 不支持熱更新
- 背景
- subPath 不支持熱更新
- 1. 為什么 subPath 不支持熱更新?
- 2. 掛載整個目錄為何支持熱更新?
- 使用demo舉例:掛載整個目錄(不使用 subPath)
k8s熱更新-subPath 不支持熱更新
背景
在 Kubernetes 中,Pod 可以通過 Volume 將宿主機(或 PV/PVC)中的文件/目錄掛載到容器內。
subPath 是一個常用的功能,允許你只掛載 Volume 的某一個子目錄或文件到容器的指定路徑。
使用 subPath 存在一個容易踩坑的問題:熱更新(文件在宿主或 PVC 中發生變化,容器內不會感知)。實在有 subPath 的場景,通過重啟 Pod 方式實現刷新掛載。
subPath 不支持熱更新
官方文檔:https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/#mounted-configmaps-are-updated-automatically
- 只有目錄掛載才支持熱更新,subPath 方式熱更新無效。
將熱更新配置與非熱更新配置分離到不同 ConfigMap,是推薦的 Kubernetes 最佳運維實踐。
- 主配置還是 subPath 就好,防止熱更新誤操作和觸發程序 reload。
1. 為什么 subPath 不支持熱更新?
-
subPath 文件掛載時,Kubernetes 會在 Pod 啟動時,將指定的 ConfigMap/Secret 文件拷貝一份到容器的本地文件系統(通常是臨時目錄)。
-
這個本地物理文件和 ConfigMap/Secret 之間不再有鏈接,后者發生內容變化不會影響這份副本。
-
目的是防止多個 subPath 指向同一份數據時的可疑行為,且保證容器文本獨立性。
-
所以無論你 kubectl apply 或 helm upgrade 更新 ConfigMap,subPath 文件內容都不會熱更新,除非重啟/重建 Pod。
2. 掛載整個目錄為何支持熱更新?
mountPath:批量掛載目錄,支持自動更新(需配合應用或工具)。
- 如果你把整個目錄 mount 到容器(不用 subPath),其實是把一個由 kubelet 管理的 “投影目錄” 映射進容器。
- ConfigMap/Secret 變更時,kubelet 會自動在該目錄生成新版本臨時文件,并切換符號鏈接,所有容器中讀取到的就是最新內容。
使用demo舉例:掛載整個目錄(不使用 subPath)
ConfigMap 可作為 volume 掛載到容器
優點:掛載目錄內的任何變化都能同步給容器(支持熱更新)。
apiVersion: v1
kind: Pod
metadata:name: configmap-pod
spec:containers:- name: mycontainerimage: nginxvolumeMounts:- name: config-volumemountPath: /etc/config # 目錄volumes:- name: config-volumeconfigMap:name: my-configmap # 使用的 ConfigMap 名