TrafficPolicy 用于控制ACKACS集群中 Agent 类应用的网络访问。TrafficPolicy可以基于优先级实现多级网络策略,支持 CIDR、Service、FQDN 等多种匹配方式,精细管理 Pod 出入方向流量。
工作原理
TrafficPolicy 与 GlobalTrafficPolicy
ACKACS集群提供两种网络策略资源:
资源类型 | 作用范围 | 适用场景 |
TrafficPolicy | 命名空间级别,作用于指定命名空间中具有特定标签的 Pod | 为特定应用配置精细化网络规则 |
GlobalTrafficPolicy | 集群级别,作用于全集群中具有指定标签的Pod | 实现全集群安全基线,如禁止访问元数据服务 |
策略执行规则
TrafficPolicy 的规则匹配遵循以下原则:
按优先级排序:优先级范围为 1-1000,数值越小优先级越高。高优先级策略先执行。
同优先级内按顺序匹配:同一策略内的规则按定义顺序从上到下依次匹配。
命中即止:匹配到第一条规则后立即终止,不再继续匹配后续规则。
默认拒绝:当 Pod 被任一策略选中后,未被显式允许的流量将被拒绝。
规则顺序直接影响匹配结果。必须将具体的允许或拒绝规则放在最前,兜底规则放在最后。
支持的匹配条件
方向 | 匹配条件 | 说明 |
Ingress(入方向) |
| 基于源 IP 网段匹配 |
| 基于来源 Service 匹配 | |
Egress(出方向) |
| 基于目标 IP 网段匹配 |
| 基于目标 Service 匹配 | |
| 基于目标域名匹配 |
Ingress 规则不支持 FQDN 匹配。
与 Kubernetes NetworkPolicy 的对比
相比原生 Kubernetes NetworkPolicy,TrafficPolicy与GlobalTrafficPolicy具有以下优势:
能力 | Kubernetes NetworkPolicy | TrafficPolicy与GlobalTrafficPolicy |
优先级控制 | 不支持 | 支持 1-1000 多级优先级 |
显式Deny | 不支持 | 支持 |
FQDN 匹配 | 不支持 | 支持 |
支持的集群规模 | 集群节点数量不超过5000 集群Pod数量不超过20,000 | 集群Pod数量不超过50,000 |
Agent 快速扩缩容场景 | 管理复杂度高 | 专为此场景优化 |
适用范围
集群版本为1.20或更高。
仅适用于虚拟节点上的ACS或ECI Pod。
已安装Poseidon组件,组件版本为v0.7.0或更高,已开启TrafficPolicy功能。
Poseidon v0.7.0目前正在灰度发布中。
配置示例
快速开始
以下示例展示如何为 Agent 应用配置基础网络策略,允许访问 DNS 服务和公网。
步骤一:在Agent Pod中启用TrafficPolicy
将下方示例保存到agent-pod.yaml,然后执行kubectl apply -f agent-pod.yaml部署示例Pod。
Pod 需要配置 spec.tolerations 以调度到ACS虚拟节点。network.alibabacloud.com/enable-network-policy-agent: "true":启用网络策略 Agent。network.alibabacloud.com/network-policy-mode: "traffic-policy":指定使用 TrafficPolicy 模式。
apiVersion: v1
kind: Pod
metadata:
name: agent-pod
annotations:
network.alibabacloud.com/enable-network-policy-agent: "true"
network.alibabacloud.com/network-policy-mode: "traffic-policy"
labels:
app: agent
alibabacloud.com/acs: "true"
spec:
tolerations:
- key: "virtual-kubelet.io/provider"
operator: "Equal"
value: "alibabacloud"
effect: "NoSchedule"
containers:
- name: agent
image: registry.aliyuncs.com/acs/ubuntu:latest
command: ["sleep", "infinity"]步骤二:创建 TrafficPolicy
创建以下 YAML 文件 agent-basic-policy.yaml,允许 Agent 访问 DNS 服务和公网。
apiVersion: network.alibabacloud.com/v1alpha1
kind: TrafficPolicy
metadata:
name: agent-basic-policy
namespace: default
spec:
priority: 100
selector:
matchLabels:
app: agent
egress:
rules:
# 允许访问 DNS 服务
- action: allow
to:
- service:
namespace: kube-system
name: kube-dns
# 允许访问公网
- action: allow
to:
- cidr: 0.0.0.0/0步骤三:应用并验证
应用策略。
kubectl apply -f agent-basic-policy.yaml查看策略状态。
kubectl get trafficpolicy -n default预期输出:
NAME PRIORITY AGE agent-basic-policy 100 10s验证网络连通性。
# 进入 Pod kubectl exec -it agent-pod -n default -- /bin/bash # 安装网络工具 apt-get update && apt-get install -y curl dnsutils # 测试公网访问(应成功) curl -I https://www.aliyun.com # 测试 DNS 解析(应成功) nslookup www.aliyun.com
仅允许Pod访问指定服务和域名
以下策略允许 Agent 访问 DNS 服务、指定域名和指定网段,同时禁止访问云产品元数据服务和其他所有地址。
请将 rds-xxx.aliyuncs.com 替换为实际的 RDS 实例域名。apiVersion: network.alibabacloud.com/v1alpha1
kind: TrafficPolicy
metadata:
name: agent-egress-policy
namespace: default
spec:
priority: 100
selector:
matchLabels:
app: agent
egress:
rules:
# 禁止访问云产品元数据服务
- action: deny
to:
- cidr: 100.100.100.200/32
# 允许访问指定网段
- action: allow
to:
- cidr: 100.96.0.0/10
# 允许访问指定域名
- action: allow
to:
- fqdn: rds-xxx.aliyuncs.com
# 允许访问 DNS 服务
- action: allow
to:
- service:
namespace: kube-system
name: kube-dns
# 兜底规则:禁止访问其他所有地址
- action: deny
to:
- cidr: 0.0.0.0/0禁止Pod访问私有网络
在允许公网访问的同时,显式禁止访问私有网络网段。
apiVersion: network.alibabacloud.com/v1alpha1
kind: TrafficPolicy
metadata:
name: agent-internet-only-policy
namespace: default
spec:
priority: 100
selector:
matchLabels:
app: agent
egress:
rules:
# 允许 DNS
- action: allow
to:
- service:
namespace: kube-system
name: kube-dns
# 禁止访问私有网络
- action: deny
to:
- cidr: 10.0.0.0/8
- action: deny
to:
- cidr: 172.16.0.0/12
- action: deny
to:
- cidr: 192.168.0.0/16
# 允许公网
- action: allow
to:
- cidr: 0.0.0.0/0仅允许指定 Service 访问Pod
以下策略限制 Agent 仅接受来自 Gateway 服务的访问请求。
apiVersion: network.alibabacloud.com/v1alpha1
kind: TrafficPolicy
metadata:
name: agent-ingress-policy
namespace: default
spec:
priority: 100
selector:
matchLabels:
app: agent
ingress:
rules:
# 允许来自 Gateway 的访问
- action: allow
from:
- service:
name: sandbox-gateway
namespace: sandbox-system
# 兜底规则:禁止其他所有来源
- action: deny
from:
- cidr: 0.0.0.0/0全集群维度的访问控制
以下全局策略禁止特定网段访问集群内 Pod,同时允许其他所有流量。
apiVersion: network.alibabacloud.com/v1alpha1
kind: GlobalTrafficPolicy
metadata:
name: global-security-baseline
spec:
priority: 1000 # 低优先级,作为兜底策略
selector: {} # 作用于全集群 Pod
ingress:
rules:
# 禁止 Sandbox 网段访问
- action: deny
from:
- cidr: 10.8.0.0/16
# 允许其他所有来源
- action: allow
from:
- cidr: 0.0.0.0/0
egress:
rules:
- action: allow
to:
- cidr: 0.0.0.0/0GlobalTrafficPolicy 的selector设置为空{},表示作用于全集群所有匹配的 Pod。
组合多级安全策略
多个 TrafficPolicy 可以组合使用,通过不同优先级实现分层控制。以下是推荐的优先级分层方案及配置示例。
优先级范围 | 用途 | 示例场景 |
1-49(高优先级) | 基础设施服务 | DNS、监控、日志收集 |
50-499(中优先级) | 业务服务 | 数据库、缓存、消息队列 |
500-1000(低优先级) | 兜底策略 | 全局安全基线、公网访问控制 |
基础设施服务(高优先级)
apiVersion: network.alibabacloud.com/v1alpha1
kind: TrafficPolicy
metadata:
name: infra-policy
namespace: default
spec:
priority: 10
selector:
matchLabels:
app: agent
egress:
rules:
- action: allow
to:
- service:
namespace: kube-system
name: kube-dns
- action: allow
to:
- service:
namespace: monitoring
name: prometheus业务服务(中优先级)
apiVersion: network.alibabacloud.com/v1alpha1
kind: TrafficPolicy
metadata:
name: business-policy
namespace: default
spec:
priority: 100
selector:
matchLabels:
app: agent
egress:
rules:
- action: allow
to:
- service:
namespace: default
name: redis
- action: allow
to:
- service:
namespace: default
name: mysql公网访问控制(低优先级)
apiVersion: network.alibabacloud.com/v1alpha1
kind: TrafficPolicy
metadata:
name: internet-policy
namespace: default
spec:
priority: 500
selector:
matchLabels:
app: agent
egress:
rules:
- action: allow
to:
- cidr: 0.0.0.0/0为OpenClaw配置完整网络策略
以下是 OpenClaw 应用的完整网络隔离策略,同时包含 Ingress 和 Egress 规则。
apiVersion: network.alibabacloud.com/v1alpha1
kind: TrafficPolicy
metadata:
name: openclaw-policy
namespace: default
spec:
priority: 100
selector:
matchLabels:
app: openclaw
ingress:
rules:
# 允许来自 Gateway 和 Sandbox Manager 的访问
- action: allow
from:
- service:
name: sandbox-gateway
namespace: sandbox-system
- service:
name: sandbox-manager
namespace: sandbox-system
# 禁止其他所有来源
- action: deny
from:
- cidr: 0.0.0.0/0
egress:
rules:
# 禁止访问云产品元数据服务
- action: deny
to:
- cidr: 100.100.100.200/32
# 允许 DNS 服务
- action: allow
to:
- service:
namespace: kube-system
name: kube-dns
# 允许访问 LLM 代理服务
- action: allow
to:
- service:
namespace: llm-proxy
name: llm-proxy
# 禁止访问私有网络
- action: deny
to:
- cidr: 10.0.0.0/8
- action: deny
to:
- cidr: 172.16.0.0/12
- action: deny
to:
- cidr: 192.168.0.0/16
# 允许访问公网
- action: allow
to:
- cidr: 0.0.0.0/0最佳实践
遵循最小权限原则
只授予 Pod 必要的网络访问权限。显式列出允许访问的服务和地址,默认拒绝其余流量。
egress:
rules:
# 明确允许的服务
- action: allow
to:
- service:
namespace: kube-system
name: kube-dns
- action: allow
to:
- fqdn: api.aliyun.com
# 禁止私有网络
- action: deny
to:
- cidr: 10.0.0.0/8
# 按需允许公网
- action: allow
to:
- cidr: 0.0.0.0/0设计精确的标签选择器
使用多维度标签精确匹配目标 Pod,避免策略误伤。
# 推荐:多维度标签
selector:
matchLabels:
app: agent
environment: production
team: ai-platform
# 避免:过于宽泛的标签
selector:
matchLabels:
app: agent标签设计建议:
app:标识应用类型environment:区分环境(production、staging、development)team:标识所属团队
结合 GlobalTrafficPolicy 使用
将 GlobalTrafficPolicy 作为全集群安全基线,TrafficPolicy 实现应用级精细控制:
策略层 | 类型 | 优先级 | 职责 |
应用层 | TrafficPolicy | 50-200 | 特定应用的精细网络规则 |
全局层 | GlobalTrafficPolicy | 1000 | 集群安全基线(如禁止 Sandbox 网段) |
定期审计策略
建立定期的策略审计机制:
检查 TrafficPolicy 是否符合最新安全要求
审查被拒绝的连接日志,发现潜在问题
清理不再使用的策略
根据业务变化调整策略
验证优先级设置是否合理
审计脚本示例:
#!/bin/bash
echo "=== 所有 TrafficPolicy ==="
kubectl get trafficpolicy --all-namespaces -o wide
echo -e "\n=== 所有 GlobalTrafficPolicy ==="
kubectl get globaltrafficpolicy -o wide
echo -e "\n=== Agent Pod 列表 ==="
kubectl get pods -l app=agent --all-namespaces使用版本控制管理策略
将 TrafficPolicy 配置纳入 Git 管理,按用途组织目录。
traffic-policies/
├── base/ # 基础策略
│ ├── global-security-baseline.yaml
│ └── dns-access.yaml
├── applications/ # 应用策略
│ ├── openclaw-policy.yaml
│ └── agent-policy.yaml
└── environments/ # 环境差异
├── production/
│ └── overrides.yaml
└── staging/
└── overrides.yaml常见问题
策略不生效
现象:TrafficPolicy 已创建,但网络访问未被限制。
排查步骤:
检查 Poseidon 组件状态:确认已安装、组件版本为v0.7.0或更高、且开启了 TrafficPolicy 功能。
检查 Pod Annotations:确认 Pod 已配置必需的 Annotations。
检查 Pod 标签:确认 Pod 标签与策略的
selector.matchLabels完全匹配。kubectl get pod <pod-name> --show-labels检查规则顺序:确认具体规则在前,兜底规则在后。
kubectl get trafficpolicy <policy-name> -o yaml
策略冲突
现象:多个策略作用于同一 Pod,网络行为不符合预期。
排查步骤:
列出所有策略及其优先级:
kubectl get trafficpolicy,globaltrafficpolicy -A -o wide检查是否有相同优先级的策略作用于同一 Pod。
调整优先级数值,确保高优先级策略使用更小的数值。
合并冲突的策略以避免重复定义。
网络连接超时
现象:Pod 无法访问预期的地址或服务。
排查步骤:
确认是否有策略遗漏了必要的允许规则(如 DNS 服务)。
检查兜底规则是否过于严格,阻止了必要的网络访问。
在策略中添加必要的允许规则:
egress: rules: - action: allow to: - service: namespace: <namespace> name: <service-name>确保允许规则的优先级高于拒绝规则,或在同一策略中将允许规则放在拒绝规则之前。
Pod 无法被访问
现象:其他服务无法访问目标 Pod。
排查步骤:
检查 Ingress 规则是否允许了必要的来源服务。
添加来源服务的允许规则:
ingress: rules: - action: allow from: - service: name: <source-service> namespace: <source-namespace>
CRD 参考
TrafficPolicy 字段说明
apiVersion: network.alibabacloud.com/v1alpha1
kind: TrafficPolicy
metadata:
name: <policy-name> # 策略名称,同一命名空间内唯一
namespace: <namespace> # 策略所在命名空间
spec:
priority: <1-1000> # 优先级,数值越小优先级越高
selector: # Pod 选择器
matchLabels:
<label-key>: <label-value>
ingress: # 入方向规则(可选)
rules:
- action: allow|deny
from:
- cidr: <cidr>
- service:
name: <name>
namespace: <namespace>
egress: # 出方向规则(可选)
rules:
- action: allow|deny
to:
- cidr: <cidr>
- service:
name: <name>
namespace: <namespace>
- fqdn: <domain>GlobalTrafficPolicy 字段说明
apiVersion: network.alibabacloud.com/v1alpha1
kind: GlobalTrafficPolicy
metadata:
name: <policy-name> # 策略名称,集群内唯一
spec:
priority: <1-1000> # 优先级,数值越小优先级越高
selector: # Pod 选择器(空 {} 表示全集群)
matchLabels: {}
ingress: # 入方向规则(可选)
rules:
- action: allow|deny
from:
- cidr: <cidr>
- service:
name: <name>
namespace: <namespace>
egress: # 出方向规则(可选)
rules:
- action: allow|deny
to:
- cidr: <cidr>
- service:
name: <name>
namespace: <namespace>
- fqdn: <domain>匹配条件参考
Ingress 规则
字段 | 类型 | 说明 | 示例 |
| string | 源 IP 网段 |
|
| object | 来源 Service(包含 |
|
| string | 来源命名空间 |
|
Egress 规则
字段 | 类型 | 说明 | 示例 |
| string | 目标 IP 网段 |
|
| object | 目标 Service(包含 |
|
| string | 目标域名 |
|