Docker KubernetesNotes

第 24 章:网络策略

zjc 于 2026-01-24 发布

这是《Docker 与 Kubernetes 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 Kubernetes NetworkPolicy 控制 Pod 之间以及 Pod 与外部的通信,是东西向流量零信任治理的基础。

24.1 默认行为

没有 NetworkPolicy 时,Pod 通常可以互相访问。可以先加默认拒绝:

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

24.2 放行入口

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

24.3 出口策略

policyTypes:
  - Egress
egress:
  - to:
      - namespaceSelector: {}
    ports:
      - protocol: UDP
        port: 53

出口策略会影响 DNS、镜像拉取、外部 API 和数据库连接,上线必须逐步验证。

24.4 依赖 CNI

NetworkPolicy 由 CNI 插件实现。Flannel 基础模式等实现不支持或不能完整支持 NetworkPolicy,Calico、Cilium 等更常用。

24.5 排查

kubectl get networkpolicy -A
kubectl describe networkpolicy allow-web-to-order -n shop
kubectl exec -it debug -- nc -vz order-service 8080
问题 排查
全部不通 默认拒绝
DNS 不通 egress 未放行 UDP/TCP 53
外部 API 不通 出口策略
跨命名空间不通 namespaceSelector
策略不生效 CNI 支持

本章小结

NetworkPolicy 用于缩小攻击面。生产可以从关键命名空间默认拒绝开始,逐步放行白名单,并验证 CNI 支持、DNS、出口和审计。

思考题

  1. 没有 NetworkPolicy 时 Pod 能否互访?
  2. Ingress 和 Egress 策略分别管什么?
  3. 为什么 DNS 常被误伤?
  4. NetworkPolicy 是否由 kube-proxy 实现?
  5. 如何渐进式落地默认拒绝?