本文介绍如何在 VCI Agent Sandbox 场景下,使用存储卷挂载能力,实现 Sandbox 在预热池实例中预挂载(PreMount)存储卷,满足不同业务、不同租户对差异化存储的需求。
预挂载模式在模板阶段固定挂载目录(mountPath),SandboxClaim 认领沙箱实例时仅动态替换存储卷(PV)与子目录(subPath),适用于挂载目录可提前确定的场景。预挂载模式当前仅支持基于 FSX + EFS 类型存储卷。
预挂载能力通过在 SandboxTemplate 与 SandboxClaim 上添加 Annotation 声明来开启和配置。核心 Annotation 说明如下所示。
使用 EFS 存储卷预挂载能力时,请注意以下限制。
- VCI 业务集群中已安装 VCI Agent Sandbox 对应的组件:agent-sandbox,用于支持 SandboxTemplate / SandboxWarmPool / SandboxClaim 等 CRD。详细操作,请参见 安装指南。
- 已为 EFS 接入点配置策略,控制不同身份对文件系统特定目录的访问权限。详细操作,请参见 配置接入点策略。
本文以初始 PV 与目标 PV 来自不同 EFS 为示例,演示完整的预挂载流程。若目标 PV 与初始 PV 来自同一个 EFS(不同子目录),只需将目标 PV 的server改为同一接入点域名、path改为不同子目录即可,其余步骤完全一致。
通过 Secret 管理访问 EFS 的凭证。若目标 PV 与初始 PV 使用不同的访问凭证,请分别为两个 EFS 创建对应的 Secret。
- 创建 Secret 的 YAML 文件。示例 YAML 文件efs-fsx-secret.yaml内容如下所示。
说明
您可以使用echo -n "${ak}" | base64命令对 AK、SK 等进行 Base64 编码,并将下方代码中的所有******替换为您自己的实际值。更多 Base64 编码说明,请参见 FAQ。 初始 PV 是 SandboxTemplate 中预挂载的存储卷,对应 Sandbox 被认领前默认挂载的 EFS 目录。初始 PV 可以挂载 EFS 的根目录,也可以挂载任意子目录。下文以挂载 EFS-A 的/tenant-initial目录为例。
- 创建初始 PV 的 YAML 文件。示例 YAML 文件pv-efs-initial.yaml内容如下所示。
- 创建初始 PVC 的 YAML 文件,静态绑定到初始 PV。示例 YAML 文件pvc-efs-initial.yaml内容如下所示。
- 执行以下命令,创建初始 PV 和 PVC,并确认绑定状态。
- 预期输出中STATUS为Bound,表示 PVC 与初始 PV 静态绑定成功。
- (可选)在初始 EFS 目录中放置标记文件,用于后续验证切换前的状态。例如在 EFS-A 的/tenant-initial目录下创建from-initial.txt文件。详细操作,请参见 挂载文件系统。
步骤三:创建 SandboxTemplate 并预挂载初始 PVC
- 创建 SandboxTemplate,并在 podTemplate 的 Annotations 中通过vke.volcengine.com/dynamic-mount-volume-name声明需要预挂载的 Volume 名称。示例 SandboxTemplate YAML 文件efs-demo-template.yaml内容如下所示。
- 执行以下命令,创建 SandboxTemplate。
步骤四:(可选)创建 SandboxWarmPool
如需使用预热池加速认领,可创建 SandboxWarmPool 引用上述 SandboxTemplate 预热沙箱实例。若不创建预热池,SandboxClaim 将直接走冷启动流程创建沙箱实例,启动耗时较长但最终挂载效果一致。
- 创建 SandboxWarmPool,示例 YAML 文件efs-demo-warmpool.yaml内容如下所示。
- 执行以下命令创建 SandboxWarmPool。
目标 PV 是 SandboxClaim 认领时要动态替换成的存储卷。目标 PV 可以与初始 PV 来自同一个 EFS(不同子目录),也可以来自完全不同的 EFS 文件系统,两者的区别仅在于 PV 的server和path是否相同。下文以挂载 EFS-B 的/tenant-target目录(与初始 PV 来自不同 EFS)为例。
- 创建目标 PV 的 YAML 文件。示例 YAML 文件pv-efs-target.yaml代码内容如下所示。
- (可选)在目标 EFS 目录中放置标记文件,用于后续验证切换后的状态。例如在 EFS-B 的/tenant-target目录下创建from-target.txt。详细操作,请参见 挂载文件系统。
步骤六:创建 SandboxClaim 并指定目标 PV
在 SandboxClaim 中通过 Annotations:vke.volcengine.com/dynamic-volume-mount-config指定要替换的目标 PV。
注意
- SandboxClaim 命中预热池时走热启动认领流程,未命中时自动降级为冷启动,两者最终替换效果一致。
- 认领失败时系统会清理 Sandbox、不再复用,防止中间态数据污染或泄露。
- 创建 SandboxClaim,示例 YAML 文件efs-demo-claim.yaml内容如下所示。
通过标记文件与接入点信息验证初始 PV 是否被目标 PV 成功替换。下文示例中,目标 PV(pv-efs-target)对应 EFS-B 的/tenant-target目录,其中预置了标记文件from-target.txt。初始 PV(pv-efs-initial)对应 EFS-A 的/tenant-initial目录,其中预置了标记文件from-initial.txt。
- 执行以下命令,确认已挂载目标 EFS 目录的标记文件。
- 执行以下命令,确认初始 EFS 目录的标记文件已不可见,即证明挂载点已从初始 PV 切换到目标 PV,初始 EFS 目录不再可见。
- 预期输出结果如下,挂载源为目标 EFS 子目录对应的接入点域名,即表明卷对应的 PV 已切换。
- 此外,可在 Controller 日志中观测到完整的认领与挂载链路,关键节点依次为:
- Attempting sandbox adoption
- Performing dynamic volume mount
- Executing volume mount command via k8s exec
- Volume mount command executed successfully
- Successfully adopted sandbox from warm pool