← 中文资源

简体中文版本

Kubernetes NetworkPolicy 阻断 Pod 流量 — 连接超时

通过审查 NetworkPolicy、放行预期出入站,并用 DNS 与端口测试验证,修复 Pod 间连接超时。

阅读英文原文

症状

本篇指南处理“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 与目标端口成功;验证预期与应被阻止的对端行为符合预期。

修复后补充一条回归测试,复现原始症状,防止问题再次出现。

这类故障通常是环境问题而非纯逻辑错误,因此在缺陷记录中应写明完整命令、环境变量与工作目录。请用最小的脚本复现,待最小用例清楚后再扩大范围。为这类故障准备一份简短的排查清单,能显著减少下次排障时间。