Kubernetes概念详解之:subPath字段的使用原理及案例分析

Kubernetes概念详解之:subPath字段的使用原理及案例分析

有时,在单个 Pod 中共享卷以供多方使用是很有用的。volumeMounts.subPath 属性可用于指定所引用的 卷内的子路径,而不是其根路径。

这句话理解了,基本就懂subPath怎么用了,比如我们要替换nginx.cnf, 挂载的ConfigMap是一个文件夹,如果没有subPath,那/etc/nginx/nginx.cnf将变成一个文件夹,subPath是用来指定卷内子路径的!

subPath的使用有两种情况:

  1. 作为volumes使用时,subPath代表存储卷的子路径

  2. 作为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
相关推荐
更深兼春远2 小时前
第2篇:Dify 部署保姆级教程:用 Docker跑起来
docker·容器·dify
念何架构之路3 小时前
zap WriteSyncer与Sink体系
云原生·golang
小白的码BUG之路6 小时前
Docker -- No space left on device
运维·docker·容器
EatFan6 小时前
从云原生到AI原生:2026后端架构“三驾马车”(事件驱动、虚拟线程、AI Agent内嵌)演进解析
spring boot·云原生·架构·虚拟线程·ai-native·ai agent·spring ai
wzq11_6667 小时前
Kubernetes集群——Service篇(详细讲解!!!)
云原生·容器·kubernetes
程序员老陆7 小时前
Docker 命令全景指南:从镜像构建到生产运维
运维·docker·容器
Henry-SAP1 天前
SAP MRP失效根源业务角度解析
人工智能·云原生·sap·erp
江湖有缘1 天前
3款开源绘图工具整理合集,可Docker一键部署!
docker·容器·开源
nhdh1 天前
Higress:AI时代云原生网关新选择
人工智能·云原生
小匠石钧知1 天前
06_在k8s集群中安装MetalLB实现LoadBalancer
云原生·容器·kubernetes·service·loadbalancer·metallb