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.inisubPath: 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
相关推荐
容器魔方3 小时前
中选名单出炉|18位学生入选开源之夏KubeEdge课题,欢迎加入!
云原生·容器·云计算
love530love5 小时前
Docker 稳定运行与存储优化全攻略(含可视化指南)
运维·人工智能·windows·docker·容器
人生匆匆5 小时前
docker进入启动失败的容器
运维·docker·容器
退役小学生呀6 小时前
十、K8s集群资源合理化分配
linux·云原生·容器·kubernetes·k8s
yanjiaweiya7 小时前
云原生-集群管理
java·开发语言·云原生
yanjiaweiya10 小时前
云原生-集群管理续
java·开发语言·云原生
Johny_Zhao15 小时前
Docker + CentOS 部署 Zookeeper 集群 + Kubernetes Operator 自动化运维方案
linux·网络安全·docker·信息安全·zookeeper·kubernetes·云计算·系统运维
代码老y18 小时前
Docker:容器化技术的基石与实践指南
运维·docker·容器
掘金-我是哪吒1 天前
分布式微服务系统架构第156集:JavaPlus技术文档平台日更-Java线程池使用指南
java·分布式·微服务·云原生·架构
阿里云云原生1 天前
Serverless JManus: 企业生产级通用智能体运行时
云原生