Agent Sandbox 网络规划与扩容

更新时间:
复制 MD 格式

本文介绍 Agent Sandbox 的网络分区架构,以及如何通过新增交换机(vSwitch)和安全组完成沙箱网络扩容。

背景信息

Agent Sandbox 中的沙箱运行用户提交的代码,默认不可信。为防止沙箱访问集群内部组件或其他租户,Agent Sandbox 按信任等级将集群工作负载划分为三个网络分区(托管及非托管侧系统组件和沙箱算力),建议沙箱使用独立的 vSwitch 和安全组进行隔离。

企业级安全组可关联的弹性网卡(ENI)数量存在上限(65,536)。当单个安全组承载的沙箱接近上限或交换机可用IP消耗殆尽,需新建一组 vSwitch 和安全组来承载新增沙箱。

网络分区

信任等级

典型组件

vSwitch配置

安全组配置

托管侧系统组件

Kube API Server、Cloud Controller Manager

控制面交换机

控制面安全组

非托管侧系统组件

ack-sandbox-manager、ack-agent-sandbox-controller

控制面交换机 

控制面安全组

沙箱算力

不可信

Sandbox Pod

建议为沙箱配置独立 vSwitch

建议为沙箱配置独立企业级安全组

创建 vSwitch

  1. 容器计算服务控制台,单击目标集群名称,进入集群信息页面。

  2. 基本信息页签的网络区块,单击VPC名称,进入专有网络控制台。

  3. 在专有网络控制台,切换到资源管理页签,添加交换机。具体操作,请参见创建专有网络与交换机

    • 建议每个可用区至少创建一个,保证跨可用区的高可用。

    • CIDR(地址段)按现有网段顺延,避开已占用网段。

可在专有网络控制台,左侧菜单选择交换机查看剩余可用IPv4地址数,避免消耗殆尽。

NAT添加 SNAT 条目

新创建的 vSwitch 不会自动加入 NAT网关的 SNAT 表。如果不添加 SNAT 条目,该 vSwitch 上的 Pod 将无法访问公网(拉取镜像、访问外部 API 都会超时)。

  1. 进入目标集群的集群信息页面。在基本信息页签的网络区块,单击NAT网关名称,进入NAT网关控制台。

  2. 在 NAT 网关控制台,切换到SNAT管理页签,为新 vSwitch 创建SNAT条目并绑定 NAT EIP。具体操作,请参见创建 SNAT 条目

复用或新建沙箱安全组

  1. 安全组控制台查看现有沙箱安全组是否可以复用。

    基于安全组最佳实践,建议单个安全组 IP 占用率不超过 80%(约 52,000 个)。
  2. 在安全组控制台逐项配置放行规则:沙箱出向规则、沙箱入向规则、目标侧入向规则。具体操作,请参见创建安全组

    企业级安全组的组内连通策略为组内隔离,即组内实例之间默认不互通,请参考组内互通功能
    说明

    以下涉及到的组件网段可通过以下方式查询:

    • 集群托管组件

      • ACS/ACK:进入目标集群的集群信息页面。在基本信息页签的网络区块,查看控制面交换机信息。

    • 集群非托管组件

      • ACS:进入目标集群的集群信息页面。在基本信息页签的网络区块,查看控制面交换机信息。

      • ACK:进入目标集群的节点池页面。查询对应节点池的交换机信息。

    沙箱安全组入方向规则

    来源

    协议/端口

    用途

    策略

    集群托管组件网段

    TCP/9090、TCP/9100、TCP/10254

    Prometheus / node-exporter / Ingress metrics

    允许

    ICMP

    健康探测

    允许

    集群非托管组件网段

    TCP/49983、TCP/49999

    sandbox-manager 和 sandbox-gateway → 沙箱 Pod(envd / jupyter)

    允许

    沙箱安全组出方向规则

    目标

    协议/端口

    用途

    策略

    优先级

    100.100.100.200/32

    TCP/80、TCP/443

    ECS 元数据服务

    拒绝

    1

    集群托管组件网段

    TCP/6443

    API Server

    允许

    1

    TCP/9082

    Poseidon 托管组件

    允许

    1

    TCP/53、UDP/53

    内网DNS(PrivateZone) / DNS 上游

    允许

    1

    集群托管/非托管组件网段

    TCP/53、UDP/53

    沙箱访问 CoreDNS Pod

    允许

    1

    10.0.0.0/8172.16.0.0/12192.168.0.0/16

    ALL

    私有网络(防止沙箱探测内网)

    拒绝

    10

    0.0.0.0/0

    ALL

    公网出口

    按需开放。

    允许

    20

    安全组规则优先级数值越小,优先级越高。相同优先级下,拒绝规则优先生效。

    目标侧安全组入向规则

    新增 vSwitch 后,沙箱 Pod 访问的目标组件(CoreDNS、Api Server 等)所在的安全组必须新增入向规则,将新 vSwitch 的网段放行。

    来源

    协议/端口

    用途

    必选

    新沙箱 vSwitch网段

    TCP/53、UDP/53

    可选,沙箱访问域名解析服务CoreDNS

    TCP/6443

    ACS 实例访问集群 API Server

    TCP/9082

    ACS 实例访问Poseidon 托管组件

