DigitalOcean负载均衡器转发流量至Kubernetes Service失败求助
解决DigitalOcean负载均衡器转发到Kubernetes NodePort服务出现503的问题
遇到这种503错误,大概率是负载均衡器无法正常探测到后端服务的可用性,或者网络通路存在阻塞。我之前处理过类似的场景,给你一步步排查的方法:
先查健康检查配置(最常见的原因)
DigitalOcean负载均衡器会定期对目标节点做健康检查,如果检查失败,就会把节点标记为「不健康」,直接返回503。你需要:- 登录DO控制台,找到你的负载均衡器,进入「健康检查」标签页
- 确认检查端口是
31433(你的NodePort端口),协议选HTTP - 检查路径:如果你的服务根路径
/能正常返回200状态码,就用/;如果服务有专门的健康检查接口(比如/healthz),要改成对应路径 - 确认响应码范围包含200-399
要是健康检查失败,先在目标Droplet上执行curl localhost:31433,确认服务本身在节点上能正常访问。
确认负载均衡器的目标Droplet列表
别漏了这一步:检查负载均衡器的「目标」设置,确保所有运行Kubernetes节点(也就是承载NodePort服务的节点)都被添加到了目标池中。如果你的K8s集群是DO托管的,虽然推荐用LoadBalancer类型服务自动关联,但你手动配置的话,一定要把所有相关节点加进去。检查Droplet的防火墙规则
DigitalOcean的Cloud Firewall或者Droplet自身的iptables/ufw规则,必须允许负载均衡器的IP段访问31433端口。DO负载均衡器的来源IP段是10.116.0.0/16和10.117.0.0/16,你需要:- 如果用Cloud Firewall,添加一条规则:允许这两个IP段访问TCP 31433
- 如果用ufw,执行命令:
ufw allow from 10.116.0.0/16 to any port 31433 ufw allow from 10.117.0.0/16 to any port 31433
验证Kubernetes服务和Pod的状态
登录到你的K8s控制节点,执行以下命令排查:kubectl get svc:确认你的NodePort服务的PORT(S)列显示正确(比如80:31433/TCP),状态正常kubectl get pods:检查后端Pod的状态是Running,且READY列是1/1(对应你的容器数),确保Pod没有崩溃或者未就绪kubectl describe svc <你的服务名>:查看externalTrafficPolicy字段,如果是Local,意味着只有运行Pod的节点能处理请求,这时候要么把LB的目标池改成只包含这些节点,要么把这个字段改成Cluster(默认值)
查看负载均衡器的访问日志
如果上面的步骤都没解决问题,开启DO负载均衡器的访问日志(需要绑定一个DO Spaces存储),日志里会有具体的错误细节,比如是连接超时、拒绝连接还是健康检查失败,能帮你精准定位问题。
内容的提问来源于stack exchange,提问作者Rotareti
相关产品推荐
相关产品推荐

