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 流日志确认实际判定结果。