3、容器网络策略基础:Kubernetes NetworkPolicy 工作原理、Ingress/Egress 规则、策略执行点(kube-proxy / eBPF)

Kubernetes NetworkPolicy 是容器网络安全的“第一道门”。它通过声明式规则控制 Pod 之间的流量走向,实现微隔离。理解其工作原理、规则模型以及底层执行机制,是进行缓存命中巡检与上线前策略验证的前提。

3.1 NetworkPolicy 工作原理

NetworkPolicy 是一个 Kubernetes API 资源,作用于命名空间级别,通过标签选择器(Label Selector)匹配目标 Pod,并定义允许哪些流量进出这些 Pod。其核心原则是:白名单机制——一旦命名空间中存在任何 NetworkPolicy,未显式允许的流量将被拒绝。

关键原则:默认情况下,Pod 是非隔离的(接受所有流量)。一旦 NetworkPolicy 选中某个 Pod,该 Pod 即进入隔离状态,仅允许规则中声明的流量通过。

工作流程如下:

  1. 策略定义:用户通过 YAML 定义 NetworkPolicy,指定 podSelector、policyTypes(Ingress / Egress)、ingress 规则、egress 规则。
  2. API Server 存储:策略对象被写入 etcd,并通过 API Server 下发。
  3. 控制器处理:网络插件(CNI)的控制器监听 NetworkPolicy 变化,将其转换为底层数据平面的规则。
  4. 数据平面执行:规则被写入 iptables、IPVS 或 eBPF 程序,在节点内核中执行包过滤。
运维提示:NetworkPolicy 本身不处理加密或身份认证,仅做 L3/L4 流量控制。若需 L7 策略(如 HTTP 路径),需配合服务网格(如 Istio)或支持 L7 的 CNI(如 Cilium)。
NetworkPolicy 工作流程 用户 YAML 定义 API Server / etcd CNI 控制器 数据平面执行 执行细节说明 1. 用户定义 → 2. API Server 存储并下发 → 3. CNI 控制器监听并转换规则 4. 数据平面(iptables / eBPF)在内核中执行包过滤 5. 仅允许匹配规则的流量通过,其余流量被丢弃 6. 策略变更实时生效,无需重启 Pod

3.2 Ingress / Egress 规则详解

NetworkPolicy 的规则分为 Ingress(入站)和 Egress(出站)两类,分别控制进入 Pod 和从 Pod 发出的流量。每条规则可以指定来源(from)或目的地(to),支持三种匹配方式:

匹配方式 Ingress 规则(from) Egress 规则(to) 典型场景
Pod 选择器 允许来自特定标签 Pod 的流量 允许发往特定标签 Pod 的流量 微服务间白名单
命名空间选择器 允许来自特定命名空间所有 Pod 的流量 允许发往特定命名空间所有 Pod 的流量 跨命名空间隔离
IP 段(CIDR) 允许来自特定 IP 段的流量 允许发往特定 IP 段的流量 外部服务 / 集群外访问
常见误区:Egress 规则中的 to 如果只指定了 Pod 选择器,则仅允许发往集群内部 Pod。若需要访问集群外服务(如外部数据库),必须同时指定 ipBlock 或使用 except 排除。

规则示例(YAML):

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: api-allow
  namespace: production
spec:
  podSelector:
    matchLabels:
      app: api-server
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: frontend
    ports:
    - protocol: TCP
      port: 8080
  egress:
  - to:
    - podSelector:
        matchLabels:
          app: database
    ports:
    - protocol: TCP
      port: 5432
  - to:
    - ipBlock:
        cidr: 10.0.0.0/8
        except:
        - 10.96.0.0/12  # 排除 Service CIDR
    ports:
    - protocol: TCP
      port: 443

3.3 策略执行点:kube-proxy 与 eBPF

NetworkPolicy 的底层执行依赖网络插件(CNI)的数据平面。当前主流执行点包括 kube-proxy(iptables/IPVS 模式)和 eBPF(如 Cilium)。两者在性能、灵活性和可观测性上存在显著差异。

对比维度 kube-proxy (iptables) kube-proxy (IPVS) eBPF (Cilium)
规则存储 iptables 链(线性遍历) IPVS 哈希表 eBPF Map(哈希 / 数组)
性能 规则多时延迟高 中等,优于 iptables 高,O(1) 查找
可观测性 低(仅计数) 低 高(完整元数据 + 直方图)
L7 支持 不支持 不支持 支持(HTTP/gRPC)
策略更新 全量刷新(慢) 增量更新(较快) 原子更新(快)
内核要求 无特殊要求 需加载 IPVS 模块 需 4.19+ 内核
选型建议:对于大规模集群(>500 节点)或需要 L7 策略、可观测性的场景,优先选择 eBPF 方案(Cilium)。对于中小规模集群,kube-proxy IPVS 模式是性价比之选。
策略执行点对比:kube-proxy vs eBPF kube-proxy (iptables/IPVS) 用户态 kube-proxy Netfilter 钩子 iptables 规则链(线性遍历) IPVS 哈希表(可选) 特点:成熟稳定,规则多时性能下降 eBPF (Cilium) eBPF 程序 内核态执行 eBPF Map(O(1) 查找) L7 策略 + 可观测性 特点:高性能,支持 L7,需新内核

3.4 策略执行的关键路径

无论使用哪种执行点,NetworkPolicy 的生效都遵循以下关键路径:

  • Pod 创建/更新:CNI 控制器根据 Pod 标签匹配策略,生成规则。
  • 规则注入:规则被写入内核数据平面(iptables 链 / eBPF Map)。
  • 包过滤:每个数据包经过内核时,根据规则决定放行或丢弃。
  • 连接跟踪:对于已允许的连接,后续包通常直接放行(状态防火墙)。
  • 策略变更:修改 NetworkPolicy 后,CNI 控制器增量更新规则,无需重启 Pod。
巡检关注点:在缓存命中巡检中,需关注策略规则数量是否接近执行点上限(如 iptables 规则数 > 1000 时性能下降明显)。eBPF 方案则需关注 Map 大小和内核事件丢失率。

3.5 常见问题与避坑

问题 原因 解决方案
策略未生效 CNI 插件未安装或版本不兼容 检查 CNI 是否支持 NetworkPolicy(如 Calico、Cilium、Weave)
Egress 规则导致 DNS 故障 未放行 kube-dns 流量 在 Egress 规则中添加 namespaceSelector 匹配 kube-system
性能下降 iptables 规则过多 迁移至 IPVS 或 eBPF;合并规则减少条目
策略冲突 多个 NetworkPolicy 选中同一 Pod 规则取并集(OR),但需注意默认拒绝策略的优先级
重要提醒:上线前验证时,务必使用 kubectl run 临时 Pod 进行连通性测试,确认 Ingress 和 Egress 规则均按预期生效。不要仅依赖 YAML 语法检查。