全部产品
Search
文档中心

容器计算服务 ACS:为ACS Agent Sandbox配置增强型出口流量管理

更新时间:Jun 02, 2026

相比 Kubernetes 原生 L3/L4 网络策略,Agent Sandbox 通过 SecurityProfile CRD 实现精细化 L7 出口流量管理。支持按域名、URL 等维度定义规则,有效防止敏感数据泄露与未授权 API 调用,提供更高维度的安全管控。

概述

Agent Sandbox 通过 network.alibabacloud.com/network-policy-mode 注解(Annotation)支持三种网络策略模式,适用于不同的流量管理需求:

模式

说明

能力范围

network-policy

基础网络策略

仅支持使用 Kubernetes 原生 NetworkPolicy 进行网络访问控制。

traffic-policy

流量策略

支持基于 TrafficPolicy CRD 的入方向和出方向四层(L4)流量管理,需安装 Poseidon 组件。

enhanced-traffic-policy

增强流量策略

系统将自动为 Pod 注入 traffic-proxy Sidecar。既支持基于 TrafficPolicy CRD 的四层流量管理,也支持基于 SecurityProfile CRD 的七层(L7)出口流量管理。仅使用 SecurityProfile 时,需安装 ack-sandbox-manager 组件并开启增强流量管理功能;若同时使用 TrafficPolicy,还需安装 Poseidon 组件。

本文档介绍 enhanced-traffic-policy 模式下,如何通过 SecurityProfile CRD 管理 Sandbox Pod 的七层出口流量。

工作原理

下图展示增强出口流量管理对 Sandbox 出口流量的完整拦截与处理流程:

  1. 流量拦截:Sandbox应用容器的所有出口请求被自动注入的 traffic-proxy Sidecar 透明拦截,应用层无感知。

  2. 流量重定向:Sidecar 将截获的流量转发至集群内的 egress-gateway。

  3. 安全规则评估:Egress Gateway 将请求元信息(来源 Pod 标签、请求 Host/Path/Method/Headers 等)发送至 traffic-extension 服务。

  4. 规则匹配traffic-extension 根据请求来源 Pod 标签,查找命名空间下匹配的 SecurityProfile,按规则链顺序评估。

  5. 执行动作

    • 命中 Block 规则:立即返回配置的 HTTP 状态码和响应体,请求不会转发至目标服务。

    • 未命中任何 Block 规则:请求正常放行。

image

组件说明

出口流量管理包含以下核心组件,部署在 sandbox-traffic-system 命名空间中:

  • gateway-controller:控制面组件,负责 traffic-proxy sidecar 和 egress-gateway 的配置管理与下发。

  • egress-gateway:出口网关,统一接收并转发集群内 Sandbox 的出口流量。

  • traffic-extension:策略执行引擎,执行出口流量管理策略(流量拦截、token 注入等)。

  • traffic-proxy sidecar:注入到 Sandbox Pod 内的代理,透明拦截出口流量并转发至 egress-gateway。

默认配置适用于中小规模场景。生产环境建议参考默认组件规格调整组件规格。

前提条件

  • 已部署 ack-agent-sandbox-controller 组件(版本 >= 0.5.14),负责 Sandbox 生命周期管理。

  • 已部署 ack-sandbox-manager 组件(版本 >= 0.6.1),负责 SecurityProfile CRD 注册及增强流量管理组件的自动部署,且在组件配置中已勾选Whether to enable enhanced traffic management feature。规格参数配置,请参考配置规格和使用建议

说明

组件默认资源规格仅适用于中小规模流量管理场景。生产环境请根据实际业务负载评估,并参考默认组件规格调整配置,避免出现异常。

操作步骤

步骤一:创建 Sandbox

