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

上次更新日期:2021 年 12 月 2 日

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

简短描述

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

要解决 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:

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

检查 Classic Load Balancer 的容量

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

验证您的实例是否已注册

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

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