使用 subPath

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

下面例子展示了如何配置某包含 LAMP 堆栈(Linux Apache MySQL PHP)的 Pod 使用同一共享卷。 此示例中的 ​​subPath​​​ 配置不建议在生产环境中使用。 PHP 应用的代码和相关数据映射到卷的 ​​html​​​ 文件夹,MySQL 数据库存储在卷的 ​​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

 

 

使用带有扩展环境变量的 subPath

特性状态: ​​Kubernetes v1.17 [stable]​

使用 ​​subPathExpr​​​ 字段可以基于 downward API 环境变量来构造 ​​subPath​​​ 目录名。 ​​subPath​​​ 和 ​​subPathExpr​​ 属性是互斥的。

在这个示例中,​​Pod​​​ 使用 ​​subPathExpr​​​ 来 ​​hostPath​​​ 卷 ​​/var/log/pods​​​ 中创建目录 ​​pod1​​​。 ​​hostPath​​​ 卷采用来自 ​​downwardAPI​​​ 的 Pod 名称生成目录名。 宿主目录 ​​/var/log/pods/pod1​​​ 被挂载到容器的 ​​/logs​​ 中。

apiVersion: v1
kind: Pod
metadata:
name: pod1
spec:
containers:
- name: container1
env:
- name: POD_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.name
image: busybox:1.28
command: [ "sh", "-c", "while [ true ]; do echo 'Hello'; sleep 10; done | tee -a /logs/hello.txt" ]
volumeMounts:
- name: workdir1
mountPath: /logs
# 包裹变量名的是小括号,而不是大括号
subPathExpr: $(POD_NAME)
restartPolicy: Never
volumes:
- name: workdir1
hostPath:
path: /var/log/pods