NetworkPolicy 调试:用最小测试矩阵定位拒绝规则

从 CNI 能力、标签选择器和入出站方向验证网络策略,减少“规则看起来正确但仍不通”的问题。

文章目录 · 4 节

NetworkPolicy 是允许列表的组合:只要某方向有策略选中 Pod,该方向就进入隔离状态。策略对象存在不代表 CNI 一定支持或正确执行它。

明确通信五元组

记录源 Pod、目标 Pod、命名空间、端口和协议,然后核对标签:

kubectl get pod -A --show-labels
kubectl get networkpolicy -n production -o yaml
kubectl describe networkpolicy api-ingress -n production

podSelector 默认只在策略所在命名空间匹配。跨命名空间规则通常需要同时使用 namespaceSelector,并确认命名空间确实具有预期标签。

建立测试矩阵

kubectl run netcheck -n client --rm -it --image=curlimages/curl -- sh
curl -sv --connect-timeout 3 http://api.production.svc:8080/health
kubectl exec -n production deploy/api -- ss -lnt

分别测试 DNS、目标 Pod IP 和 Service IP,区分解析、策略和服务转发问题。策略修改后等待 CNI 下发完成,再复测双向流量。

常见遗漏

  • 只允许 ingress,忘记客户端 egress 或 DNS
  • 端口写成 Service port,而策略匹配的是 Pod 端口
  • 使用空的 {} selector 意外放开更大范围
  • 没有验证 CNI 对 endPort 等特性的支持版本

收尾清单

保留允许与拒绝用例作为自动化测试。策略上线前先审计匹配 Pod 数量,并通过 CNI 流日志确认实际判定结果。