配置文件掛載到 K8s 的 Pod 中有多種方式,可以用 hostPath 的方式將配置文件掛載到容器內,這種方式如果配置文件比較經常修改就不太適用,修改配置文件後,需要重新build 和部署鏡像才能使修改生效。比較推薦的是用 configMap 的方式來掛載配置。使用 configMap 方式掛載的配置,可以通過 kubectl edit cm xxxx-config
來修改配置,然後 kubectl delete pods xxxxx
後, pod 自動重啓後生效配置。
問題
以 configMap 方式掛載配置默認是將 configMap 中的配置掛載到某個 目錄
下,比如下面的配置會把 configMap 中的 config.json 配置掛載到 /myproject/config1/config.json
,而且有個附帶的效果,如果之前有其他的文件通過 COPY
命令 COPY 到了/myproject/config/下面,這些文件會被抹去。
containers:
- image: alpine:latest
name: myproject
volumeMounts:
- mountPath: /myproject/config1/
name: myproject
volumes:
- name: myproject
configMap:
items:
- key: config.json
path: config.json
例子
比如 COPY
了另外一個配置文件 test.json
到 /myproject/config1/目錄下,然後通過上面的 configMap 方式掛載主要的配置文件 config.json 到 /myproject/config1/config.json
,結果config1下原本的 test.json
被刪除了。
解決方法
如何才能夠以文件的方式來掛載 configMap 中的配置呢?怎麼把 configMap 中的配置掛載到 /myproject/config1/config.json
並且不刪除 /myproject/config1/
目錄下的其他配置呢?可以通過 subPath 來實現,添加 subPath: config.json
配置,同時需要修改 mountPath, mountPath: /myproject/config1/
-> mountPath: /myproject/config1/config.json
詳見如下配置:
containers:
- image: alpine:latest
name: myproject
volumeMounts:
- mountPath: /myproject/config1/config.json
subPath: config.json
name: myproject
volumes:
- name: myproject
configMap:
items:
- key: config.json
path: config.json
通過這種方式掛載後是不會刪除 /myproject/config1/
目錄下的其他配置的。