概述
Kubernetes中什么是Subpath
有时,在单个 Pod 中共享卷以供多方使用是很有用的。volumeMounts.subPath
属性可用于指定所引用的卷内的子路径,而不是其根路径。
什么时候应该使用 Subpath
- 场景一: 一个共享卷, 挂载多个路径.
- 场景二: ConfigMap或Secret挂载到特定目录的特定路径, 而 该目录下已经有其他文件且不希望被覆盖掉
如何使用Subpath
场景一示例: 一个共享卷, 挂载多个路径.
典型的应用场景示例就是Kubernetes官方的示例:
代码语言:javascript复制一个使用同一共享卷的、内含 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
场景二示例: ConfigMap或Secret挂载到特定目录的特定路径
例如, 我希望将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