将 vSwitch 和安全组配置到 Pod

ACS 集群

在 Pod 的 metadata.annotations 或其工作负载(例如 SandboxSet)的 spec.template.metadata.annotations中添加配置,示例如下:

配置变更后,已分配的Sandbox 其关联的vSwitch和安全组不会变更,必须重建后生效。
apiVersion: agents.kruise.io/v1alpha1
kind: SandboxSet
metadata:
  name: code-interpreter
  namespace: default
spec:
  template:
    metadata:
      annotations:                       
        # 交换机 ID,多个用英文逗号分隔
        network.alibabacloud.com/vswitch-ids: "vsw-uf6h*********oy7n,vsw-uf6vx********9c"
        # 安全组 ID,多个用英文逗号分隔
        network.alibabacloud.com/security-group-ids: "sg-uf6g**********i0dn"
 # ...

ACK 集群

ECS算力

ACK 集群中,运行在自有节点(ECS)上的沙箱 Pod,其 vSwitch 和安全组由 Terway 管理,支持以下两种配置粒度:

eni-config 修改后仅对新创建的 ENI 生效,已有节点的 ENI 不受影响。
  • 集群级 eni-config(ConfigMap):编辑 kube-system 命名空间下的 eni-config ConfigMap,在 eni_conf 的 vswitches 字段中追加新的 vSwitch ID,并将 security_group 字段修改为对应的沙箱安全组 ID。

    适用于同节点池内所有 Pod 共享 vSwitch 和安全组的场景。

  • 节点级网络配置:通过节点池的 terway-config 标签关联不同的 eni-config,实现不同节点池使用不同的 vSwitch 和安全组。

    适用于不同沙箱分组分布在不同节点池的场景。具体操作,请参考节点维度的网络配置

ACS算力

运行在 ACS 算力上的沙箱 Pod 不经过 Terway,其 vSwitch 和安全组的配置方式与 ACS 集群一致,请参考ACS 集群

调整TrafficPolicy / NetworkPolicy

扩容后需要检查现有的 TrafficPolicy(apiVersion: network.alibabacloud.com/v1alpha1)规则是否覆盖新网段。详细配置,请参考使用TrafficPolicy管理Agent网络访问Agent Sandbox配置增强型出口流量管理

网络连通性验证

扩容完成后,使用沙箱 Pod 或临时测试 Pod 逐项验证网络连通性。

验证 Pod IP 落在新网段

在 Pod 内执行 hostname -i,确认 IP 地址在新 vSwitch CIDR 范围内。

验证公网访问

在沙箱 Pod 内执行以下命令:

curl https://httpbin.org/ip

返回 NAT EIP 表示 SNAT 配置正常。超时则检查新 vSwitch 是否已添加 SNAT 条目,以及沙箱安全组出方向是否放行了 TCP/443。

验证域名解析

在沙箱 Pod 内执行以下命令:

# 查询集群内部服务域名
getent hosts kubernetes.default.svc.cluster.local

解析失败则检查沙箱安全组出方向是否放行了 TCP/53 和 UDP/53,以及Core DNS组件的所在安全组是否放行了新网段的入方向 53 端口。

相关文档