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

容器服务

复制全文
下载 pdf
存储卷挂载
动态挂载(Dynamic)
复制全文
下载 pdf
动态挂载(Dynamic)
本文介绍如何在 VCI Agent Sandbox 场景下,使用存储卷挂载能力,实现 Sandbox 在预热池实例中动态挂载(Dynamic)存储卷,满足不同业务、不同租户对差异化存储的需求。​
功能说明​
动态挂载模式无需在模板中预置 Volume,SandboxClaim 认领沙箱实例时指定容器内挂载目录(mountPath),并支持追加新的 Volume 与 volumeMount,由 VCI 以 Hidecar(影子容器)方式注入 CSI 挂载组件保障安全。适用于挂载目录在运行沙箱实例时才能确定、或已有 Annotation 含 mountPath 需低成本平移的场景。当前仅支持 TOS 类型的存储卷。​
动态挂载能力通过在 SandboxTemplate 与 SandboxClaim 上添加 Annotation 声明来开启和配置。核心 Annotation 说明如下所示。​
​
对象​
Annotation Key​
Annotation Value 示例值​
说明​
SandboxTemplate(podTemplate)​
vke.volcengine.com/csi-sidecar-inject​
false​
是否开启动态挂载能力,取值:​
  • true:开启动态挂载并注入 Hidecar。​
  • false:(默认值)不开启。​
SandboxClaim​
vke.volcengine.com/dynamic-volume-mount-config​
[{"volumeName":"data-vol","pvName":"pv-tos-shared","mountPath":"/mnt/data","subPath":"/tenant-a"}]​
声明每个 Pod 要新增的 volumeMount 信息。​
  • 取值格式:JSON 数组。​
  • 数组支持的字段说明如下:​
  • volumeName:目标卷名称。留空时系统自动使用 pvName 作为 volumeName。​
  • pvName:卷对应的 PV 名称。​
  • mountPath:容器内挂载目录,可以是容器内任意绝对路径。包含该字段即进入动态挂载模式。​
  • subPath:PV 根目录下的子路径,用于多租户目录隔离。必须为相对 PV 根目录的合法子路径,禁止包含..。​
​
使用限制​
使用动态挂载能力时,请注意以下限制。​
​
限制项​
说明​
模板注解强依赖​
要求 SandboxTemplate 必须带有vke.volcengine.com/csi-sidecar-inject: "true" Annotation,缺失时所有带 mountPath 的请求将被拒绝。​
单主容器限制​
动态挂载模式默认按单个业务主容器处理,会优先选中第一个name不带sidecar关键字的容器。多容器场景(不推荐)如需使用动态挂载,非主容器的name必须包含sidecar关键字,否则将默认选中第一个容器。​
不支持原地重启​
动态挂载模式与容器原地更新(in-place update)、可写层持久化能力不可同时使用。容器重启后挂载点可能丢失,需重新创建 Sandbox。​
认领限制​
预热池中的 Sandbox 只会被认领一次。动态挂载失败、超时或异常时,该 Sandbox 实例将被直接清理并走冷启动链路,不会返回预热池复用,以避免数据处于中间态。​
超时约束​
动态挂载操作超时时间为 30 秒,超时后认领失败并清理 Sandbox 实例。​
存储类型限制​
动态挂载模式仅支持 TOS 存储类型。​
subPath 安全校验​
subPath 禁止包含..路径进行遍历,必须为相对 PV 根目录的合法子目录。​
安全责任与风险​
使用动态挂载能力相关安全责任和风险说明,请参见 存储卷挂载概述。​
​
前提条件​
  • VCI 业务集群中已安装 VCI Agent Sandbox 对应的组件:agent-sandbox,用于支持 SandboxTemplate / SandboxWarmPool / SandboxClaim 等 CRD。详细操作,请参见 安装指南。​
  • 已创建 TOS 存储桶(Bucket)。详细操作,请参见 创建存储桶。​
