詳解k8s ConfigMap 中 subPath 字段和 items 字段
Kubernetes中什麼是subPath
有時,在單個 Pod 中共享卷以供多方使用是很有用的。volumeMounts.subPath 屬性可用於指定所引用的卷內的
子路徑,而不是其根路徑。
這句話理解瞭,基本就懂subPath怎麼用瞭,比如我們要替換nginx.cnf, 掛載的ConfigMap是一個文件夾,如果沒有subPath,那
/etc/nginx/nginx.cnf
將變成一個文件夾,subPath是用來指定卷內子路徑的! 按照邏輯subPath應該在volumes下進行設置會比較合理,這可能就是它不好理解的根本原因。
什麼時候應該使用 subPath
- 場景一: 一個共享卷, 掛載多個路徑.
- 場景二: ConfigMap或Secret掛載到特定目錄的特定路徑, 而該目錄下已經有其他文件且不希望被覆蓋掉
1. subPath字段的作用
在Linux中,將目錄A掛載到目錄B,則目錄B原有的文件都會被目錄A下的文件覆蓋。
那麼在k8s中,如何將configmap掛載到容器中某個目錄的文件中呢?答案是使用subPath
。
subPath可以將configMap和secret作為文件掛載到容器中而不覆蓋掛載目錄下的文件。
話不多說,直接看一個例子。
制作案例鏡像:
dockerfile:
FROM busybox WORKDIR /workspace RUN touch a.txt b.txt c.txt
切換到dockerfile目錄下執行:
docker build -t mydocker:latest . docker tag mydocker:latest zengfeng666/mydocker:1.0 docker push zengfeng666/mydocker:1.0
configmap.yaml
apiVersion: v1 kind: ConfigMap metadata: name: configmap namespace: dev data: info: | username:admin password:123456 info2: zhangssssssssssssssssssssssssss
pod1.yaml
apiVersion: v1 kind: Pod metadata: name: pod1 namespace: dev spec: containers: - name: mydocker image: zengfeng666/mydocker:1.0 command: ["/bin/sh", "-c", "while true; do sleep 2; done;"] volumeMounts: - name: config mountPath: /workspace volumes: - name: config configMap: name: configmap
pod2.yaml
apiVersion: v1 kind: Pod metadata: name: pod2 namespace: dev spec: containers: - name: mydocker image: zengfeng666/mydocker:1.0 command: ["/bin/sh", "-c", "while true; do sleep 2; done;"] volumeMounts: - name: config mountPath: /workspace/info subPath: info - name: config mountPath: /workspace/info2 subPath: info2 volumes: - name: config configMap: name: configmap
$ kubectl create -f pod1.yaml $ kubectl create -f pod2.yaml $ kubectl get pods -n dev NAME READY STATUS RESTARTS AGE pod1 1/1 Running 0 2m20s pod2 1/1 Running 0 14s
可以看到,因為pod1中是將configmap直接掛載到瞭容器的workspace目錄,由於Linux的目錄掛載特性(可以看這篇:什麼是掛載,Linux掛載詳解),原來的workspace目錄下的文件將會被掛載過來的目錄下(可以將configmap看成一個目錄,因為每個key都是一個文件)的文件所覆蓋,因此workspace中隻有configmap中的info和info2文件。如果不想被覆蓋,則要以文件的方式進行掛載,如pod2.yaml中所示,註意mountPath和subPath的寫法,subPath此時指的就是configMap中的key,也就是文件名。
2. items字段的作用
假如不想以key名作為配置文件名可以引入items 字段,在其中逐個指定要用相對路徑path替換的key:
volumes: - name: config configMap: name: configmap items: - key: info # 原文件名(key的名稱) path: userinfo # 修改之後的文件名(key的名稱) - key: info2 path: userinfo2
items還有一個作用,就是隻有items下的key對應的文件會被掛載到容器中。
比如pod1.yaml中不想把info和info2都掛載到workspace目錄下,而隻需要掛載info到workspace目錄下,則可以將pod1.yaml的volumes字段修改為:
volumes: - name: config configMap: name: configmap items: - key: info path: info
到此這篇關於詳解k8s ConfigMap 中 subPath 字段和 items 字段的文章就介紹到這瞭,更多相關k8s subPath和 items內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Kubernetes k8s configmap 容器技術解析
- 關於k8s中subpath的使用詳解
- kubernetes之statefulset搭建MySQL集群
- kubernetes環境部署單節點redis數據庫的方法
- 手動部署java項目到k8s中的實現