全部产品
Search
文档中心

容器计算服务 ACS:通过 ACK One 多集群舰队管理 Agent Sandbox

更新时间:Sep 03, 2026

ACK One 舰队支持在多个集群间统一管理和调度 Agent Sandbox。本文介绍ACK One 舰队管理 Agent Sandbox的能力,以及部分操作示例,包括 SandboxSet 的多集群分发与差异化配置、SandboxClaim 的多集群调度、通过 E2B SDK 接入 Agent Sandbox 等。

背景信息

Agent Sandbox是面向生产级 AI 智能体的沙箱算力。ACK One 舰队提供对多集群Agent Sandbox 的统一管理能力,支持以下调度特性:

多集群Agent Sandbox是ACK One多集群舰队面向生产级AI智能体提供的多集群沙箱算力方案。它在单集群Agent Sandbox的基础上,通过一个统一的多集群管理平面(Fleet)管理多个ACK集群,突破单集群在容量、故障域上的上限,并借助多集群调度能力提升资源利用率与Sandbox启动效率。
  • 单集群容量控制:每个子集群配置最大可运行 Sandbox 数量(Capacity),超出上限后调度器自动调度到其他尚有容量的集群,防止单集群过载。

  • 水位均衡调度:默认根据各集群当前 Sandbox 使用水位进行均衡分配,充分利用多集群资源。

  • 集群优先级调度:支持将集群划分为优先级分组,优先将 Sandbox 调度到指定集群组,资源不足时自动降级到下一优先级。

  • 多集群故障转移:当某集群出现异常或进入维护状态时,新建的 Sandbox 和 SandboxClaim 会自动调度到其他健康集群,无需人工干预。

  • E2B 协议接入:舰队提供面向 E2B 协议的 Multi-Cluster Gateway 统一入口与多集群调度能力,您可以通过 E2B SDK 在多个集群间创建和使用 Sandbox,无需感知 Sandbox 所在的具体集群。

准备工作

  1. 开启舰队管理功能。

  2. 在ACK One控制台获取舰队的 KubeConfig,并通过 kubectl 连接到舰队。

  3. 参见管理关联集群,为舰队添加至少两个关联集群。

  4. 参见安装组件,在所有关联集群中安装 Agent Sandbox 相关组件。

    重要

    ack-agent-sandbox-controller 组件版本需为 v0.5.13-release.1或更高。安装该组件时,请在 FeatureGate 中配置SandboxMultiClusterNaming=true,以确保 Sandbox ID 在多集群间唯一。

    说明

    如需使用多集群 Agent Sandbox 的 E2B 能力,在多个子集群中安装 ack-sandbox-manager 组件时,请为每个集群配置不同的 E2B domain。

  5. 安装AMC命令行帮助工具。

(可选)配置多集群 Agent Sandbox E2B 能力

若您计划使用 E2B SDK 方式使用 Agent Sandbox,请在创建 Sandbox 预热池前完成本步骤中的所有配置。若仅使用 SandboxClaim 方式,可跳过本步骤。

步骤一:开启多集群 Agent Sandbox E2B 能力

  1. 登录 ACK One 控制台,在左侧导航栏选择舰队 > 舰队信息。

  2. 在基础信息中开启多集群 Agent Sandbox。

步骤二:在舰队上配置 Multi-Cluster Gateway 证书与信任链

