Kubernetes Egress规则配置异常:允许test-1访问test-2的策略反而阻断了Pod间流量
问题根源与解决方案
这个问题的核心是你的NetworkPolicy没有允许DNS解析所需的出站流量,导致curl test-2时连域名都无法解析,最终请求被阻断。
为什么会这样?
当你在test-1 Pod里执行curl test-2时,实际发生了两步操作:
- Pod会先向Kubernetes集群的DNS服务(比如CoreDNS/KubeDNS)发起DNS查询,解析
test-2这个Service的域名对应的ClusterIP,这个请求使用的是UDP/TCP 53端口。 - 拿到ClusterIP后,才会向test-2的Service(或后端Pod)发起80端口的请求。
但你的原NetworkPolicy只配置了允许test-1访问test-2 Pod的80端口流量,完全没有允许DNS相关的出站流量。这就导致第一步的DNS查询被直接阻断,自然无法完成后续的访问。
验证这个问题
你可以做个小测试来确认:
- 先获取test-2 Pod的IP:
kubectl get pod -l app.kubernetes.io/name=test-2 -o jsonpath="{.items[0].status.podIP}" - 在test-1 Pod里直接curl这个IP:
这时候请求应该能正常返回,因为不需要DNS解析,直接访问Pod IP的流量符合你的Egress规则。curl <test-2-pod-ip>
修复方案
你需要在NetworkPolicy的egress部分添加允许DNS流量的规则,有两种常见方式:
方式1:允许所有DNS流量(简单通用)
直接添加允许UDP/TCP 53端口的出站规则,适用于大多数场景:
kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: test-1-policy spec: podSelector: matchLabels: app.kubernetes.io/name: test-1 policyTypes: - Ingress - Egress ingress: [] egress: # 原规则:允许访问test-2 Pod的80端口 - to: - podSelector: matchLabels: app.kubernetes.io/name: test-2 ports: - port: 80 protocol: TCP # 新增:允许DNS查询流量 - ports: - port: 53 protocol: UDP - port: 53 protocol: TCP
方式2:仅允许到集群DNS服务的流量(更安全)
如果你想更严格地控制流量,可以指定只允许到kube-system命名空间下的DNS Pod的流量(比如CoreDNS的标签通常是k8s-app=kube-dns):
kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: test-1-policy spec: podSelector: matchLabels: app.kubernetes.io/name: test-1 policyTypes: - Ingress - Egress ingress: [] egress: # 原规则:允许访问test-2 Pod的80端口 - to: - podSelector: matchLabels: app.kubernetes.io/name: test-2 ports: - port: 80 protocol: TCP # 新增:仅允许到集群DNS服务的流量 - to: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: kube-system podSelector: matchLabels: k8s-app: kube-dns ports: - port: 53 protocol: UDP - port: 53 protocol: TCP
生效验证
修改完NetworkPolicy后,重新应用:
kubectl apply -f deployment.yaml
然后进入test-1 Pod再次执行curl test-2,这次应该能正常访问了。
内容的提问来源于stack exchange,提问作者Matthias M
相关产品推荐
相关产品推荐

