You need to enable JavaScript to run this app.
文档中心
容器服务

容器服务

复制全文
下载 pdf
存储卷挂载
存储卷挂载概述
复制全文
下载 pdf
存储卷挂载概述
本文介绍如何在 VCI Agent Sandbox 场景下,使用存储卷挂载能力,实现 Sandbox 在预热池实例中 EFS、TOS 存储卷的预挂载与动态挂载,满足不同业务、不同租户对差异化存储的需求。​
功能介绍​
VCI Agent Sandbox 通常借助预热池(SandboxWarmPool)来加速实例创建,系统基于 SandboxTemplate 预先复刻一批处于 Running 状态的 Sandbox,当 SandboxClaim 发起认领请求时直接命中预热池实例,从而将启动耗时从数十秒缩短至亚秒级。但预热池实例基于同一套 SandboxTemplate 批量生产,无法提前预知不同业务、不同用户对存储卷的差异化需求,例如:​
  • 多租户场景下,不同租户的 Sandbox 需要挂载同一存储实例的不同子目录。​
  • 部分业务在创建 Sandbox 时才能确定容器内的挂载目录,无法在模板阶段提前声明。​
  • 多云部署架构的业务,已有 Annotation 中包含 mountPath 配置,希望低成本平移。​
为此,VCI Agent Sandbox 提供了存储卷挂载能力,并针对不同场景提供 预挂载 和 动态挂载 两种模式。​
根据存储卷挂载能力相关 Annotation 是否包含容器内挂载目录相关mountPath字段,系统自动区分两种互斥模式。​
​
模式​
触发条件​
核心能力​
预挂载(PreMount)​
所有 entry 均不含 mountPath。​
在模板预置 Volume 的基础上,SandboxClaim 认领沙箱实例时动态替换 PV 及子目录(subPath),mountPath 在模板中固定。​
动态挂载(Dynamic)​
所有 entry 均包含 mountPath。​
无需在模板中预置 Volume,SandboxClaim 认领沙箱实例时动态指定 mountPath,支持追加新 Volume 与 volumeMount。​
​
说明​
综上所述,VCI Agent Sandbox 的存储卷挂载能力遵循 mountPath 全有或全无原则,即同一条 Annotation 中,所有 entry 必须同时包含 mountPath,或同时不包含。部分包含、部分不包含将被直接拒绝,整个动态挂载配置不生效。​
技术架构​
两种模式在挂载组件形态与执行链路上有本质差异,直接决定了各自的安全边界与性能表现。​
预挂载模式架构​
预挂载模式下,Volume 与 volumeMount 在模板阶段即已声明,mountPath 在容器创建时固定。预热池阶段系统注入一个非特权的 VCI Sidecar 容器,该容器仅暴露有限的内部接口。SandboxClaim 认领沙箱实例时,控制器在 Sidecar 中执行指令,由 VCI 底层直接替换存储后端的 Endpoint,业务容器内的挂载点目录保持不变。​
该方案的关键特征如下:​
  • Sidecar 容器以非 root 用户运行,只读根文件系统,移除所有 Linux Capabilities,禁止提权(privilege escalation)。​
  • 不涉及宿主机目录共享,不使用双向挂载传播。​
  • 挂载动作由 VCI 可信组件完成,业务容器内无挂载执行权限。​
  • 凭证一次性传递,调用完成后 Sidecar 自动退出。​
动态挂载模式架构​
动态挂载模式需要在 Sandbox 中运行 CSI 存储挂载组件,VCI 采用 Hidecar(影子容器,一种隐式的 Sidecar)方案,由 VCI 控制面注入挂载组件,无需预置 Volume。预热池阶段系统识别到 Annotation 后,由 VCI 以 Hidecar 方式注入存储挂载组件,对 Virtual Kubelet 和终端用户完全不可见,从而在保留动态挂载灵活性的同时,最大限度减少攻击面。具体执行操作如下所示:​
  1. 注入 VCI 调度注解配置。​
  1. 注入 emptyDir 共享卷,用于在容器间传递 CSI 可执行文件、Socket、挂载根目录。​
  1. 注入 Hidecar 影子容器,以特权模式运行 CSI Driver。​
  1. 注入 Init 容器,将挂载所需的可执行文件分发到约定目录。​