本步骤为多集群 Agent Sandbox 的 Multi-Cluster Gateway 准备所需的 TLS 证书与后端 CA 信任锚。

  1. 准备证书与 CA bundle。证书获取方式请参见申请证书中的申请证书章节。您可以根据环境选择以下方式:

    重要

    若计划在舰队中使用 cert-manager 自动签发证书,需提交工单申请舰队相关权限。

    • 生成自签证书(开发/测试环境):SAN 需覆盖舰队域名,如 *.fleet.your.domain.com。

    • 使用正式 CA 签发的证书(生产环境):Gateway 前端证书需匹配舰队域名(客户端信任);CA bundle 需包含所有子集群 ALB 证书的签发 CA(可拼接多个 PEM)。

  2. 创建 Gateway 前端 TLS 证书。将上一步准备好的证书导入为 TLS Secret:

    kubectl create secret tls global-sandbox-scheduler-tls \
      --cert=certs/tls.crt \
      --key=certs/tls.key \
      -n sandbox-system
  3. 创建后端 CA 信任锚,用于 BackendTLSPolicy 验证子集群 ALB 证书以及健康探测的 HTTPS 客户端。请根据子集群证书类型选择以下方式:

    • 自签证书(开发/测试环境):如各子集群使用不同 CA,请先将多个 CA PEM 拼接到同一文件,再创建 ConfigMap:

      # 拼接多个子集群 CA(如使用同一 CA 可跳过)
      cat cluster1-ca.crt cluster2-ca.crt > certs/ca.crt
      
      kubectl create cm sandbox-ca-cm \
        --from-file=certs/ca.crt \
        -n sandbox-system
    • 正式 CA 签发的证书(生产环境):如果子集群域名都使用正式 CA 签发的证书,无需创建 CA ConfigMap,仅需在下方步骤三的 sandbox-e2b-scheduler-config ConfigMap 中,为每个集群配置 wellKnownCACertificates: "System":

      apiVersion: v1
      kind: ConfigMap
      metadata:
        name: sandbox-e2b-scheduler-config
        namespace: sandbox-system
      data:
        config: |
          clusters:
          - name: c727xxxx7843
            wellKnownCACertificates: "System"
          ...

步骤三:在舰队上配置多集群调度信息

舰队上的 ConfigMap sandbox-e2b-scheduler-config 是多集群 Agent Sandbox E2B 链路的调度配置入口,其中包含关联集群的相关配置等,用于 Sandbox 的调度和路由。

  1. 执行以下命令编辑该 ConfigMap。

    kubectl edit cm sandbox-e2b-scheduler-config -nsandbox-system
  2. 参考下方示例进行配置。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: sandbox-e2b-scheduler-config
      namespace: sandbox-system
    data:
      config: |
        defaultMaxSandboxesPerCluster: 100000
    
        clusters:
        - name: <YOUR-ACK-CLUSTER-ID>
          maxSandboxes: 100000
          endpoint: <YOUR-CLUSTER-SANDBOX-MANAGER-INGRESS-DOMAIN>
          e2bDomain: <YOUR-CLUSTER-SANDBOX-E2B-DOMAIN>
          e2bApiKey: <YOUR-CLUSTER-SANDBOX-E2B-ADMIN-API-KEY>
        - name: <YOUR-ACK-CLUSTER-ID>
          maxSandboxes: 100000
          endpoint: <YOUR-CLUSTER-SANDBOX-MANAGER-INGRESS-DOMAIN>
          e2bDomain: <YOUR-CLUSTER-SANDBOX-E2B-DOMAIN>
          e2bApiKey: <YOUR-CLUSTER-SANDBOX-E2B-ADMIN-API-KEY>
    
        requestTimeout: 5m
        volumeGC:
          grace: 8h
          reconcileInterval: 24h
  3. sandbox-e2b-scheduler-config ConfigMap 的配置字段说明如下表所示。

    字段

    子字段

    必填

    说明

    requestTimeout

    -

    否

    默认值是 5m,即 5 分钟。HTTPRoute 规则的请求超时时间,可根据实际情况调整。

    defaultMaxSandboxesPerCluster

    -

    否

    默认值为 100000。代表期望的单集群 Sandbox 容量上限(不包含 SandboxSet 的 Sandbox 副本数)。如果 clusters 中没有配置 maxSandboxes,则单集群 Sandbox 容量以该配置为准。

    clusters

    name

    是

    集群 ID。如 c6cb44842ae2242e6bc5b96cea4f3xxxx。

    maxSandboxes

    否

    期望该集群的 Sandbox 容量上限。不填则生效的值为 defaultMaxSandboxesPerCluster 所配置的值。

    endpoint

    是

    该集群 Sandbox Manager 的 Ingress 入口域名。如使用 ALB Ingress Controller,则如 alb-xxxx.cn-hangzhou.alb.aliyuncsslb.com。

    e2bDomain

    是

    该集群安装 Sandbox Manager 时配置的 E2B domain。如 cluster1.example.com。

    e2bApiKey

    是

    该集群安装 Sandbox Manager 时配置的 adminApiKey。如 e2b_0000000000000000000000000000000000000000。

    qpm

    否

    该集群的创建速率限制(个 Sandbox/分钟)。不配置或小于等于 0 则无限流。

    burst

    否

    单次(批量)允许放行的最大创建 Sandbox 数。省略时默认等于 qpm(即一整分钟的配额)。

    region

    否

    集群所属的 region。默认不填则可以随意调度。至少 2 个集群配置不同的值,才会触发跨 region 调度。建议需要区分 region 时,为每个集群都配置该字段。

    wellKnownCACertificates

    否

    配置为 System 代表该集群使用正式 CA 签发的证书。使用自签证书时不配置该字段,需要将 CA 创建到 sandbox-ca-cm 中。

    volumeGC

    grace

    否

    默认为 8h。表示随 Sandbox 调度而创建在子集群的 PersistentVolume,回收前保留的时长。

    reconcileInterval

    否

    默认为 24h。配置为 0 代表关闭。