操作步骤​
步骤一:创建 SandboxTemplate​
  1. 创建 SandboxTemplate,并在 podTemplate 的 Annotations 中声明vke.volcengine.com/csi-sidecar-inject: "true",开启动态挂载模式。示例 SandboxTemplate YAML 文件dynamic-mount-template.yaml内容如下所示。​
  • ​
    apiVersion: extensions.agents.x-k8s.io/v1alpha1​
    kind: SandboxTemplate​
    metadata:​
    name: dynamic-mount-template # SandboxTemplate 名称。​
    namespace: default # SandboxTemplate 所属命名空间。​
    spec:​
    podTemplate:​
    metadata:​
    annotations:​
    vke.volcengine.com/csi-sidecar-inject: "true" # 是否开启动态挂载(Hidecar 注入)。取值:true(开启)、false(不开启)。​
    vke.volcengine.com/burst-to-vci: enforce # 强制调度到 VCI。​
    spec:​
    containers:​
    - name: app​
    image: doc-cn-beijing.cr.volces.com/vke/nginx-demo:v1.0 # 容器镜像的地址和版本,请配置为您自己的镜像地址。若使用公网镜像,请确保您的集群能够访问公网。​
    command: ["/bin/sh", "-c", "sleep 36000"]​
    resources:​
    limits:​
    cpu: "2"​
    memory: 4Gi​
    ​
  1. 执行以下命令,创建 SandboxTemplate。​
  • ​
    kubectl create -f dynamic-mount-template.yaml​
    ​
步骤二:创建 SandboxWarmPool​
预热池将基于模板预热一批处于 Running 状态的 Sandbox,使认领请求直接命中预热实例。动态挂载所需的 Hidecar 与 Init 容器也在此阶段完成注入。​
  1. 创建 SandboxWarmPool,示例 YAML 文件dynamic-mount-warmpool.yaml内容如下所示。​
  • ​
    apiVersion: extensions.agents.x-k8s.io/v1alpha1​
    kind: SandboxWarmPool​
    metadata:​
    name: dynamic-mount-warmpool # 预热池名称。​
    namespace: default # 预热池所属命名空间。​
    spec:​
    replicas: 10 # 预热池 Sandbox 数量。数值越大预热实例越多、认领命中率越高,但资源占用也越高,建议按业务并发峰值评估。​
    sandboxTemplateRef:​
    name: dynamic-mount-template # 关联的 SandboxTemplate 名称。​
    updateStrategy:​
    type: Recreate​
    ​
  1. 执行以下命令创建 SandboxWarmPool。​
  • ​
    kubectl apply -f dynamic-mount-warmpool.yaml​
    ​
步骤三:创建保密字典(Secret)​
通过 Secret 管理访问 TOS 的凭证。​
  1. 创建 Secret 的 YAML 文件。示例文件vke-tos-secret.yaml代码如下。​
说明​
您可以使用echo -n "${ak}" | base64命令对 AK、SK 等进行 Base64 编码,并将下方代码中的所有******替换为您自己的实际值。更多 Base64 编码说明,请参见 FAQ。​
  • ​
    apiVersion: v1​
    kind: Secret​
    metadata:​
    name: tos-key # 保密字典名称。​
    namespace: default # 保密字典所属命名空间。​
    type: Opaque # 保密字典类型,本例中选择通用类型,存储任意键值对。​
    data:​
    akId: ****** # Base 64 编码后的账号 AK,需要替换为真实信息。​
    akSecret: ****** # Base 64 编码后的账号 SK,与上述 AK 匹配,需要替换为真实信息。​
    ​
  1. 执行以下命令,创建 Secret。​
  • ​
    kubectl create -f vke-tos-secret.yaml​
    ​