在创建 Sandbox 时,可以通过 network.alibabacloud.com/network-policy-mode 注解(Annotation)来声明不同的网络策略模式。本示例将创建一个开启 增强流量策略(Enhanced Traffic Policy) 模式的 Sandbox,系统将自动注入 traffic-proxy Sidecar。

  1. 将以下内容保存为 sandbox.yaml,执行kubectl apply -f sandbox.yaml进行资源创建:

    apiVersion: agents.kruise.io/v1alpha1
    kind: Sandbox
    metadata:
      name: sample
      namespace: default
    spec:
      template:
        metadata:
          labels:
            agent: sample
            alibabacloud.com/compute-class: agent-sandbox
          annotations:
            network.alibabacloud.com/network-policy-mode: enhanced-traffic-policy
        spec:
          containers:
          - name: sandbox
            image: registry.cn-hangzhou.aliyuncs.com/acs/curl:8.1.2
            command: ["/bin/sleep", "infinity"]

    关键配置说明

    • network.alibabacloud.com/network-policy-mode: 该注解用于定义 Sandbox 的网络治理能力。不同取值的区别请参考概述

    • spec.template.metadata.labels: Pod 的标签,用于被 SecurityProfile 的 selector 选中以应用安全策略。

  2. 执行以下命令确认 Sandbox 已正常运行:

    kubectl get sandbox sample -n default

    预期输出:

    NAME     STATUS    AGE
    sample   Running   2m
  3. 执行以下命令确认 traffic-proxy Sidecar 已注入:

    kubectl get pod -l agent=sample -n default

    预期输出:

    NAME      READY   STATUS    RESTARTS   AGE
    sample    2/2     Running   0          2m
    READY状态2/2表示业务容器与 traffic-proxy Sidecar 均已就绪。

步骤二:验证默认放行行为

未配置 SecurityProfile 时,Sandbox 的所有出口流量默认放行。

  1. 测试访问外部服务:

    kubectl exec sample -n default -c sandbox -- curl -s http://httpbin.org/get

    预期返回正常的HTTP 200响应:

    {
      "args": {},
      "headers": {
        "Host": "httpbin.org",
        "User-Agent": "curl/8.1.2"
      },
      "origin": "47.239.x.x",
      "url": "http://httpbin.org/get"
    }
  2. 测试访问/admin路径:

    kubectl exec sample -n default -c sandbox -- curl -s -o /dev/null -w "%{http_code}" http://httpbin.org/admin

    预期返回 404(httpbin.org 自身返回的状态码,说明请求已到达目标服务,未被阻断)。

步骤三:创建 SecurityProfile 阻断规则

创建 SecurityProfile 阻止访问任何域名下的 /admin 前缀路径。完整示例及配置说明,请参考完整示例

  1. 将以下内容保存为 securityprofile.yaml,并执行kubectl apply -f securityprofile.yaml创建资源:

    apiVersion: agents.kruise.io/v1alpha1
    kind: SecurityProfile
    metadata:
      name: agent-profile
      namespace: default
    spec:
      selector:
        matchLabels:
          agent: sample
      rules:
      - name: deny-admin
        match:
        - domains:
          - "*"
          paths:
          - type: Prefix
            value: /admin
          methods:
          - GET
          - POST
          - PUT
          - DELETE
        actions:
          block:
            statusCode: 403
            body: '{"error":"admin path is blocked"}'
  2. 查看 SecurityProfile 状态:

    kubectl get securityprofile -n default

    预期输出:

    NAME            AGE
    agent-profile   30s

步骤四:验证流量阻断效果

SecurityProfile 创建后规则立即生效。

  • 测试 1:访问被阻断的 /admin 路径

    kubectl exec sample -n default -c sandbox -- curl -s http://httpbin.org/admin

    预期输出:

    {"error":"admin path is blocked"}

    验证状态码:

    kubectl exec sample -n default -c sandbox -- curl -s -o /dev/null -w "%{http_code}" http://httpbin.org/admin

    预期返回 403

  • 测试 2:/admin 子路径同样被阻断

    由于规则使用 Prefix 匹配,所有以 /admin 为前缀的路径均被阻断:

    kubectl exec sample -n default -c sandbox -- curl -s http://httpbin.org/admin/users

    预期输出:

    {"error":"admin path is blocked"}
  • 测试 3:非 /admin 路径正常放行

    kubectl exec sample -n default -c sandbox -- curl -s -o /dev/null -w "%{http_code}" http://httpbin.org/get

    预期返回 200

  • 测试 4:未在 methods 列表中的方法不受影响

    kubectl exec sample -n default -c sandbox -- curl -s -o /dev/null -w "%{http_code}" -X OPTIONS http://httpbin.org/admin

    规则仅配置了 GET/POST/PUT/DELETE 方法,OPTIONS 不在限制范围内,请求被放行。

