当需要将存储的特定子目录直接挂载至工作负载以实现高效数据存储时,云容器引擎提供了多种实现方式以支持该能力。
需求场景
当用户创建大容量文件存储时,为充分利用现有资源,可将不同子目录分配给多个工作负载使用。
若需实现数据层面的权限控制,可限制容器仅访问指定子目录。
对于习惯开源NFS使用方式的用户,可在已有文件存储基础上,通过为不同子目录创建独立的PVC并分配给对应工作负载,实现资源隔离。
每个工作负载拥有不同的子目录的方式便于管理,且可通过Pod名称区分子目录,提升运维效率。
方案选择
有以下两种方案:
(1)复用现有存储:用户已有的存储对应一个PVC,无需额外创建PVC,可将同一PVC下的不同子目录分配给多个工作负载使用。
(2)动态分配子目录:用户使用海量文件存储时,每次可为不同工作负载动态分配一个子目录作为独立PVC。(注:此功能仅海量文件存储支持,其他存储产品不适用于子目录挂载场景。)
方案一:子目录挂载(多个子目录共享同一PVC)
在工作负载的数据存储配置界面,设置挂载路径为 /test,即存储卷将挂载至容器内的 /test 目录。子路径可选择 subPath 或 subPathExpr 模式。
subPath:简单直接,工作负载的所有副本均使用存储卷的同一子目录。
subPathExpr:支持通过环境变量动态调整子目录路径,实现同一工作负载中不同副本使用独立子目录。
若选择 subPath,直接填写子目录名称即可;若目录不存在,K8S会自动创建。若选择 subPathExpr,需按以下方式配置:
在第二个绿色箭头所指的框中,根据实际需求填写路径表达式。例如可使用 $(POD_NAMESPACE)/$(POD_NAME) 或 $(POD_NAME),也支持自定义格式。此处以 $(POD_NAMESPACE)/$(POD_NAME) 为例,需确保相关变量已在环境变量中预先定义。
根据以上示例,红框处需正确填写变量名,绿框处需选择变量值的来源。即从Pod的metadata.name字段获取POD_NAME变量值,从metadata.namespace字段获取POD_NAMESPACE变量值,并组合为存储的子目录路径。
例如:一个两副本的无状态工作负载位于命名空间cstor下,Pod名称分别为podA和podB。按此配置后,一个副本会将PVC对应存储下的cstor/podA子目录挂载至容器内的/test路径,另一副本则挂载cstor/podB子目录至相同路径。
若通过工作负载的YAML文件实现,相关字段配置如下:
volumeMounts:
- name: workdir1
mountPath: /logs
subPathExpr: $(POD_NAMESPACE)/$(POD_NAME)yaml的env的设置如下:
spec:
containers:
- name: container1
env:
- name: POD_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
方案二:PVC挂载(每个子目录对应独立PVC)
此方案仅适用于海量文件存储,旨在帮助用户复用现有存储资源。在已有存储基础上划分多个子目录,每个子目录可作为独立PVC供工作负载使用。需先创建海量文件存储类,并选择已购买的海量文件作为底层存储分配基础.
在方案2流程选择新建的这个存储类,如下图所示:
当子目录设置为根路径 / 时,系统将自动创建一个以PV名称为命名的子目录(对用户透明)。用户可通过指定PV名称生成对应的PVC以供使用,从而节省资源开销。
若不通过控制台操作,建议参考 使用OceanFS动态存储卷(subPath模式)进行配置。