最近在部署k8s上边部署Pod的时候,让运维小哥哥绑定好域名以后,访问了一下,返回了一个502 bad gateway错误,现在把问题排查过程分享出来,方便后边学习借鉴。
在排查之前,首先你需要确定一下几点:
- 你已经构建了一个 Docker 镜像;
- K8s集群创建成功;
- 配置了正确的Deployment.yaml
- 配置了正确的Service.yaml
- 配置了正确的ingress.yaml
以上几点都做到了,说明你的环境已经正常运行。
当你所有准备工作已经做好以后,通过域名访问返回了一个你不想看到的错误,如下所示:
排查流程如下:
一、确定你的Pod正常运行了吗?
有可能你的Pod没有正常运行,或者运行的时候卡在某个步骤,通过以下命令查看一下pod运行状态:
$ kubectl get pods
二、确定 pod 容器是否健康?
$ kubectl describe pod my-pod-6c966b5bc7–6bcjf
确保端口已打开并正在侦听预期的地址,如下:
三、您的service是否有效?
接下来,我们应该验证服务是否处于活动状态,这与之前的检查一样简单。对于每个容器,您可能有一个单独的服务。
$ kubectl get svc
四、您的服务是否健康且映射正确?
使用每个服务名称,您可以再次使用 kubectl describe 检索有关服务当前状态的更多详细信息。您通常只需要在与问题 pod 和入口 URL 关联的服务上执行此操作。
$ kubectl describe svc my-first-svc
您应该检查此输出并确认TargetPort和Endpoints与问题 pod 上的预期列表端口匹配,此示例端口下方显示为 40004:
五、确定ingress健康吗?
在深入了解细节之前,我们需要像往常一样收集一些基本信息。执行一下命令:
$ kubectl get ing
六、您的入口配置是否正确?
一旦确定了入口资源的整体健康状况,您就可以使用与之前相同的描述语法查看相关入口的详细视图:
$ kubectl describe ing my-app-ingress
这通常会产生一些输出,例如:
上面要检查的有趣部分是Rules部分和backend部分。
首先,让我们看一下规则并确认我们的服务和入口 URL 同步。
在下面,我们正在检查的入口是 dev.sample.com 域,它应该映射我们之前在相关服务中看到的具有匹配 IP 地址和端口的相同端点。
在这里你看到它确实匹配 (dev.sample.com => my-first-svc:80 (10.99.88.77:40004)):
接下来,我们可以查看backend部分……发现了一个线索:
与我们的服务关联的后端被标记为unhealthy。
在这种情况下,如果后端不健康,Kubernetes Ingress 将不会转发流量,并会导致 502 错误。这通常只是因为 pod 没有通过其健康检查或发回正确的 200 响应。
如果你已经做到了这一步,你现在需要调试一些东西:
- 您是否已配置容器的
readiness and liveness checks? - 您的应用程序是否记录错误或警告消息?
- 您的应用程序日志是空的吗?解决这个问题!
- 您的应用程序功能正常吗?尝试 $ kubectl exec -it {the-pod_id} sh 并在文件系统中四处寻找,以确认一切都按预期进行。
- 你还卡着吗?有时您可能只需要删除连接到失败的容器的服务,然后使用 kubectl apply 创建一个新服务——您会惊讶于这种情况发生了多少次.