步骤四:配置 Multi-Cluster Gateway 入口到 DNS

前置步骤就绪后,将多集群 Agent Sandbox 的 Gateway 入口 IP 配置到 DNS,即可使用 fleet.your.domain.com(E2B domain)发起 E2B 请求。

  1. 执行以下命令获取 Multi-Cluster Gateway 的 LB IP。

    kubectl -n sandbox-system get gateway global-sandbox-scheduler \
      -o jsonpath='{.status.addresses[0].value}'
  2. 在 DNS 或 PrivateZone 中,将舰队泛域名解析到上一步获取的 Multi-Cluster Gateway LB IP。

    *.fleet.your.domain.com -> <YOUR-MULTI-CLUSTER-GATEWAY-IP>

步骤五:(可选)获取或生成 Fleet Admin API Key

通过 fleet.your.domain.com(E2B domain)访问舰队时,客户端需携带此处配置的 E2B_API_KEY。开启多集群 Agent Sandbox 时,舰队上会生成默认值,您也可以将其更新为自己的 Key。

  1. 执行以下命令获取默认生成的 Fleet Admin API Key。

    kubectl get secret fleet-api-keys -n sandbox-system \
      -o jsonpath='{.data.admin}' | base64 -d ; echo
  2. 执行以下命令更新 Fleet Admin API Key(请替换 <YOUR-KEY>)。

    kubectl patch secret fleet-api-keys \
      -p '{"stringData":{"admin":"<YOUR-KEY>"}}' \
      -n sandbox-system