步骤五:更新 SecurityProfile(可选)

可随时更新 SecurityProfile 规则,变更实时生效。以下示例新增一条阻断特定域名访问的规则:

apiVersion: agents.kruise.io/v1alpha1
kind: SecurityProfile
metadata:
  name: agent-profile
  namespace: default
spec:
  selector:
    matchLabels:
      agent: sample
  rules:
  - name: deny-admin
    match:
    - domains:
      - "*"
      paths:
      - type: Prefix
        value: /admin
      methods:
      - GET
      - POST
      - PUT
      - DELETE
    actions:
      block:
        statusCode: 403
        body: '{"error":"admin path is blocked"}'
  - name: deny-internal-service
    match:
    - domains:
      - "*.internal.company.com"  # 阻断的域名,支持通配
    actions:
      block:
        statusCode: 403                                               # 自定义响应状态
        body: '{"error":"access to internal services is forbidden"}'  # 自定义响应提示

步骤六:删除 SecurityProfile 配置(可选)

kubectl delete securityprofile agent-profile -n default

常见使用场景

SecurityProfile 支持基于域名、URL 路径、HTTP 方法、请求头、查询参数、端口等多维度组合阻断。以下为典型场景。

场景一:阻断管理后台路径访问

阻止 Agent 访问任何域名下的管理后台路径(/admin/console/dashboard)。

rules:
- name: deny-management-paths
  match:
  - domains: ["*"]
    paths:
    - type: Prefix
      value: /admin
    - type: Prefix
      value: /console
    - type: Prefix
      value: /dashboard
    - type: Prefix
      value: /manage
  actions:
    block:
      statusCode: 403
      body: '{"error":"management paths are blocked"}'

场景二:阻断敏感域名和元数据服务访问

阻止访问内部服务域名和云平台元数据服务地址,防止 SSRF 攻击。

rules:
- name: deny-internal-and-metadata
  match:
  - domains:
    - "*.internal.company.com"
    - "*.corp.net"
    - "metadata.google.internal"
  actions:
    block:
      statusCode: 403
      body: '{"error":"access to internal services and metadata endpoints is forbidden"}'

场景三:只读模式(阻断写操作)

仅允许 GET/HEAD 请求,阻止所有数据修改操作,适用于只读型 Agent。

rules:
- name: read-only-mode
  match:
  - domains: ["*"]
    paths:
    - type: Prefix
      value: /
    methods: ["POST", "PUT", "DELETE", "PATCH"]
  actions:
    block:
      statusCode: 405
      body: '{"error":"write operations are not allowed in read-only mode"}'

场景四:精确阻断特定 API 端点

使用 Exact 类型精确匹配某个 API 路径,不影响同前缀下的其他接口。

rules:
- name: deny-user-deletion
  match:
  - domains: ["api.example.com"]
    paths:
    - type: Exact
      value: /api/v1/users/delete
    methods: ["POST", "DELETE"]
  actions:
    block:
      statusCode: 403
      body: '{"error":"user deletion API is not permitted"}'

场景五:基于正则表达式阻断动态路径

使用 Regex 匹配阻断符合特定模式的动态路径(如 /internal/v1/.../internal/v2/...)。

rules:
- name: deny-internal-versioned-api
  match:
  - domains: ["*"]
    paths:
    - type: Regex
      value: "^/internal/v[0-9]+/.*"
  actions:
    block:
      statusCode: 403
      body: '{"error":"access to internal versioned APIs is blocked"}'

场景六:阻断携带特定请求头的流量

阻止 Agent 伪造管理员身份头访问外部服务。

