You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kubernetes Egress规则配置异常:允许test-1访问test-2的策略反而阻断了Pod间流量

问题根源与解决方案

这个问题的核心是你的NetworkPolicy没有允许DNS解析所需的出站流量,导致curl test-2时连域名都无法解析,最终请求被阻断。

为什么会这样?

当你在test-1 Pod里执行curl test-2时,实际发生了两步操作:

  1. Pod会先向Kubernetes集群的DNS服务(比如CoreDNS/KubeDNS)发起DNS查询,解析test-2这个Service的域名对应的ClusterIP,这个请求使用的是UDP/TCP 53端口。
  2. 拿到ClusterIP后,才会向test-2的Service(或后端Pod)发起80端口的请求。

但你的原NetworkPolicy只配置了允许test-1访问test-2 Pod的80端口流量,完全没有允许DNS相关的出站流量。这就导致第一步的DNS查询被直接阻断,自然无法完成后续的访问。

验证这个问题

你可以做个小测试来确认:

  1. 先获取test-2 Pod的IP:
    kubectl get pod -l app.kubernetes.io/name=test-2 -o jsonpath="{.items[0].status.podIP}"
    
  2. 在test-1 Pod里直接curl这个IP:
    curl <test-2-pod-ip>
    
    这时候请求应该能正常返回,因为不需要DNS解析,直接访问Pod IP的流量符合你的Egress规则。

修复方案

你需要在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 13:38:10