步骤一:通过 SandboxSet 创建 Sandbox 预热池

  1. 将下方示例保存到sandbox-set.yaml,然后执行kubectl apply -f sandbox-set.yaml,在舰队中创建 SandboxSet。

    SandboxSet 定义了 Sandbox 的模板和期望的可用副本数。
    apiVersion: agents.kruise.io/v1alpha1
    kind: SandboxSet
    metadata:
      name: code-interpreter
    spec:
      persistentContents:
      - filesystem
      replicas: 4
      runtimes:
      - name: csi
      - name: agent-runtime
      scaleStrategy: {}
      template:
        metadata:
          labels:
            alibabacloud.com/acs: "true"
            alibabacloud.com/compute-class: agent-sandbox
            alibabacloud.com/compute-qos: default
        spec:
          automountServiceAccountToken: false
          containers:
          - image: registry-cn-zhangjiakou.ack.aliyuncs.com/acs/code-interpreter:v1.6
            imagePullPolicy: IfNotPresent
            name: sandbox
            resources:
              limits:
                cpu: "1"
                memory: 1Gi
              requests:
                cpu: "1"
                ephemeral-storage: 30Gi
                memory: 1Gi
          restartPolicy: Always
      updateStrategy:
        maxUnavailable: 20%
  2. 将下方示例保存到code-interpreter-pp.yaml,然后执行kubectl apply -f code-interpreter-pp.yaml。

    创建 SandboxSet 时,同时需要创建 PropagationPolicy 资源,通过spec.placement.replicaScheduling.replicaSchedulingType字段指定 SandboxSet 分发到关联集群的规则。spec.resourceSelectors.kind配置为SandboxSet时,replicaSchedulingType目前仅支持Duplicated选项,即每个关联集群都会创建一份完整的 SandboxSet 副本。

    preserveResourcesOnDeletion 设为 false 时,删除舰队上的资源会同步清理子集群上的资源。如需保留子集群资源,请设置为 true。
    apiVersion: policy.one.alibabacloud.com/v1alpha1
    kind: PropagationPolicy
    metadata:
      name: code-interpreter-pp
    spec:
      preserveResourcesOnDeletion: false
      resourceSelectors:
      - apiVersion: agents.kruise.io/v1alpha1
        kind: SandboxSet
      placement:
        replicaScheduling:
          replicaSchedulingType: Duplicated
  3. 查看舰队中所有关联集群的 SandboxSet 状态(聚合显示)。

    kubectl get sandboxset

    预期输出:

    NAME               REPLICAS   AVAILABLE   UPDATEDREPLICAS   UPDATEDAVAILABLEREPLICAS   UPDATEREVISION   AGE
    code-interpreter   8          8           8                 8                          74bfb6****      
  4. 查看不同关联集群中的 SandboxSet 状态。

    kubectl amc get sandboxset -M

    预期输出:

    NAME               CLUSTER          CLUSTER_ALIAS     REPLICAS   AVAILABLE   UPDATEDREPLICAS   UPDATEDAVAILABLEREPLICAS   UPDATEREVISION   AGE   ADOPTION
    code-interpreter   <cluster-id-1>   sandbox-cluster1  4          4           4                 4                          56fc44****       5d    Y
    code-interpreter   <cluster-id-2>   sandbox-cluster2  4          4           4                 4                          74bfb6****       5d    Y
  5. (可选)使用 OverridePolicy 为不同集群指定不同的 SandboxSet 副本数和资源规格。

    以下示例为名为 code-interpreter的 SandboxSet 在两个集群中分别配置了不同的副本数量和规格:

    • CLUSTER_1_ID:5 副本,1CPU、2GiB 内存配置。

    • CLUSTER_2_ID:2 副本,2CPU、4GiB 内存配置。

    将下方示例保存到code-interpreter-op.yaml,然后执行kubectl apply -f code-interpreter-op.yaml。

    OverridePolicy 通过 JSON Patch 路径精确定位需要覆盖的字段。/spec/replicas 覆盖副本数配置,/spec/template/spec/containers/0/resources 覆盖容器资源配置。
    apiVersion: policy.one.alibabacloud.com/v1alpha1
    kind: OverridePolicy
    metadata:
      name: code-interpreter-op
    spec:
      resourceSelectors:
        - apiVersion: agents.kruise.io/v1alpha1
          kind: SandboxSet
          name: code-interpreter
      overrideRules:
        - targetCluster:
            clusterNames:
              - CLUSTER_1_ID
          overriders:
            plaintext:
              - operator: replace
                path: /spec/replicas
                value: 5
              - path: /spec/template/spec/containers/0/resources
                operator: add
                value:
                  requests:
                    cpu: "1"
                    memory: "2Gi"
                  limits:
                    cpu: "1"
                    memory: "2Gi"
        - targetCluster:
            clusterNames:
              - CLUSTER_2_ID
          overriders:
            plaintext:
              - operator: replace
                path: /spec/replicas
                value: 2
              - path: /spec/template/spec/containers/0/resources
                operator: add
                value:
                  requests:
                    cpu: "2"
                    memory: "4Gi"
                  limits:
                    cpu: "2"
                    memory: "4Gi"

步骤二:使用 Agent Sandbox

完成 Sandbox 预热池创建后,您可以通过以下任一方式使用 Agent Sandbox:

  • SandboxClaim 方式:从预热池中申请 Sandbox 实例,通过 Kubernetes 原生的方式管理和使用,适用于基于 kubectl/CRD 的集群内使用场景。

  • E2B SDK 方式:通过 E2B SDK 经由舰队的 Multi-Cluster Gateway 创建和使用 Sandbox,适用于 AI Agent 应用开发场景。

