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

DigitalOcean负载均衡器转发流量至Kubernetes Service失败求助

解决DigitalOcean负载均衡器转发到Kubernetes NodePort服务出现503的问题

遇到这种503错误,大概率是负载均衡器无法正常探测到后端服务的可用性,或者网络通路存在阻塞。我之前处理过类似的场景,给你一步步排查的方法:

  • 先查健康检查配置(最常见的原因)
    DigitalOcean负载均衡器会定期对目标节点做健康检查,如果检查失败,就会把节点标记为「不健康」,直接返回503。你需要:

    1. 登录DO控制台,找到你的负载均衡器,进入「健康检查」标签页
    2. 确认检查端口是31433(你的NodePort端口),协议选HTTP
    3. 检查路径:如果你的服务根路径/能正常返回200状态码,就用/;如果服务有专门的健康检查接口(比如/healthz),要改成对应路径
    4. 确认响应码范围包含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控制节点,执行以下命令排查:

    1. kubectl get svc:确认你的NodePort服务的PORT(S)列显示正确(比如80:31433/TCP),状态正常
    2. kubectl get pods:检查后端Pod的状态是Running,且READY列是1/1(对应你的容器数),确保Pod没有崩溃或者未就绪
    3. kubectl describe svc <你的服务名>:查看externalTrafficPolicy字段,如果是Local,意味着只有运行Pod的节点能处理请求,这时候要么把LB的目标池改成只包含这些节点,要么把这个字段改成Cluster(默认值)
  • 查看负载均衡器的访问日志
    如果上面的步骤都没解决问题,开启DO负载均衡器的访问日志(需要绑定一个DO Spaces存储),日志里会有具体的错误细节,比如是连接超时、拒绝连接还是健康检查失败,能帮你精准定位问题。

内容的提问来源于stack exchange,提问作者Rotareti

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:05:15