SandboxClaim 认领沙箱实例时,控制器通过 Hidecar 通道执行命令,CSI Driver 完成实际存储挂载后,通过双向挂载传播将挂载点传播到共享目录,再由软链接(Symbolic Link,符号链接)映射到指定的 mountPath。整个过程中,Hidecar 容器对终端用户不可见、不可访问。​
Sidecar 与 Hidecar 两种方案的安全性对比如下:​
​
对比项​
Sidecar 方案​
Hidecar 方案(VCI 采用)​
可见性​
对 kubectl 可见,可使用 exec 命令进入容器。​
对 Virtual Kubelet 和终端用户完全不可见,无法使用 exec。​
攻击面​
特权容器暴露给用户,攻击面较大。​
特权组件对用户隐藏,攻击面显著减少。​
凭证安全​
AK/SK 等凭证经 Base64 编码传递,业务容器一定程度上可窥探 Sidecar 进程。​
Hidecar 独立托管存储凭证,业务容器无法访问其进程与文件系统。​
​
模式功能对比​
两种挂载模式的功能对比如下表所示。​
​
维度​
预挂载​
动态挂载​
mountPath​
模板中固定,不可修改。​
动态指定,可为容器内任意绝对路径。​
新增 Volume​
不支持新增,仅支持替换模板中已声明的卷。​
支持运行时追加新 Volume 与 volumeMount。​
subPath​
支持​
支持​
挂载组件形态​
VCI Sidecar 容器(非特权,完成后退出)。​
Hidecar 影子容器(特权,但对用户不可见)。​
支持存储类型​
EFS​
TOS​
执行链路​
gRPC 直连替换 Endpoint,链路短。​
CSI 挂载 + 双向传播 + 软链接,链路较长。​
多容器支持​
支持模板中声明的多个容器。​
当前仅支持单个主容器。​
​
模式风险对比​
两种挂载模式的风险对比如下表所示。​
​
风险维度​
预挂载​
动态挂载​
容器逃逸风险​
无风险,Sidecar 以非特权、非 root、主动丢弃所有 Capabilities(capabilities.drop=ALL)模式运行,无宿主机目录暴露风险。​
Hidecar 以特权模式运行并使用双向挂载传播,底层仍具备特权操作能力,但 Hidecar 对终端用户完全不可见、不可执行 exec 命令,终端用户无法直接接触目标容器或其宿主机目录,因此显著减少业务侧攻击面。​
风险主要来自容器运行时本身的潜在漏洞,建议配合运行时安全监控。​
跨租户数据隔离​
强隔离,挂载点由平台管控替换,业务容器无法干预挂载目标。​
系统对 subPath 做路径遍历校验,存储凭证由 Hidecar 独立托管,业务容器无法访问。​
建议配合存储层目录级权限(如ObjectSet/接入点策略),实现最小权限隔离。​
挂载点可靠性​
可靠性较高,挂载点在容器启动时建立,Sidecar 完成替换后退出,无后续依赖。​
挂载依赖 CSI 组件持续运行和软链接机制。当前版本不支持动态挂载与容器原地重启(in-place update)和可写层持久化同时使用,容器重启后需重新创建 Sandbox。​
性能开销​
开销低,gRPC 直连替换 Endpoint,单次操作毫秒级。​
开销相对较高,需执行 CSI 挂载流程(含 FUSE 文件系统挂载),耗时更长,预热池需额外运行 Hidecar 和 Init 容器。​
故障影响面​
挂载失败仅影响当前 Sandbox 认领,自动清理 Sandbox 实例后走冷启动。​
挂载失败会自动清理 Sandbox 实例并降级冷启动。Hidecar 对用户不可见,避免了用户误操作或恶意访问导致的故障扩散。​
说明​
动态挂载模式采用 Hidecar 方案后,用户侧已无法接触特权组件,安全性大幅优于可见 Sidecar 方案。但存储凭证(AK/SK)的权限粒度仍是安全基线,建议将凭证权限限制到具体挂载点或目录级别,避免使用超权限凭证,同时配合容器运行时安全监控(如异常 mount 系统调用检测),做深度防御。​
​
模式选型建议​
两种挂载模式的选型建议如下表所示。​
​
使用场景​
推荐方案​
挂载目录在 SandboxTemplate 阶段可确定,仅需在 SandboxClaim 认领沙箱实例时切换不同存储卷或子目录。​
使用预挂载模式,性能与安全性表现优异。​
多租户共享同一存储实例,通过 subPath 隔离不同租户目录。​
使用预挂载模式 + subPath 模式,一个 PV 服务多个子目录,无需为每个租户创建 PV。​
多云部署,已有业务 Pod Annotation 中包含 mountPath 且短期内无法改造。​
使用动态挂载模式,兼容 Kruise 协议,Hidecar 保障安全。​
挂载目录在运行沙箱时才能确定,无法在 SandboxTemplate 中提前声明。​
使用动态挂载模式。​
运行沙箱时需要追加 SandboxTemplate 中未声明的新存储卷。​
使用动态挂载模式。​
​
安全边界说明​
VCI Agent Sandbox 场景中使用存储卷挂载能力的数据安全边界说明如下:​
  • 预热池隔离:未被认领的预热池 Sandbox 虽已挂载 PVC,但其存储卷实际不可访问(访问时返回Transport endpoint is not connected)。只有在预挂载完成后,才能访问到新接入点的数据,从而防止租户访问预挂载目录。​
  • 数据安全:多租场景下需严格避免不同租户目录串用。预挂载任一环节异常时,系统会清理待认领的 Sandbox,防止中间态数据污染或泄露。​
最近更新时间:2026.09.18 16:01:27
这个页面对您有帮助吗?
有用
有用
无用
无用