E2B SDK 方式

Agent Sandbox 支持对接 E2B 生态。开启多集群 Agent Sandbox E2B 能力后,舰队提供统一的 Multi-Cluster Gateway 入口和多集群调度能力,客户端可以通过 E2B SDK 创建、连接并使用 Sandbox,无需感知 Sandbox 所在的后端集群。

获取 Agent Sandbox

Sandbox 支持通过 E2B SDK 在平台上开发、部署项目并查看效果,包括执行代码(run_code)、读写文件(files.write/files.read)、运行命令(commands.run)等操作。更多 SDK 使用说明,请参见使用 E2B SDK 接入 Agent Sandbox。

使用 E2B 能力前,请先完成步骤一(配置多集群 Agent Sandbox E2B 能力)中的所有配置以及步骤二(通过 SandboxSet 创建 Sandbox 预热池)。
  1. 在本地环境中安装 Python。

  2. 安装 E2B Python SDK(仅支持小于 v2.25.0 的版本)。

    pip install "e2b-code-interpreter==2.7.0" "e2b==2.24.0"
  3. 配置环境变量。

    # your.domain.com 是安装 ack-sandbox-manager 组件时配置的域名,不需要带 *,可按实际配置修改
    export E2B_DOMAIN=fleet.your.domain.com
    # 使用默认生成或更新后的 Fleet Admin API Key
    export E2B_API_KEY=e2b_0000000000000000000000000000000000000000
  4. 将以下代码保存为 main.py 文件。

    # Import the E2B SDK
    from e2b_code_interpreter import Sandbox
    
    sbx: Sandbox = Sandbox.create(template="code-interpreter")
    print(f"sandbox id: {sbx.sandbox_id}")
    
    result = sbx.run_code("print('hello, world')")
    print(f"run code result: {result}")
    
    text = input("enter some text to be saved to file 'text.txt' inside sandbox:  ")
    sbx.files.write("text.txt", text)
    print(f"read file from sandbox via files api: [{sbx.files.read('text.txt')}]")
    print(f"read file from sandbox via commands api: [{sbx.commands.run('cat text.txt')}]")
    
    input("press ENTER to kill the sandbox")
    print(sbx.kill())
    create 接口 metadata 参数说明,请参见创建Agent Sandbox。
  5. 运行 main.py 文件,创建并验证 Sandbox。

    在第一次出现提示后,输入文字如 acs agent sandbox,然后按 ENTER 键,会在名为 code-interpreter-29*** 的 Pod 的 /home/user/text.txt 文件中写入 acs agent sandbox;若再次按 ENTER 键,则会删除当前 Sandbox。

    python main.py

    预期输出:

    sandbox id: default--code-interpreter-29***
    run code result: Execution(Results: [], Logs: Logs(stdout: ['hello, world\n'], stderr: []), Error: None)
    enter some text to be saved to file 'text.txt' inside sandbox:  acs agent sandbox
    read file from sandbox via files api: [acs agent sandbox]
    read file from sandbox via commands api: [CommandResult(stderr='', stdout='acs agent sandbox', exit_code=0, error='')]
    press ENTER to kill the sandbox
    True

SandboxClaim 方式

在多集群中进行 SandboxClaim 的分发与调度

