一.subpath簡單說明
在Pod中共享卷以供多方使用是很有用的。VolumeMounts.subPath屬性可用於指定所引用的卷內的子路徑,而不是其根路徑。
二.subpath使用場景
- 1個Pod中可以有多個容器,這里將不同容器的路徑掛載在存儲卷volume的子路徑,這種場景需要使用到subpath。
- volume支持將configMap/secret掛載到容器的路徑,但是會覆蓋容器路徑下原有的文件。如何支持選定configmap/secret的key-value掛載到容器中,且不會覆蓋掉原目錄下的文件,這個時候可以用subpath。
2.1 存儲卷掛載
# 這里我們提前創建好一個PVC-CLAIM名稱為pvc-subpath
[root@k8s001 subpath]# cat pvc.yaml
---
kind: PersistentVolume
apiVersion: v1
metadata:
name: pv-subpath
labels:
release: stable
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
hostPath:
path: /mnt/yuhaohao # 這個是宿主機真實存在的目錄
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-subpath
namespace: default
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 10Gi
[root@k8s001 subpath]# kubectl apply -f pvc.yaml
[root@k8s001 ~]# cat subpath.yaml
[root@k8s001 subpath]# cat subpath.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-subpath-yuhaohao
spec:
containers:
- name: redis-container
image: redis
volumeMounts:
- mountPath: /var/lib/redis # 容器1的掛載目錄
name: subpath-volume # 這里指定pvc的volume名稱
subPath: redispvc # 存儲卷pvc-subpath要掛載的/mnt/yuhaohao的子目錄
- name: nginx-container
image: nginx
volumeMounts:
- mountPath: /var/www/nginx # 容器2的掛載目錄
name: subpath-volume # 這里指定pvc的volume名稱
subPath: nginxpvc # 存儲卷pvc-subpath要掛載的/mnt/yuhaohao的子目錄
volumes:
- name: subpath-volume
persistentVolumeClaim:
claimName: pvc-subpath # PVC的名字
[root@k8s-master zhanglei]# kubectl create -f subpath.yaml
[root@k8s001 subpath]# kubectl get pod
NAME READY STATUS RESTARTS AGE
pod-subpath-yuhaohao 2/2 Running 0 106s
[root@k8s001 yuhaohao]# pwd
/mnt/yuhaohao
[root@k8s001 yuhaohao]# ls
nginxpvc redispvc
2.2 configmap掛載
2.2.1 創建configmap
[root@k8s001 subpath]# cat configmap.yaml
---
apiVersion: v1
kind: ConfigMap
metadata:
name: configmap-subpath
namespace: default
data:
example.property.1: hello # key-value鍵值對
example.property.2: world
example.property.file: |-
property.1=value-1
property.2=value-2
property.3=value-3
[root@k8s001 subpath]# kubectl apply -f configmap.yaml
configmap/configmap-subpath created
[root@k8s001 subpath]# kubectl get cm
NAME DATA AGE
configmap-subpath 3 35s
[root@k8s001 subpath]# cat pod-configmap.yaml
apiVersion: v1
kind: Pod
metadata:
name: configmap-subpath-test
labels:
purpose: configmap-subpath-test
spec:
containers:
- name: configmap-subpath-test
image: nginx
volumeMounts:
- name: config-volume
mountPath: /etc/nginx/example.property.1 # 容器掛載的目錄路徑為容器的/etc/nginx,文件名為example.property.1
subPath: example.property.1 # 將key名稱作為文件名,hello作為文件內容
volumes:
- name: config-volume
configMap:
name: configmap-subpath # 指定使用哪個CM
[root@k8s001 subpath]# kubectl apply -f pod-configmap.yaml
pod/configmap-subpath-test created
[root@k8s001 subpath]# kubectl get pod
NAME READY STATUS RESTARTS AGE
configmap-subpath-test 1/1 Running 0 7s
[root@k8s001 subpath]# kubectl exec configmap-subpath-test cat /etc/nginx/example.property.1
hello