步骤四:创建 TOS 存储 PV​
准备动态挂载的目标 PV,目前动态挂载模式仅支持 TOS 存储类型。​
  1. 创建 PV 的 YAML 文件。示例 YAML 文件pv-tos-shared.yaml内容如下所示。​
  • ​
    apiVersion: v1​
    kind: PersistentVolume​
    metadata:​
    name: pv-tos-shared # PV 名称。​
    spec:​
    csi:​
    driver: tos.csi.volcengine.com # CSI 驱动类型,本场景必须设置为 tos.csi.volcengine.com,表示使用 csi-tos 插件。​
    nodePublishSecretRef:​
    name: tos-key # 已创建的 TOS 访问配置相关 Secret 名称。​
    namespace: default # Secret 所在命名空间。​
    nodeStageSecretRef: # 用于引用一个 Kubernetes Secret,将其中的鉴权信息传给 csi-tos 的节点插件(Node Plugin)。​
    name: tos-key # 已创建的 TOS 访问配置相关 Secret 名称。​
    namespace: default # Secret 所在命名空间。​
    volumeAttributes:​
    bucket: vke-tos # 已创建的 TOS 存储桶名称。​
    path: /​
    url: https://tos-s3-cn-beijing.ivolces.com # TOS 存储桶域名。​
    volumeHandle: pv-tos-shared # PV 的唯一标识符,与 PV 名称保持一致。volumeHandle 应该唯一对应 <url>:<bucket><path>,避免相同 volumeHandle 对应不同 <url>:<bucket><path>,否则可能导致错误挂载盘。​
    ​
  1. 执行以下命令,创建 PV。​
  • ​
    kubectl create -f pv-tos-shared.yaml​
    ​
步骤五:创建 Sandbox​
本文提供如下两种创建 Sandbox 方式。​
​
通过 SandboxClaim 认领
通过 E2B SDK 创建
​
通过创建 SandboxClaim 并指定 mountPath 的方式,发起认领 Sandbox 并声明动态挂载配置。Annotation 中包含mountPath字段即进入动态挂载模式,控制器通过 Hidecar 通道执行 CSI 挂载,将指定 PV 的子目录挂载到容器内的任意绝对路径。​
  1. 创建 SandboxClaim。示例 YAML 文件dynamic-mount-claim.yaml内容如下所示。​
  • ​
    apiVersion: extensions.agents.x-k8s.io/v1alpha1​
    kind: SandboxClaim​
    metadata:​
    name: dynamic-mount-claim # SandboxClaim 名称。​
    namespace: default # SandboxClaim 所属命名空间。​
    annotations:​
    vke.volcengine.com/dynamic-volume-mount-config: '[{"volumeName":"data-vol","pvName":"pv-tos-shared","mountPath":"/mnt/data","subPath":"/tenant-a"}]' # 声明每个 Pod 要新增的 Volume Mount 信息。​
    spec:​
    sandboxTemplateRef:​
    name: dynamic-mount-template # 申领沙箱所使用的 SandboxTemplate 名称。​
    ​
  1. 执行以下命令,创建 SandboxClaim。​
  • ​
    kubectl create -f dynamic-mount-claim.yaml​
    ​
​
验证结果​
确认存储卷已按预期挂载到容器指定目录,并可正常读写。​
  1. 确认/mnt/data为独立挂载点。​
  • ​
    kubectl exec dynamic-mount-claim -c app -n default -- df -h /mnt/data​
    ​
  • 预期返回结果如下,Mounted on 列为/mnt/data,Filesystem 为 TOS 挂载,说明 TOS 已挂载到目标目录。​
  • ​
    Filesystem Size Used Avail Use% Mounted on​
    tosfs 10T 0 10T 0% /mnt/data​
    ​
  1. 确认可读取子目录内容。​
  • ​
    kubectl exec dynamic-mount-claim -c app -n default -- ls -la /mnt/data​
    ​
  • 预期返回结果如下,列出 TOS Bucket 中tenant-a子目录下的文件与目录。​
  • ​
    total 4​
    drwxr-xr-x 2 root root 0 Sep 15 16:20 .​
    drwxr-xr-x 3 root root 0 Sep 15 16:20 ..​
    -rw-r--r-- 1 root root 26 Sep 15 16:20 hello-from-tos.txt​
    ​
最近更新时间:2026.09.18 16:01:27
这个页面对您有帮助吗?
有用
有用
无用
无用