SandboxClaim 用于从已创建的 SandboxSet 中申请 Sandbox 实例,使用 PropagationPolicy 可以控制 SandboxClaim 在多集群间的调度方式。

  1. 将下方示例保存到sandbox-claim.yaml,然后执行kubectl apply -f sandbox-claim.yaml。

    apiVersion: agents.kruise.io/v1alpha1
    kind: SandboxClaim
    metadata:
      name: code-interpreter
      namespace: default
    spec:
      templateName: code-interpreter
      replicas: 1
      claimTimeout: 5m
      ttlAfterCompleted: 5m
  2. 根据需求选择调度方式:

    • Gang调度:会自动选择一个关联集群,将 SandboxClaim 里请求的所有副本调度到该集群。

    • 集群优先级调度:为集群设置调度优先级,调度器会选择优先级较高的集群,将 SandboxClaim 里请求的所有副本调度到该集群。当高优先级集群资源不足时,则会自动降级到低优先级集群。

    重要

    请勿为同一个SandboxClaim资源配置不同的PropagationPolicy。

    基本调度(Gang 调度):会自动选择一个关联集群,将 SandboxClaim 里请求的所有副本调度到该集群。操作如下:

    1. 将下方示例保存到sandboxclaim-pp.yaml,然后执行kubectl apply -f sandboxclaim-pp.yaml。

      apiVersion: policy.one.alibabacloud.com/v1alpha1
      kind: PropagationPolicy
      metadata:
        name: sandboxclaim-pp
      spec:
        preserveResourcesOnDeletion: false
        resourceSelectors:
        - apiVersion: agents.kruise.io/v1alpha1
          kind: SandboxClaim
        placement:
          replicaScheduling:
            replicaSchedulingType: Divided
            customSchedulingType: Gang
    2. 查看舰队上的 SandboxClaim。

      kubectl get sandboxclaim

      预期输出:

      NAME               PHASE       TEMPLATE           DESIRED   CLAIMED   AGE
      code-interpreter   Completed   code-interpreter   1         1         6s
    3. 查看关联集群上的 SandboxClaim。

      kubectl amc get sandboxclaim -M

      预期输出:

      NAME               CLUSTER        CLUSTER_ALIAS    PHASE       TEMPLATE           DESIRED   CLAIMED   AGE   ADOPTION
      code-interpreter   <CLUSTER-ID>   sandbox-cluster1 Completed   code-interpreter   1         1         3s    Y
    4. 将下方命令中的CLUSTER_ID替换为上一步骤中获取的集群ID后执行,使用 sandboxClaim name label 获取 Sandbox详情。

      kubectl amc get sandbox -m CLUSTER_ID -l agents.kruise.io/claim-name=code-interpreter

      预期输出:

      NAME                     CLUSTER      CLUSTER_ALIAS    STATUS    AGE   CLAIMED   SHUTDOWN_TIME   PAUSE_TIME   MESSAGE   ADOPTION
      code-interpreter-47***   CLUSTER_ID   sandbox-cluster1 Running   59m   true

    集群优先级调度:为集群设置调度优先级,调度器会选择优先级较高的集群,将 SandboxClaim 里请求的所有副本调度到该集群;当高优先级集群资源不足时,则会自动降级到低优先级集群。操作如下:

    1. 将下方示例保存到sandboxclaim-pp-priority.yaml,然后执行kubectl apply -f sandboxclaim-pp-priority.yaml。

      spec.placement.clusterAffinities字段中声明的顺序即为调度优先级顺序。下方示例PropagationPolicy会优先调度到 CLUSTER_1_ID(primary),资源不足时再调度到 CLUSTER_2_ID(secondary)。
      apiVersion: policy.one.alibabacloud.com/v1alpha1
      kind: PropagationPolicy
      metadata:
        name: sandboxclaim-pp-priority
      spec:
        preserveResourcesOnDeletion: false
        resourceSelectors:
        - apiVersion: agents.kruise.io/v1alpha1
          kind: SandboxClaim
        placement:
          replicaScheduling:
            customSchedulingType: Gang
            replicaSchedulingType: Divided
          clusterAffinities:
            - affinityName: primary
              clusterNames:
                - CLUSTER_1_ID
            - affinityName: secondary
              clusterNames:
                - CLUSTER_2_ID
    2. 查看舰队上的 SandboxClaim。

      kubectl get sandboxclaim

      预期输出:

      NAME               PHASE       TEMPLATE           DESIRED   CLAIMED   AGE
      code-interpreter   Completed   code-interpreter   1         1         6s
    3. 查看 SandboxClaim 是否按优先级规则部署到了 CLUSTER-1。

      kubectl amc get sandboxclaim -M

      预期输出:

      NAME               CLUSTER          CLUSTER_ALIAS    PHASE       TEMPLATE           DESIRED   CLAIMED   AGE   ADOPTION
      code-interpreter   <CLUSTER-1-ID>   sandbox-cluster1 Completed   code-interpreter   1         1         3s    Y
    4. 将下方命令中的CLUSTER_ID替换为上一步骤中获取的集群ID后执行,使用 sandboxClaim name label 获取 Sandbox详情。

      kubectl amc get sandbox -m CLUSTER_ID -l agents.kruise.io/claim-name=code-interpreter

      预期输出:

      NAME                     CLUSTER      CLUSTER_ALIAS    STATUS    AGE   CLAIMED   SHUTDOWN_TIME   PAUSE_TIME   MESSAGE   ADOPTION
      code-interpreter-47***   CLUSTER_ID   sandbox-cluster1 Running   59m   true