rules:
- name: deny-admin-role-header
  match:
  - domains: ["*"]
    headers:
    - name: X-User-Role
      type: Exact
      value: admin
  actions:
    block:
      statusCode: 403
      body: '{"error":"requests with admin role header are not allowed"}'

场景七:组合多维度条件精细化阻断

同一 match 条目中的多个字段为逻辑与(AND)关系(必须同时满足),多个 match 条目为 OR 关系(满足任一即触发)。

rules:
- name: deny-json-upload
  match:
  - domains: ["storage.example.com"]
    paths:
    - type: Prefix
      value: /upload
    methods: ["POST", "PUT"]
    headers:
    - name: Content-Type
      type: Prefix
      value: "application/json"
  actions:
    block:
      statusCode: 403
      body: '{"error":"JSON upload to storage service is not allowed"}'

场景八:阻断非标准端口的访问

阻止通过非常规端口进行的规避安全审计或越权访问。

rules:
- name: deny-non-standard-ports
  match:
  - domains: ["*"]
    ports: [8080, 8443, 9090, 3000, 6379, 27017]
  actions:
    block:
      statusCode: 403
      body: '{"error":"access to non-standard ports is blocked"}'

SecurityProfile CRD 定义

完整示例

以下示例综合使用域名通配、路径前缀/精确/正则匹配、HTTP 方法过滤等多种匹配维度:

apiVersion: agents.kruise.io/v1alpha1
kind: SecurityProfile
metadata:
  name: comprehensive-profile
  namespace: default
spec:
  selector:
    matchLabels:
      app: ai-agent
  rules:
  # 阻断所有管理后台路径
  - name: deny-admin-paths
    match:
    - domains: ["*"]
      paths:
      - type: Prefix
        value: "/admin"
      - type: Prefix
        value: "/console"
      - type: Prefix
        value: "/dashboard"
      methods: ["GET", "POST", "PUT", "DELETE"]
    actions:
      block:
        statusCode: 403
        body: '{"error":"management paths are blocked"}'
  # 只读模式 - 阻断所有写操作
  - name: read-only-mode
    match:
    - domains: ["*"]
      paths:
      - type: Prefix
        value: "/"
      methods: ["POST", "PUT", "DELETE", "PATCH"]
    actions:
      block:
        statusCode: 405
        body: '{"error":"write operations are not allowed"}'
  # 正则匹配阻断内部版本化 API
  - name: deny-internal-api
    match:
    - domains: ["api.internal.com"]
      paths:
      - type: Regex
        value: "^/api/v[0-9]+/(users|tokens)/delete"
    actions:
      block:
        statusCode: 403
        body: '{"error":"deletion APIs are blocked"}'
  # 阻断非标准端口
  - name: deny-debug-ports
    match:
    - domains: ["*"]
      ports: [8080, 9090, 3000]
    actions:
      block:
        statusCode: 403
        body: '{"error":"non-standard port access is blocked"}'

SecurityProfileSpec

spec 定义应用于目标 Pod 出口流量的 L7 安全策略。

字段名

说明

示例值

selector

标签选择器,选择此策略生效的目标 Pod。空选择器匹配同命名空间下的所有 Pod。必填

matchLabels: {agent: sample}

rules

有序规则链。默认放行(Default Continue)语义:所有匹配规则的动作按顺序执行,直到终止性动作短路。空规则链等同于放行所有流量。选填。

见 SecurityRule

selector

标准 Kubernetes LabelSelector 对象。

字段名

说明

示例值

matchLabels

键值对映射。Pod 标签必须包含所有指定键值对。多条目为逻辑与(AND)关系。

{agent: sample}

matchExpressions

标签选择器表达式列表。支持 InNotInExistsDoesNotExist。多条目为逻辑与(AND)关系。

[{key: agent, operator: In, values: [sample, demo]}]

SecurityRule

规则链中的单条规则。采用 Default Continue 语义:执行完一条规则的动作后继续评估下一条,除非遇到终止性动作(如 Block)短路。

说明

规则顺序具有显著意义。通配域名的规则不会屏蔽后续更具体域名的规则——多条规则可能按顺序匹配同一请求。

字段名

