
NetworkPolicy 解决什么问题
NetworkPolicy 本质上是基于标签和方向的访问控制模型。它不是传统边界防火墙的替代品,而是面向 Pod 层的网络准入规则。它能限制命名空间内外的访问关系,控制数据库、缓存、消息队列等敏感组件的暴露范围,并把“默认互通”的集群网络改造成“按需放行”的最小访问模型。
如果你的目标是生产治理,建议把它和 容器安全专题 以及 Kubernetes 实践 一起规划。网络策略不是单点配置,而是平台安全基线的一部分。
先建立默认拒绝
很多团队第一次写 NetworkPolicy 时,直接从允许规则开始,但更稳妥的方法是先建立默认拒绝,再逐步放行。这样新加入的 Pod 不会自动暴露给整个命名空间或集群。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all
namespace: app
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
这类策略启用后,后续必须显式定义允许关系。它的价值在于把网络访问从隐式开放变成显式授权。

一个三层应用的策略模型
假设业务包含 web、api、db 三层。常见隔离关系是:只允许 web 访问 api,只允许 api 访问 db,禁止其他 Pod 直接访问 db。可以先通过标签定义工作负载,再用策略表达访问关系。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-api-from-web
namespace: app
spec:
podSelector:
matchLabels:
app: api
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: web
策略写法不复杂,真正的难点是标签治理。标签如果临时、混乱、含义不稳定,策略会越来越难维护;标签如果围绕应用、环境、角色和租户清晰设计,后续扩展会顺很多。
上线前必须验证
NetworkPolicy 不是写完就结束。上线前至少做三类测试:正向连通测试,确认允许的流量能访问;负向阻断测试,确认禁止的流量被拦截;变更回归测试,确认新服务上线后没有被策略误伤。不要只测单个 Pod,也不要只测同命名空间,跨命名空间和多副本都要覆盖。

常见验证命令包括:
kubectl get networkpolicy -n app
kubectl describe networkpolicy allow-api-from-web -n app
kubectl exec -n app deploy/web -- curl api-svc
kubectl exec -n app deploy/debug -- curl db-svc
如果策略看起来正确但没有生效,要检查 CNI 插件是否支持 NetworkPolicy。并非所有插件都执行策略,插件能力和安全设计必须一起评估。
从治理角度看它的价值
NetworkPolicy 的价值不只是阻断风险流量,更重要的是把访问关系显式化。原来谁都能访问谁的环境,会变成每条访问都需要理由。这对平台团队有三个收益:安全边界更清晰,故障定位更容易落到策略层,多租户环境更容易制定统一准入规则。
它也不与 API 网关、Ingress 或服务网格冲突。Ingress 治理入口,服务网格治理服务间调用,NetworkPolicy 治理 Pod 网络层访问。三者层次不同,组合起来才更完整。
小结
NetworkPolicy 最适合做最小权限网络访问控制。正确落地路径是先默认拒绝,再按业务关系逐步放行,并在上线前完成正向、负向和回归验证。只有策略、标签和 CNI 插件三者配合良好,K8s 网络隔离才会真正成为可持续的生产能力。
常见问题
NetworkPolicy 默认会拦截所有流量吗?
不会。Kubernetes 默认通常是允许所有流量,只有当某个 Pod 被 NetworkPolicy 选中后,相关方向的流量才会按策略收敛。因此上线策略前要明确选择器、命名空间和 ingress/egress 方向,避免误以为创建策略就自动隔离全局。
为什么 NetworkPolicy 配了却不生效?
常见原因是 CNI 插件不支持网络策略、Pod label 或 namespaceSelector 写错、策略方向不完整,或者测试流量没有命中被选中的 Pod。排查时要先确认 CNI 能力,再看策略选择器和实际流量方向。
生产环境如何安全上线 NetworkPolicy?
建议先观察流量依赖,按命名空间或应用分批启用,先写允许规则再逐步收敛,保留 DNS、监控、日志和必要平台组件访问。直接全局拒绝容易造成业务中断和排障困难。
转载请注明出处:https://www.cloudnative-tech.com/p/7374/