

Subpath有时,在单个 Pod 中共享卷以供多方使用是很有用的。volumeMounts.subPath 属性可用于指定所引用的卷内的子路径,而不是其根路径。
SubpathSubpath典型的应用场景示例就是Kubernetes官方的示例:
一个使用同一共享卷的、内含 LAMP 栈(Linux Apache Mysql PHP)的 Pod 的示例。HTML 内容被映射到卷的
html文件夹,数据库将被存储在卷的mysql文件夹中:
apiVersion: v1
kind: Pod
metadata:
  name: my-lamp-site
spec:
    containers:
    - name: mysql
      image: mysql
      env:
      - name: MYSQL_ROOT_PASSWORD
        value: "rootpasswd"
      volumeMounts:
      - mountPath: /var/lib/mysql
        name: site-data
        subPath: mysql
    - name: php
      image: php:7.0-apache
      volumeMounts:
      - mountPath: /var/www/html
        name: site-data
        subPath: html
    volumes:
    - name: site-data
      persistentVolumeClaim:
        claimName: my-lamp-site-data例如, 我希望将setenv.sh这样的一个初始化配置环境变量的脚本挂载到tomcat的bin目录: /opt/tomcat/bin下.
如果我不使用subpath, 直接将该ConfigMap 挂载到/opt/tomcat/bin目录下, 那么该目录下已有的文件全部被覆盖.
所以正确的做法是使用Subpath进行挂载:
apiVersion: v1
kind: Pod
metadata:
  name: tomcat
spec:
    containers:
    - name: tomcat
      image: tomcat
      volumeMounts:
      - mountPath: /opt/tomcat/bin/setenv.sh
        name: volume-env
        subPath: setenv.sh
    volumes:
    - name: volume-env
        configMap:
          name: env-config
          defaultMode: 420最终挂载效果如下图所示:

特别注意mountPath和subPath的写法, 最后的path要保持一致.
如mountPath是: /opt/tomcat/bin/setenv.sh; subPath是: setenv.sh.
mountPath不要漏写为: /opt/tomcat/bin/
      - mountPath: /opt/tomcat/bin/setenv.sh
        subPath: setenv.sh