步骤三:(可选)配置多集群故障转移(Failover)

SandboxClaim 链路与 E2B 链路的多集群故障转移机制不同,请根据您的使用方式参考对应页签进行配置。

E2B 链路

对于 E2B 场景,ACK One 舰队支持以下两种方式判定集群是否故障:

  • 自动探测:自动探测每个子集群 Sandbox Manager 组件的健康状况。如果连续探测 3 次失败(探测间隔 5s),判定为 unhealthy;连续探测成功 2 次,判定为 healthy。

  • 手动配置:在 sandbox-system/sandbox-e2b-scheduler-config 中为集群配置 disabled: true,代表运维 drain 的语义。

故障确定方式

说明

判断规则

效果

自动探测

周期性(探测间隔 5s)探测每个子集群 Sandbox Manager 组件的健康状况。

  • 连续探测 3 次失败,判定为 unhealthy。

  • 连续探测成功 2 次,判定为 healthy。

集群被判定为 unhealthy 时,通过 E2B SDK 进行以下操作:

  • create 时,该集群会被 filter 过滤掉,自动调度到健康的集群。如果没有健康的集群,则返回信息 scheduling failed: no cluster available after filtering。

  • connect、pause 等操作会被舰队的 Multi-Cluster Gateway 直接拦截,返回 503。暂不支持 List 操作。

手动配置

在 sandbox-e2b-scheduler-config ConfigMap 中手动配置 disabled: true,代表运维 drain 的语义。

disabled: true:表示该集群处于运维状态,不在其上再创建新的 Sandbox。

集群配置为 disabled: true 时:

  • create 时,该集群会被 filter 过滤掉,自动调度到健康的集群。如果没有健康的集群,则返回信息 scheduling failed: no cluster available after filtering。

  • connect、pause 等操作仍然可以正常使用。

如需手动 drain 集群,请在 sandbox-e2b-scheduler-config ConfigMap 中,为对应集群配置添加 disabled: true:

apiVersion: v1
kind: ConfigMap
metadata:
  name: sandbox-e2b-scheduler-config
  namespace: sandbox-system
data:
  config: |
    ...
    # Fields per cluster:
    #   disabled — bool, optional — drain the cluster (exclude from create scheduling)
    clusters:
    - name: $clusterid
      disabled: true
      ...

如需手动恢复集群,请将该集群的配置修改为 disabled: false。

SandboxClaim 链路

ACK One舰队会利用OCM机制自动检测子集群与舰队之间的网络,如果出现异常(5min没有收到子集群中ocm agent心跳),则会自动为关联集群添加NoSelect污点(Taint),以将 SandboxClaim 转移到其他可用关联集群。

如需对某个关联集群进行维护,请参见下方操作,为关联集群手动添加污点:

添加和移除污点的操作影响已在该集群运行的 Sandbox 实例。
  1. 将下方命令中的CLUSTER_ID替换为目标关联集群ID后执行,为指定集群添加污点,使调度器不再将 SandboxClaim 分配到该集群:

    kubectl patch managedcluster CLUSTER_ID --type=merge -p '{
      "spec": {
        "taints": [
          {"key": "maintenance", "value": "true", "effect": "NoSelect"}
        ]
      }
    }'
  2. 集群维护完成后,执行下方命令移除污点,恢复该关联集群的调度。

    kubectl patch managedcluster CLUSTER_ID --type=json -p '[{"op":"remove","path":"/spec/taints"}]'