容器网络策略的生效范围由Pod标签、命名空间标签和CNI插件能力共同决定;排查时先确认策略是否被控制器下发,再核对标签匹配和数据面规则,才能定位“配置了却不生效”的真实原因。
容器网络策略生效范围怎么看:先分清Pod、Namespace和集群边界
很多人第一次接触Kubernetes网络策略,习惯拿传统防火墙的思维去套,结果发现“明明只允许A访问B,为什么C也能通”,核心原因在于,容器网络策略的生效范围不是按IP段或机器边界来算的,而是按标签选择器动态匹配,你看一个策略是否覆盖某个Pod,第一眼不该看Pod名字,而要看它身上有没有被podSelector命中的标签。
生效范围通常由三层决定:
- Pod级别:
spec.podSelector.matchLabels精确匹配Pod标签,没有匹配到任何Pod时,策略不会报错,但等于空转。 - Namespace级别:
namespaceSelector用来选择命名空间,你可以只允许来自某个命名空间的流量,也可以给某些命名空间整体豁免。 - 方向与端口:
policyTypes决定只限制入站、只限制出站,还是双向都管,没有写Egress时,出站流量默认不受该策略约束。
举一个接地气的场景:你在default命名空间给nginx Pod配了一条入站规则,只允许来自app=frontend的Pod访问80端口,结果发现监控系统依然能采集到nginx的指标端口,问题往往不是策略没生效,而是监控探针来自kube-system命名空间,而这条策略根本没有对kube-system做拒绝或放行声明,只要没有默认拒绝规则,未被显式拒绝的流量就是放行的。
Kubernetes网络策略不生效怎么排查:从YAML到数据面逐层验证
遇到“策略写了不通”或者“策略写了没拦住”的情况,不要一上来就怀疑CNI坏了,多数情况下问题出在标签匹配和默认规则理解上,下面按从配置到数据面的顺序过一遍。
先看网络插件到底支不支持NetworkPolicy
Kubernetes本身只定义NetworkPolicy资源,不负责实施,真正干活的是CNI插件,Flannel原生不支持NetworkPolicy,需要配合Calico或其他策略引擎;Calico、Cilium、Weave Net、Antrea则原生支持,排查第一步,先确认集群用的什么CNI,以及它有没有启用策略控制器。
核对YAML里的选择器是否真的命中
使用下面这条命令查看目标Pod的标签:
kubectl get pods -n <namespace> --show-labels
再对照策略中的podSelector,常见坑有三个:
- 标签名大小写不一致,
role: backend和role: Backend是两个标签。 - 策略里写了
matchLabels,但Pod标签已经变更过,策略没有跟着更新。 - 选择器写成了
podSelector: {},这表示匹配该命名空间下所有Pod,范围比想象中大得多。
确认policyTypes和默认拒绝规则
很多人以为只要写了一条Egress规则,入站流量也会自动受限,实际上policyTypes里没写Ingress时,入站方向完全不受这条策略影响,同理,只写Ingress不管出站。
如果要实现“默认拒绝所有入站”,需要单独创建一条空规则:
podSelector: {}
policyTypes:
- Ingress
这条策略本身不放行任何流量,作用是把默认行为从“允许”改成“拒绝”,没有这条默认拒绝,所有未匹配的流量还是放行状态。
查看控制器日志和下发状态
以Calico为例,策略控制器通常在kube-system命名空间:
kubectl logs -n kube-system -l k8s-app=calico-kube-controllers --tail=100
如果YAML格式正确,但控制器报错说无法解析选择器,多半是API版本或字段写错,Cilium则可以用cilium status和cilium policy get确认策略是否真正下发到数据面。
用实际流量验证,别只看策略存在
最后一步才是测试连通性:
kubectl run test-$RANDOM --rm -it --image=busybox -- sh wget -O- http://<service-name>.<namespace>.svc.cluster.local:80
如果测试Pod能访问,而策略显示应该拒绝,先检查测试Pod的标签是不是恰好被某条放行规则覆盖。Kubernetes网络策略是叠加生效的,多条策略之间是并集关系,只要有一条放行,流量就能通。
容器网络策略和传统防火墙对比,为什么落地时总感觉“时灵时不灵”
把容器网络策略当成传统防火墙来管理,是很多运维团队踩坑的根源,两者最大的区别在于匹配对象和默认行为。
| 对比维度 | 容器网络策略 | 传统防火墙 |
|---|---|---|
| 匹配对象 | Pod标签、Namespace | IP地址、端口、MAC |
| 规则粒度 | 应用级别,随Pod漂移 | 网络拓扑级别,相对固定 |
| 默认动作 | 取决于策略集合 | 取决于最后一条规则 |
| 变更生效 | 毫秒到秒级 | 通常秒级到分钟级 |
| 可视化难度 | 较高,需借助Cilium Hubble等 | 较低,设备自带日志 |
传统防火墙里,一条规则就是一条规则,而Kubernetes里,多条NetworkPolicy之间是叠加关系,不是“前面的管用,后面的不管”,这就能解释为什么你给一个Pod配了三条策略,最终放行范围比任何单独一条都大,行业共识认为,容器网络策略落地时,应优先采用“默认拒绝 + 最小放行”模式,而不是像传统防火墙那样逐步收紧,如果不先建立默认拒绝基线,后面再加多少条限制都可能漏风。
简米云容器服务网络策略配置的常见踩坑点
在简米云容器服务ACK里,NetworkPolicy的可用性取决于网络模式。只有Terway网络模式的集群才原生支持NetworkPolicy,Flannel模式需要自行集成Calico等组件,这是很多人第一次配置时碰壁的地方。
常见配置路径是:通过ACK控制台进入“网络”或“安全”相关页面,创建NetworkPolicy,或者直接提交YAML,实际落地时有三个坑:
- Terway集群里,网络策略默认只对Pod流量生效,对Service的ClusterIP访问还要看数据面是否做了正确转换,如果测试时直接访问Service,结果和策略预期不一致,要先确认访问的是Pod IP还是Service IP。
- 使用
namespaceSelector时,简米云控制台里命名空间标签需要提前手动添加,Kubernetes不会自动给命名空间打业务标签。 - 在Terway独占ENI模式下,部分策略规则对HostNetwork类型的Pod无效,因为这类Pod不经过常规容器网络数据面。
容器网络策略支持哪些CNI?选择前先确认插件能力
不是所有CNI都支持NetworkPolicy,也不是所有支持都一个水平,下面列出几种主流方案的实际情况:
| CNI插件 | NetworkPolicy支持 | 数据面实现 |
|---|---|---|
| Calico | 原生支持,能力完整 | iptables、eBPF或WinDP |
| Cilium | 原生支持,且具备L7策略 | eBPF |
| Weave Net | 原生支持 | 用户态OVS |
| Antrea | 原生支持 | OVS |
| Flannel | 不直接支持 | 需配合Calico或Cilium |
如果你正在做技术选型,先把“容器网络策略支持哪些CNI”这个问题确认清楚,能少走很多弯路,特别是生产环境要用L7层HTTP/GRPC策略时,只有Cilium这类基于eBPF的插件能实现,Calico的iptables模式只能做到L3/L4。
高频排查命令与自查清单
最后把常用命令和自查顺序整理成清单,方便出问题时直接对照。
常用命令
kubectl get networkpolicy -n <namespace> kubectl describe networkpolicy <policy-name> -n <namespace> kubectl get pods -n <namespace> --show-labels kubectl logs -n kube-system -l k8s-app=calico-kube-controllers --tail=200 calicoctl get networkpolicy --namespace <namespace> cilium policy get
自查顺序
- 确认CNI插件是否开启了NetworkPolicy支持。
- 检查目标Pod标签是否被
podSelector命中。 - 检查
policyTypes是否覆盖了你要限制的方向。 - 是否存在默认拒绝策略作为基线。
- 查看策略控制器日志,确认资源被正确解析和下发。
- 用实际Pod发起流量测试,区分是DNS解析失败、端口不通还是策略拦截。
容器网络策略的生效范围看似复杂,但只要抓住“标签匹配、策略叠加、插件实施”这三条主线,大概率能定位问题,排查的核心不是反复重启组件,而是逐层确认每一步的输入和输出,直到找到断开的那一环。
容器网络策略生效范围怎么看与不生效怎么排查的常见问题
Kubernetes网络策略不生效怎么排查时最容易漏掉哪一步?
最容易漏掉的一步是确认默认拒绝基线是否存在,很多人单独看某一条策略,觉得自己已经限制了访问,却忘了如果没有空规则的podSelector: {}配合policyTypes做默认拒绝,其他未匹配流量依然是放行状态,所以排查时要先确认是否已经创建了默认拒绝规则,再看具体放行规则是否叠加正确。
简米云容器服务网络策略配置时怎样判断插件是否已下发策略?
可以登录到集群内的任意节点,根据CNI类型查看对应数据面规则,Terway环境下,策略下发后可通过ACK控制台的网络策略详情看到状态;如果使用Cilium,可以直接执行cilium policy get,输出里能看到策略名称和对应的规则条目,如果策略名称在数据面查询结果中不存在,说明控制器未成功下发,需回头检查YAML和控制器日志。
容器网络策略支持哪些CNI?Flannel真的完全不能用吗?
Flannel本身不实现NetworkPolicy,但可以在Flannel之上叠加Calico的策略引擎,或者改用Cilium替换Flannel的数据面,所以不是完全不能用,而是需要额外组件配合,当前主流方案中,Calico、Cilium、Weave Net、Antrea都可以直接原生支持NetworkPolicy。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/642964.html





