相比 Kubernetes 原生 L3/L4 网络策略,Agent Sandbox 通过 SecurityProfile CRD 实现精细化 L7 出口流量管理。支持按域名、URL 等维度定义规则,有效防止敏感数据泄露与未授权 API 调用,提供更高维度的安全管控。
概述
Agent Sandbox 通过 network.alibabacloud.com/network-policy-mode 注解(Annotation)支持三种网络策略模式,适用于不同的流量管理需求:
模式 | 说明 | 能力范围 |
| 基础网络策略 | 仅支持使用 Kubernetes 原生 NetworkPolicy 进行网络访问控制。 |
| 流量策略 | 支持基于 TrafficPolicy CRD 的入方向和出方向四层(L4)流量管理,需安装 Poseidon 组件。 |
| 增强流量策略 | 系统将自动为 Pod 注入 traffic-proxy Sidecar。既支持基于 TrafficPolicy CRD 的四层流量管理,也支持基于 SecurityProfile CRD 的七层(L7)出口流量管理。仅使用 SecurityProfile 时,需安装 ack-sandbox-manager 组件并开启增强流量管理功能;若同时使用 TrafficPolicy,还需安装 Poseidon 组件。 |
本文档介绍 enhanced-traffic-policy 模式下,如何通过 SecurityProfile CRD 管理 Sandbox Pod 的七层出口流量。
工作原理
下图展示增强出口流量管理对 Sandbox 出口流量的完整拦截与处理流程:
流量拦截:Sandbox应用容器的所有出口请求被自动注入的 traffic-proxy Sidecar 透明拦截,应用层无感知。
流量重定向:Sidecar 将截获的流量转发至集群内的 egress-gateway。
安全规则评估:Egress Gateway 将请求元信息(来源 Pod 标签、请求 Host/Path/Method/Headers 等)发送至
traffic-extension服务。规则匹配:
traffic-extension根据请求来源 Pod 标签,查找命名空间下匹配的 SecurityProfile,按规则链顺序评估。执行动作:
命中 Block 规则:立即返回配置的 HTTP 状态码和响应体,请求不会转发至目标服务。
未命中任何 Block 规则:请求正常放行。
前提条件
已部署 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。
将以下内容保存为
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 选中以应用安全策略。
执行以下命令确认 Sandbox 已正常运行:
kubectl get sandbox sample -n default预期输出:
NAME STATUS AGE sample Running 2m执行以下命令确认 traffic-proxy Sidecar 已注入:
kubectl get pod -l agent=sample -n default预期输出:
NAME READY STATUS RESTARTS AGE sample 2/2 Running 0 2mREADY状态2/2表示业务容器与 traffic-proxy Sidecar 均已就绪。
步骤二:验证默认放行行为
未配置 SecurityProfile 时,Sandbox 的所有出口流量默认放行。
测试访问外部服务:
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" }测试访问
/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 前缀路径。完整示例及配置说明,请参考完整示例。
将以下内容保存为
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"}'查看 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 安全策略。
字段名 | 说明 | 示例值 |
| 标签选择器,选择此策略生效的目标 Pod。空选择器匹配同命名空间下的所有 Pod。必填。 |
|
| 有序规则链。默认放行(Default Continue)语义:所有匹配规则的动作按顺序执行,直到终止性动作短路。空规则链等同于放行所有流量。选填。 | 见 SecurityRule |
selector
标准 Kubernetes LabelSelector 对象。
字段名 | 说明 | 示例值 |
| 键值对映射。Pod 标签必须包含所有指定键值对。多条目为逻辑与(AND)关系。 |
|
| 标签选择器表达式列表。支持 |
|
SecurityRule
规则链中的单条规则。采用 Default Continue 语义:执行完一条规则的动作后继续评估下一条,除非遇到终止性动作(如 Block)短路。
规则顺序具有显著意义。通配域名的规则不会屏蔽后续更具体域名的规则——多条规则可能按顺序匹配同一请求。
字段名 | 说明 | 示例值 |
| 规则唯一标识名,用于指标采集和事件记录。必填。 |
|
| 匹配条件列表。多条目为 OR 关系(满足任一即触发)。必填,至少 1 个条目。 | |
| 动作配置。终止性动作会短路整个规则链。必填。 |
RuleMatch
单条匹配条件。同一 RuleMatch 内多个字段为逻辑与(AND)关系;多个 RuleMatch 条目为 OR 关系。
字段名 | 说明 | 示例值 |
| 目标主机名列表。支持 |
|
| URL 路径匹配条件列表。多条目为 OR 关系。不含查询字符串。选填。 |
|
| HTTP 方法过滤。仅当配置了 |
|
| 目标端口过滤。多条目为 OR 关系。取值 1~65535。选填。 |
|
| 请求头匹配条件。多条目为逻辑与(AND)关系。选填。 | |
| URL 查询参数匹配条件。多条目为逻辑与(AND)关系。同一 key 多次出现只匹配首个值。选填。 |
PathMatch
字段名 | 说明 | 示例值 |
| 路径匹配策略。可选值: |
|
| 匹配模式值。长度 1~256 字符。必填。 |
|
HeaderMatch
请求头匹配条件。多个 HeaderMatch 在同一 RuleMatch 中为逻辑与(AND)关系。
字段名 | 说明 | 示例值 |
| 请求头名称(匹配时不区分大小写)。长度 1~256 字符。必填。 |
|
| 匹配策略。可选值: |
|
| 匹配值。长度 1~512 字符。必填。 |
|
QueryParamMatch
URL 查询参数匹配条件。多个条目为逻辑与(AND)关系。对同一 key 多次出现(如 ?tag=a&tag=b)仅匹配首个值。
字段名 | 说明 | 示例值 |
| 查询参数键名(区分大小写)。长度 1~256 字符。必填。 |
|
| 匹配策略。可选值: |
|
| 匹配值。长度 1~512 字符。必填。 |
|
SecurityRuleActions
动作配置。当前版本仅开放 block 动作,其余动作类型后续支持。
字段名 | 说明 | 是否终止性 | 状态 |
| 返回配置的 HTTP 响应给客户端,不转发上游请求。 | 终止性 | 已支持 |
block(阻断)
命中规则时立即返回配置的 HTTP 响应,请求不会转发至上游目标服务。
字段名 | 说明 | 示例值 |
| 返回给客户端的 HTTP 状态码。取值 100-599。默认 |
|
| 响应体内容,原样发送。选填,省略时不返回响应体。 |
|
可观测性
增强出口流量管理提供完整的日志和监控能力,组件部署在 sandbox-traffic-system 命名空间。
组件日志
egress-gateway 访问日志
egress-gateway 默认开启结构化访问日志,输出至 stdout。关键字段:
查看日志:
kubectl logs -l gateway.networking.k8s.io/gateway-name=egress-gateway -n sandbox-traffic-system -ftraffic-extension 日志
以结构化 JSON 格式输出策略执行日志,记录每次请求的来源 Pod 信息、目标主机和路径、匹配 SecurityProfile 数量及处理结果。
gateway-controller 日志
以结构化格式输出控制面日志,记录配置推送事件和连接状态。
kubectl logs -l app=gateway-controller -n sandbox-traffic-system -f监控指标
各组件暴露的 Prometheus 监控指标:
组件 | 指标端口 | 指标路径 | 服务发现方式 |
egress-gateway | 15020 |
| Pod 注解( |
gateway-controller | 15014 |
| Service 端口( |
组件已预置 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 的资源规格?
请在业务低峰期操作。
在目标集群详情页,左侧导航栏选择组件管理。
在组件管理页搜索定位ack-sandbox-manager,单击配置。
在组件配置页,调整enhancedTrafficManagement区块的egress-gateway 或 traffic-extension组件
resources值(CPU 的requests和limits建议设置为相等值,确保 HPA 基于 CPU 利用率的扩缩容计算准确)。然后单击确认。