症状
本篇指南处理“Kubernetes NetworkPolicy 阻断 Pod 流量 — 连接超时”。请从症状出发,按顺序执行诊断,在推进前确认每个假设;随后通过修复与验证步骤闭环。
可观察到的症状包括:
- 一个 Pod 无法访问另一个,尽管两者均 Running 且 Ready
- 连接超时而非被拒绝
- 应用 NetworkPolicy 前流量正常
诊断
先在隔离环境中复现故障,再按顺序执行以下检查,逐步缩小范围。
步骤 1
kubectl get networkpolicy -n <ns> -o yaml
选择器与允许规则会显示哪些流量被放行、哪些被阻断。
步骤 2
kubectl exec <pod> -- sh -c "nslookup db && nc -zv db 5432"
DNS 失败提示出站到 DNS 被阻断;端口超时提示目标策略阻断。
常见诱因(按出现频率排序):
- NetworkPolicy 选中该 Pod 且仅允许特定出入站
- 出站默认拒绝,Pod 无法访问 DNS 或目标
- 策略按已变更的标签选择 Pod
根因
一旦 Pod 被 NetworkPolicy 选中,未被显式放行的流量即被拒绝。在出入站默认拒绝下,数据包被丢弃而非拒绝,因此连接超时,与端口关闭的报错不同。
修复
添加放行该工作负载所需特定出入站的策略,显式允许出站到 kube-dns 的 DNS,并让选择器与稳定 Pod 标签一致。
注意:宽泛的 allow-all 策略会破坏隔离目的;应仅授予所需端口与对端。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-app-to-db
spec:
podSelector:
matchLabels: { app: db } # target
policyTypes: ["Ingress"]
ingress:
- from:
- podSelector:
matchLabels: { app: web } # allowed source
ports:
- protocol: TCP
port: 5432
---
# do not forget DNS egress when using default-deny egress
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-dns
spec:
podSelector: {}
policyTypes: ["Egress"]
egress:
- to:
- namespaceSelector: {}
ports:
- protocol: UDP
port: 53
- protocol: TCP
port: 53
验证
从 Pod 重新测试连通性并确认 DNS 与目标端口成功;验证预期与应被阻止的对端行为符合预期。
修复后补充一条回归测试,复现原始症状,防止问题再次出现。
这类故障通常是环境问题而非纯逻辑错误,因此在缺陷记录中应写明完整命令、环境变量与工作目录。请用最小的脚本复现,待最小用例清楚后再扩大范围。为这类故障准备一份简短的排查清单,能显著减少下次排障时间。