Kubernetes概念详解之:subPath字段的使用原理及案例分析
有时,在单个 Pod 中共享卷以供多方使用是很有用的。volumeMounts.subPath 属性可用于指定所引用的 卷内的
子路径,而不是其根路径。
这句话理解了,基本就懂subPath怎么用了,比如我们要替换nginx.cnf, 挂载的ConfigMap是一个文件夹,如果没有subPath,那/etc/nginx/nginx.cnf
将变成一个文件夹,subPath是用来指定卷内子路径的!
subPath的使用有两种情况:
-
作为volumes使用时,subPath代表存储卷的子路径
-
作为configmap/secret使用时,subPath代表configmap/secrect的子路径
1. 作为volumes使用时
yaml文件
yaml
apiVersion: v1
kind: Pod
metadata:
name: testpod0
spec:
containers:
- name: testc
image: busybox
command: ["/bin/sleep","10000"]
volumeMounts:
- name: data
mountPath: /opt/data # 挂载的路径
subPath: data # volume的子路径
mountPath: /opt/model
subPath: model
volumes:
- name: data
hostPath:
path: /opt/
上述情况下,数据卷使用了hostPath的类型,并定义path为宿主机的/opt/路径。在容器的volumeMounts挂载配置上,使用了subPath配置来指定将数据卷的/opt/data子目录和/opt/model子目录,分别挂载到容器的/opt/data目录和/opt/model目录。
使用数据卷内子路径的好处就是可以在容器中灵活地选择需要挂载的数据卷的部分内容,避免将整个数据卷都挂载到容器中造成资源浪费,并且可以方便地控制容器中的文件路径和内容。
2. 作为configmap/secrect使用时
以文件形式挂载configMap以及挂载secret和挂载普通文件同样道理,可以把 configMap和secret当做卷的根目录,configMap和secret中的key作为 subpath 指定的文件名。此时若是 configMap和secret中key名称为subpath的值,以及和volumeMounts.mountPath文件名保持一致,那么容器中看到挂载的文件就是configMap和secret的key。
yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: config-test
data:
config.ini: "hello"
config.conf: "nihao"
单独挂载一个key为文件
yaml
apiVersion: v1
kind: Pod
metadata:
name: testpod
spec:
containers:
- name: testc
image: busybox
command: ["/bin/sleep","10000"]
volumeMounts:
- name: config-test
mountPath: /etc/config.ini # 最终在容器中的文件名
subPath: config.ini #要挂载的confmap中的key的名称
volumes:
- name: config-test
configMap:
name: config-test
上述yaml配置文件中,volumes属性将configMap作为数据卷,并在容器中设置了mountPath: /etc/config.ini
和subPath: config.ini
。其中subPath
指定了容器挂载点要获取的configMap键值,mountPath
指明了该键值的挂载路径。
上述这种将subPath
获取的key值与挂载路径的文件名写成一致的书写方式,是写subPath子路径的一种比较标准的写法。当然,这个挂载的文件名和subPath的key值可以写成不同的。
挂载多个key为文件:
yaml
apiVersion: v1
kind: Pod
metadata:
name: testpod2
spec:
containers:
- name: testc
image: busybox
command: ["/bin/sleep","10000"]
volumeMounts:
- name: config-test
mountPath: /etc/config.ini # 最终在容器中的文件名
subPath: config.ini #要挂载的confmap中的key的名称
mountPath: /etc/config.conf # 最终在容器中的文件名
subPath: config.conf #要挂载的confmap中的key的名称
volumes:
- name: config-test
configMap:
name: config-test
多个container挂载不同的key:
yaml
apiVersion: v1
kind: Pod
metadata:
name: testpod1
spec:
containers:
- name: testc
imagePullPolicy: Never
image: busybox
command: ["/bin/sleep","10000"]
volumeMounts:
- name: config-test
mountPath: /etc/config/config.ini
subPath: config.ini
- name: testc1
imagePullPolicy: Never
image: busybox
command: ["/bin/sleep","10000"]
volumeMounts:
- name: config-test
mountPath: /etc/config/config.conf
subPath: config.conf
volumes:
- name: config-test
configMap:
name: config-test
items:
- key: config.ini
path: config.ini
- key: config.conf
path: config.conf