跳转至

NetworkPolicy:Pod 网络访问控制

NetworkPolicy 是 Kubernetes 的三/四层网络访问策略 API,用 Pod/Namespace Label 描述允许的入站和出站流量。策略是否真正生效取决于 CNI 插件是否支持 NetworkPolicy。

默认行为

没有任何 NetworkPolicy 选择某个 Pod 时,该 Pod 默认允许所有入站和出站。创建选择该 Pod 的 Ingress/Egress 策略后,对应方向变为“默认拒绝,显式允许”。多个策略的允许规则取并集,不按顺序执行。

Namespace 默认拒绝

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

启用默认拒绝前,必须先设计 DNS、监控、日志、镜像/依赖访问和必要业务调用,否则会一次性切断全部流量。

允许同 Namespace 访问应用

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-order-api
  namespace: order
spec:
  podSelector:
    matchLabels:
      app: order-api
  policyTypes: [Ingress]
  ingress:
    - from:
        - podSelector:
            matchLabels:
              app: order-web
      ports:
        - protocol: TCP
          port: 8080

允许跨 Namespace

from:
  - namespaceSelector:
      matchLabels:
        kubernetes.io/metadata.name: ingress-nginx
    podSelector:
      matchLabels:
        app.kubernetes.io/component: controller

同一个列表项中的 Namespace Selector 与 Pod Selector 表示同时满足;拆成两个列表项则表示“任一 Namespace 或任一 Pod”,范围会大很多。审核 YAML 缩进和逻辑非常重要。

允许 DNS 出站

egress:
  - to:
      - namespaceSelector:
          matchLabels:
            kubernetes.io/metadata.name: kube-system
        podSelector:
          matchLabels:
            k8s-app: kube-dns
    ports:
      - protocol: UDP
        port: 53
      - protocol: TCP
        port: 53

实际 CoreDNS Label 和 DNS 实现需按集群确认。还要为数据库、外部 API、NTP、代理等明确出站规则。

验证

kubectl get networkpolicy -A
kubectl describe networkpolicy -n order
kubectl get pods -n order --show-labels

使用源 Pod 到目标服务的真实协议和端口测试,并同时验证应允许与应拒绝的路径。NetworkPolicy 通常不是传统防火墙的有序规则表,也不自动提供域名级控制、七层 HTTP 路径控制或节点防火墙能力。

常见问题

现象 优先检查
策略完全不生效 CNI 是否支持并启用 NetworkPolicy
应用突然不能解析 DNS Egress 默认拒绝后是否允许 CoreDNS UDP/TCP 53
Ingress Controller 访问后端失败 Controller Namespace/Pod Label 是否被允许
同一规则范围过大 from 列表项、Namespace/Pod Selector 组合逻辑
Pod 重建后策略失效 策略应按稳定 Label 选择,不能依赖 Pod IP

官方参考:Network Policies