记一次 Devtron 部署 502 排障:从 nginx 到 ALB 安全组

server-troubleshooting-cover

最近公司在腾讯云 Devtron 上部署了一套 admin 后台,配置好 nginx 后通过内网路由器 WiFi 网关做生产环境内测。结果电脑连上 WiFi 访问页面,浏览器直接甩了一个 502 Gateway,ALB 反馈的。下面记录一下我排查这个问题的完整过程。

一、现象

页面访问路径是:电脑 → 内网 WiFi → 路由器网关 → 腾讯云 ALB → K8s Service → Pod(nginx 静态文件服务)。浏览器显示 502,并且明确标注是 ALB 返回的。

二、第一反应:看 nginx 配置

先检查了 Pod 里的 nginx.conf,配置如下:

server {
    listen       80;
    server_name  localhost;
    root         /usr/share/nginx/html;

    location = /healthz {
        default_type text/plain;
        return 200 "ok
";
    }

    location /front/DAdmin {
        index index.html;
        try_files $uri /index.html;
    }

    location ^~/front/static/ {
        rewrite ^/front(/static/.*)$ $1 last;
    }

    location ~*.(gif|jpg|jpeg|png|css|js|ico|svg)$ {
        root /usr/share/nginx/html/;
    }
}

仔细一看,这个 nginx 只是个纯静态文件服务器,没有配置任何 proxy_pass 反向代理。也就是说它自己不产生 502——它只负责返回静态文件或者 404,不会返回 502。

三、502 从哪里来?

既然 nginx 本身不会产生 502,那 502 一定是更上游的组件返回的。结合架构梳理了一下可能的原因:

  • ALB 健康检查失败:腾讯云 ALB 对后端 Pod 做健康检查,如果连续失败就把节点标记为不健康,所有请求直接返回 502。
  • Pod 未就绪:Pod 可能 CrashLoopBackOff、ImagePullBackOff,或者就绪探针没通过。
  • Service 与 Pod 失联:Service 的 selector 没匹配到任何 Pod,Endpoint 为空。
  • 内网路由问题:WiFi 网关的 DNS 解析可能没有正确指向集群内部,或者网络策略阻挡了流量。

四、想看日志却看不到

我以为 kubectl logs 能看到 nginx 日志,结果打开 Pod 日志一片空白。回头看配置才反应过来:

access_log  /var/log/nginx/access.log  main;
error_log   /var/log/nginx/error.log;

nginx 的日志写到了容器内的文件(/var/log/nginx/access.log 和 error.log),而不是标准输出。kubectl logs 只能看 stdout/stderr,当然什么都看不见。

查日志有三条路:

  1. 进 Pod 直接看kubectl exec -it <pod-name> -- cat /var/log/nginx/access.log,最快最直接。
  2. 改配置输出到 stdout:把 access_log 改成 /dev/stdout,error_log 改成 /dev/stderr,之后 kubectl logs 就能直接看到了——这是长期方案。
  3. 腾讯云 CLS 日志服务:如果 Devtron 集成了日志采集,可以在腾讯云控制台 → 日志服务 → 检索分析中查询。

五、最终定位与解决

按照优先级一步步排查下来:

  1. kubectl get pods -n <namespace> → 确认 Pod 状态是 Running 且 Ready 1/1。
  2. kubectl get svc,ep -n <namespace> → 确认 Service 的 Endpoint 中有 Pod IP。
  3. 在集群内任意 Pod 里 curl http://<service-name>/healthz → 能通,返回 200。
  4. 进 nginx Pod kubectl exec 查看 access.log → 发现根本没有来自 ALB 健康检查的请求记录。

走到这一步,问题范围缩小到了ALB 到 Pod 之间的网络链路。最终发现是 ALB 的安全组规则没有放行内网 WiFi 网关的 IP 段,导致健康检查流量被拦截,ALB 认为后端全部不健康,对所有请求直接返回 502。

六、总结

  • 看到 502 不要只盯着 nginx,得看整条链路上哪个环节可能拦截了流量。
  • nginx 日志写文件而非 stdout 是一个常见的坑,第一时间改成 /dev/stdout 能省很多事。
  • 腾讯云 ALB 的安全组规则容易被忽略——加了新来源 IP 或网段后记得同步更新安全组。
  • 排查顺序:Pod 状态 → Service/Endpoint → 集群内连通性 → ALB 健康检查 → 安全组/网络策略。

整个过程下来最大的感受是:502 这个报错非常”概括”,链路长的时候不能靠直觉猜,只能一层层排除,找到真正断掉的那个环节。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注