说明

示例值

name

规则唯一标识名,用于指标采集和事件记录。必填

deny-admin

match

匹配条件列表。多条目为 OR 关系(满足任一即触发)。必填,至少 1 个条目。

RuleMatch

actions

动作配置。终止性动作会短路整个规则链。必填

SecurityRuleActions

RuleMatch

单条匹配条件。同一 RuleMatch 内多个字段为逻辑与(AND)关系;多个 RuleMatch 条目为 OR 关系。

字段名

说明

示例值

domains

目标主机名列表。支持 "*"(任意域名)和 "*.example.com" 通配前缀。必填

["*"]["api.openai.com"]

paths

URL 路径匹配条件列表。多条目为 OR 关系。不含查询字符串。选填。

[{type: Prefix, value: /admin}]

methods

HTTP 方法过滤。仅当配置了 paths 字段时生效。可选值:GETHEADPOSTPUTPATCHDELETEOPTIONSCONNECTTRACE。选填。

["GET", "POST"]

ports

目标端口过滤。多条目为 OR 关系。取值 1~65535。选填。

[80, 443, 8080]

headers

请求头匹配条件。多条目为逻辑与(AND)关系。选填。

详见HeaderMatch

queryParams

URL 查询参数匹配条件。多条目为逻辑与(AND)关系。同一 key 多次出现只匹配首个值。选填。

详见QueryParamMatch

PathMatch

字段名

说明

示例值

type

路径匹配策略。可选值:Prefix(前缀)、Exact(精确)、Regex(RE2 正则)。默认 Prefix

Prefix

value

匹配模式值。长度 1~256 字符。必填

/admin/api/v1/users^/v[0-9]+/.*

HeaderMatch

请求头匹配条件。多个 HeaderMatch 在同一 RuleMatch 中为逻辑与(AND)关系。

字段名

说明

示例值

name

请求头名称(匹配时不区分大小写)。长度 1~256 字符。必填

AuthorizationX-Custom-Header

type

匹配策略。可选值:ExactPrefixRegex。默认 Exact

Exact

value

匹配值。长度 1~512 字符。必填

adminBearer xxx^Bearer .*

QueryParamMatch

URL 查询参数匹配条件。多个条目为逻辑与(AND)关系。对同一 key 多次出现(如 ?tag=a&tag=b)仅匹配首个值。

字段名

说明

示例值

name

查询参数键名(区分大小写)。长度 1~256 字符。必填

pageaction

type

匹配策略。可选值:ExactPrefixRegex。默认 Exact

Exact

value

匹配值。长度 1~512 字符。必填

deletetrue^prod-.*

SecurityRuleActions

动作配置。当前版本仅开放 block 动作,其余动作类型后续支持。

字段名

说明

是否终止性

状态

block

返回配置的 HTTP 响应给客户端,不转发上游请求。

终止性

已支持

block(阻断)

命中规则时立即返回配置的 HTTP 响应,请求不会转发至上游目标服务。

字段名

说明

示例值

statusCode

返回给客户端的 HTTP 状态码。取值 100-599。默认 403

403429503

body

响应体内容,原样发送。选填,省略时不返回响应体。

{"error":"access denied"}

可观测性

增强出口流量管理提供完整的日志和监控能力,组件部署在 sandbox-traffic-system 命名空间。

组件日志

egress-gateway 访问日志

egress-gateway 默认开启结构化访问日志,输出至 stdout。关键字段:

展开查看日志关键字段说明

字段名

说明

start_time

请求开始时间

method

HTTP 请求方法

path

请求路径

authority_for

请求目标主机名

protocol

请求协议

response_code

响应状态码

response_flags

Envoy 响应标记,可识别异常原因

duration

请求总耗时(毫秒)

bytes_received

接收字节数

bytes_sent

发送字节数

sandbox_name

发起请求的 Sandbox 名称

sandbox_namespace

Sandbox 所在命名空间

upstream_address

上游目标地址

request_id

请求唯一标识

user_agent

客户端 User-Agent

查看日志:

