NetworkPolicy怎么用?K8s网络隔离实践

本文聚焦在多租户隔离、敏感服务保护和最小访问控制这些场景,围绕策略模型、流量方向和上线验证三个维度展开,帮助你把 NetworkPolicy 从概念理解推进到可执行的网络隔离方案。

Kubernetes NetworkPolicy 网络隔离模型图

NetworkPolicy 解决什么问题

NetworkPolicy 本质上是基于标签和方向的访问控制模型。它不是传统边界防火墙的替代品,而是面向 Pod 层的网络准入规则。它能限制命名空间内外的访问关系,控制数据库、缓存、消息队列等敏感组件的暴露范围,并把“默认互通”的集群网络改造成“按需放行”的最小访问模型。

如果你的目标是生产治理,建议把它和 容器安全专题 以及 Kubernetes 实践 一起规划。网络策略不是单点配置,而是平台安全基线的一部分。

先建立默认拒绝

很多团队第一次写 NetworkPolicy 时,直接从允许规则开始,但更稳妥的方法是先建立默认拒绝,再逐步放行。这样新加入的 Pod 不会自动暴露给整个命名空间或集群。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-all
  namespace: app
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  - Egress

这类策略启用后,后续必须显式定义允许关系。它的价值在于把网络访问从隐式开放变成显式授权。

NetworkPolicy 入站与出站控制流程图

一个三层应用的策略模型

假设业务包含 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,也不要只测同命名空间,跨命名空间和多副本都要覆盖。

NetworkPolicy 上线验证检查清单图

常见验证命令包括:

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/

(0)
上一篇 1小时前
下一篇 1小时前

相关推荐