如何在Kubernetes上调试502错误?

1,237 阅读3分钟

最近在部署k8s上边部署Pod的时候,让运维小哥哥绑定好域名以后,访问了一下,返回了一个502 bad gateway错误,现在把问题排查过程分享出来,方便后边学习借鉴。

在排查之前,首先你需要确定一下几点:

  1. 你已经构建了一个 Docker 镜像;
  2. K8s集群创建成功;
  3. 配置了正确的Deployment.yaml
  4. 配置了正确的Service.yaml
  5. 配置了正确的ingress.yaml

以上几点都做到了,说明你的环境已经正常运行。

当你所有准备工作已经做好以后,通过域名访问返回了一个你不想看到的错误,如下所示:

image.png

排查流程如下:

一、确定你的Pod正常运行了吗?

有可能你的Pod没有正常运行,或者运行的时候卡在某个步骤,通过以下命令查看一下pod运行状态:

$ kubectl get pods

image.png

二、确定 pod 容器是否健康?

$ kubectl describe pod my-pod-6c966b5bc7–6bcjf

确保端口已打开并正在侦听预期的地址,如下:

image.png

三、您的service是否有效?

接下来,我们应该验证服务是否处于活动状态,这与之前的检查一样简单。对于每个容器,您可能有一个单独的服务。 $ kubectl get svc

image.png

四、您的服务是否健康且映射正确?

使用每个服务名称,您可以再次使用 kubectl describe 检索有关服务当前状态的更多详细信息。您通常只需要在与问题 pod 和入口 URL 关联的服务上执行此操作。 $ kubectl describe svc my-first-svc

您应该检查此输出并确认TargetPortEndpoints与问题 pod 上的预期列表端口匹配,此示例端口下方显示为 40004:

image.png

五、确定ingress健康吗?

在深入了解细节之前,我们需要像往常一样收集一些基本信息。执行一下命令:

$ kubectl get ing

image.png

六、您的入口配置是否正确?

一旦确定了入口资源的整体健康状况,您就可以使用与之前相同的描述语法查看相关入口的详细视图:

$ kubectl describe ing my-app-ingress

这通常会产生一些输出,例如:

image.png

上面要检查的有趣部分是Rules部分和backend部分。

首先,让我们看一下规则并确认我们的服务和入口 URL 同步。

在下面,我们正在检查的入口是 dev.sample.com 域,它应该映射我们之前在相关服务中看到的具有匹配 IP 地址和端口的相同端点。

在这里你看到它确实匹配 (dev.sample.com => my-first-svc:80 (10.99.88.77:40004)):

image.png

接下来,我们可以查看backend部分……发现了一个线索:

image.png

与我们的服务关联的后端被标记为unhealthy

在这种情况下,如果后端不健康,Kubernetes Ingress 将不会转发流量,并会导致 502 错误。这通常只是因为 pod 没有通过其健康检查或发回正确的 200 响应。

如果你已经做到了这一步,你现在需要调试一些东西:

  • 您是否已配置容器的readiness and liveness checks
  • 您的应用程序是否记录错误或警告消息?
  • 您的应用程序日志是空的吗?解决这个问题!
  • 您的应用程序功能正常吗?尝试 $ kubectl exec -it {the-pod_id} sh 并在文件系统中四处寻找,以确认一切都按预期进行。
  • 你还卡着吗?有时您可能只需要删除连接到失败的容器的服务,然后使用 kubectl apply 创建一个新服务——您会惊讶于这种情况发生了多少次.