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 即进入隔离状态,仅允许规则中声明的流量通过。
工作流程如下:
- 策略定义:用户通过 YAML 定义 NetworkPolicy,指定
podSelector、policyTypes(Ingress / Egress)、ingress规则、egress规则。 - API Server 存储:策略对象被写入 etcd,并通过 API Server 下发。
- 控制器处理:网络插件(CNI)的控制器监听 NetworkPolicy 变化,将其转换为底层数据平面的规则。
- 数据平面执行:规则被写入 iptables、IPVS 或 eBPF 程序,在节点内核中执行包过滤。
运维提示:NetworkPolicy 本身不处理加密或身份认证,仅做 L3/L4 流量控制。若需 L7 策略(如 HTTP 路径),需配合服务网格(如 Istio)或支持 L7 的 CNI(如 Cilium)。
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 模式是性价比之选。
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 语法检查。