在 Amazon EKS 集群中访问 Kubernetes Service 时如何解决 HTTP 503(服务不可用)错误?

2 分钟阅读
0

当我连接到在 Amazon Elastic Kubernetes Service (Amazon EKS) 集群中运行的 Kubernetes Service 时,会出现 HTTP 503(服务不可用)错误。

简短描述

HTTP 503 错误是服务器端错误。当您连接到位于为负载均衡器配置的 Amazon EKS 集群中的 Kubernetes Service 容器组 (pod) 时,会出现这些错误。

要解决 HTTP 504 错误,请参阅如何解决 Amazon EKS 中的 HTTP 504 错误?

要对 HTTP 503 错误进行问题排查,请完成以下问题排查步骤。

解决方法

检查一组容器(pod)标注是否与 Kubernetes Service 选择器中指定的值匹配

1.    运行以下命令以获取选择器的值:

$ kubectl describe service service_name -n your_namespace

**注意:**将 service_name 替换为服务名称,将 your_namespace 替换为服务命名空间。

示例输出:

Name:                     service-name
Namespace:                pod-name
Labels:                   none
Annotations:              none
Selector:                 app.kubernetes.io/name=namespace
Type:                     NodePort
IP Families:              none
IP:                       10.100.17.189
IPs:                      10.100.17.189
Port:                     unset  80/TCP
TargetPort:               80/TCP
NodePort:                 unset  31560/TCP
Endpoints:                none
Session Affinity:         none
External Traffic Policy:  Cluster
Events:                   none

在前面的输出中,示例选择器值为 app.kubernetes.io/name=namespace

2.    检查是否有标注为 app.kubernetes.io/name=namespace 的一组容器(pod):

$ kubectl get pods -n your_namespace -l "app.kubernetes.io/name=namespace"

示例输出:

No resources found in your_namespace namespace.

如果没有找到与您搜索的值相符的资源,则会出现 HTTP 503 错误。

验证为 Kubernetes Service 定义的一组容器(pod)是否正在运行

使用 Kubernetes Service 选择器中的标注验证一组容器(pod)是否存在并处于正在运行状态:

$ kubectl -n your_namespace get pods -l "app.kubernetes.io/name=your_namespace"

输出:

NAME                               READY   STATUS             RESTARTS   AGE
POD_NAME                           0/1     ImagePullBackOff   0          3m54s

检查一组容器(pod)能否通过 Kubernetes 部署就绪探测器

1.    验证应用程序一组容器(pod)能否通过就绪探测器。有关更多信息,请参阅配置活动、就绪和启动探测器(来自 Kubernetes 网站)。

2.    检查一组容器(pod)的就绪探测器:

$ kubectl describe pod pod_name -n your_namespace | grep -i readiness

**注意:**将 pod_name 替换为您的一组容器(pod)名称,将 your_namespace 替换为您的命名空间。

示例输出:

Readiness:      tcp-socket :8080 delay=5s timeout=1s period=2s #success=1 #failure=3
Warning  Unhealthy  2m13s (x298 over 12m)  kubelet            Readiness probe failed:

在前面的输出中,您可以看到就绪探测失败

**注意:**仅当应用程序在正确的路径和端口上侦听时,此步骤才会提供有用的输出。使用 curl -Ivk 命令检查 curl 输出,并确保在服务级别定义的路径获得有效响应。例如,200 毫秒是一个良好响应。

检查 Classic Load Balancer 的容量

如果出现间歇性 HTTP 503 错误,则说明您的 Classic Load Balancer 没有足够的容量来处理请求。要解决此问题,请确保 Classic Load Balancer 具有足够的容量,并且 Worker 节点可以应对请求速率。

验证您的实例是否已注册

如果没有注册实例,也会出现 HTTP 503 错误。要解决此问题,请尝试以下解决方案:

  • 验证 Worker 节点的安全组是否具有入站规则,允许节点端口上的端口访问 Worker 节点。此外,请验证不存在 NAT 规则阻止节点端口范围上的网络流量。
  • 验证是否允许为 Classic Load Balancer 指定的自定义安全组对 Worker 节点进行入站访问。
  • 确保子网指定的每个可用区中都有 Worker 节点。

相关信息

当我连接至在配置为使用 Classic Load Balancing 的 EC2 实例上运行的 Web 服务器时,为什么会收到 HTTP 5xx 错误?

HTTP 503:服务不可用

监控 Classic Load Balancer

监控 Application Load Balancer

排查 Classic Load Balancer 问题:HTTP 错误

AWS 官方
AWS 官方已更新 2 年前