EKS集群中Kong网关重启后仅能转发流量至单个节点Pod的问题排查求助
这位朋友你好,遇到这个问题确实挺闹心的,我帮你梳理几个可能的原因和排查方向,你可以逐一尝试:
检查Kong Pod的调度与网络配置
先确认Kong重启后的运行节点:kubectl get pods -o wide,看看是不是只在某一个节点上运行。如果Kong Pod固定在单个节点,再检查它的Deployment配置里有没有nodeSelector、affinity这类强制绑定单一节点的规则;另外如果Kong用了hostNetwork: true,那它的网络会和宿主机节点绑定,可能受节点本地的网络规则限制,导致只能访问同节点的Pod。验证后端服务的Endpoints状态
后端K8s服务的Endpoints是Kong发现Pod的关键,你可以逐个检查四个服务的Endpoints:kubectl get endpoints <你的服务名称>,确认每个服务都包含了两个节点上的Pod IP。如果Endpoints正常,再看看Kong的服务发现配置,是不是依赖的DNS解析有问题?比如DNS只返回了单个节点的Pod地址,可以在Kong Pod里测试DNS解析:kubectl exec -it <kong-pod-name> -- nslookup <服务名称>。排查网络策略的访问限制
有没有配置过NetworkPolicy?比如某个策略只允许来自特定节点的流量访问后端Pod,或者只允许Kong Pod所在节点的流量?你可以查看所有网络策略:kubectl get networkpolicy,然后针对每个策略检查ingress规则里的来源限制,看看是不是把Kong的访问范围限定到了单个节点。测试节点间Pod的连通性
有可能是EKS的CNI插件(比如Calico、AWS VPC CNI)出现了节点间网络不通的问题。你可以在Kong Pod里ping另一个节点上的Pod IP:kubectl exec -it <kong-pod-name> -- ping <其他节点的Pod IP>,如果ping不通,那大概率是CNI的节点间路由或者隧道出了问题,需要检查CNI组件的日志和配置状态。检查Kong的Upstream配置
如果你是手动配置Kong的Upstream而不是自动关联K8s服务,那重启后会不会Upstream里只包含了单个节点的Pod?你可以通过Kong的Admin API查询Upstream信息:kubectl exec -it <kong-pod-name> -- curl http://localhost:8001/upstreams,确认每个Upstream都包含了所有后端Pod的地址。
你可以先从这几个方向入手排查,有新的排查结果或者细节可以补充,我再帮你进一步分析~
备注:内容来源于stack exchange,提问作者user1807948