kubectl logs -l gateway.networking.k8s.io/gateway-name=egress-gateway -n sandbox-traffic-system -f

traffic-extension 日志

以结构化 JSON 格式输出策略执行日志,记录每次请求的来源 Pod 信息、目标主机和路径、匹配 SecurityProfile 数量及处理结果。

gateway-controller 日志

以结构化格式输出控制面日志,记录配置推送事件和连接状态。

kubectl logs -l app=gateway-controller -n sandbox-traffic-system -f

监控指标

各组件暴露的 Prometheus 监控指标:

组件

指标端口

指标路径

服务发现方式

egress-gateway

15020

/stats/prometheus

Pod 注解(prometheus.io/scrape: "true"

gateway-controller

15014

/metrics

Service 端口(http-monitoring

组件已预置 prometheus.io/scrape: "true" 注解。如集群已启用阿里云 Prometheus 监控或部署了社区版 Prometheus 且配置了注解服务发现规则,指标自动采集,无需额外配置。

配置规格和使用建议

默认组件规格

增强出口流量管理组件部署在 sandbox-traffic-system 命名空间中,默认规格如下:

组件

功能说明

默认副本数

默认 CPU(Requests/Limits)

默认内存(Requests/Limits)

HPA

gateway-controller

控制面组件,负责 traffic-proxy sidecar 和 egress-gateway 的配置管理与下发

2

4 / 4

4Gi / 4Gi

未启用

egress-gateway

出口网关,统一接收并转发集群内 Sandbox 的出口流量

2

2 / 2

2Gi / 2Gi

未启用

traffic-extension

策略执行引擎,执行出口流量管理策略(流量拦截、token 注入等)

2

2 / 2

2Gi / 2Gi

未启用

egress-gateway 与 traffic-extension

两个组件的承载能力受底层计算资源的 CPU 和网络带宽限制,建议保持相同规格。

  • 高 QPS 场景(小请求)

    单个 egress-gateway Pod(8C 8Gi 规格)的 QPS 承载能力:

    计算类型

    单Pod可支撑 QPS

    ACS通用型(general-purpose)

    约 10,000

    ACS性能型(performance)

    约 25,000

    说明

    以上为实验室测试数据,阿里云不作为业务指标承诺,请以实际业务场景为准。建议在运行过程中关注业务侧是否存在丢包现象,或通过网关日志监测是否出现502状态码,以评估实际承载性能。

    限制说明:

    • 高 QPS 场景建议选择 ACS性能型Pod。

    • 受 Linux 临时端口范围限制(默认 32768-60999),单 Pod QPS 存在上限。如需更大流量,需通过 HPA 水平扩容增加副本数。

  • 大文件传输场景(高带宽)

    egress-gateway 吞吐能力主要取决于底层计算资源网络带宽上限:

    计算类型

    单Pod最大网络带宽(参考值)

    ACS通用型(8C 规格)

    约 10.5 Gbps

    ACS性能型(8C 规格)

    约 16 Gbps

    说明

    ACS Pod支持的最大网络带宽以ACS实例规格中列出的规格为准。

    限制说明:

    • 网络带宽接近上限时延迟显著增加,建议监控网络吞吐指标。

    • ACS可通过增加副本数将流量分散到多个 Pod。

    • 大文件传输场景建议为 egress-gateway 配置至少 8Gi 内存。

gateway-controller

资源需求取决于集群纳管的 Pod 规模:

集群 Pod 规模

推荐副本数

推荐规格

<= 1,000

2

4C 4Gi

1,000 ~ 5,000

4

4C 4Gi

> 5,000

4

8C 8Gi

常见问题

如何调整 egress-gateway 或 traffic-extension 的资源规格?

请在业务低峰期操作。
  1. 在目标集群详情页,左侧导航栏选择组件管理

  2. 组件管理页搜索定位ack-sandbox-manager,单击配置

  3. 在组件配置页,调整enhancedTrafficManagement区块的egress-gateway traffic-extension组件resources值(CPU 的requestslimits建议设置为相等值,确保 HPA 基于 CPU 利用率的扩缩容计算准确)。然后单击确认

相关文档