当我连接到托管在我的 Amazon Elastic Kubernetes Service (Amazon EKS) 集群中的服务时,出现连接超时。
简短描述
最常见的服务连接问题是由于安全组或网络访问控制列表(网络 ACL)限制来自容器组(pod)端点的流量。
要解决此问题,请检查与您的工作节点实例和负载均衡器关联的安全组和网络 ACL。如果您使用网络负载均衡器,请验证您的服务为您的容器组(pod)选择的标签是否正确。
**注意:**以下解决方法适用于无法访问的服务。要了解有关 Kubernetes 服务类型的更多信息,请参阅如何公开在我的 Amazon EKS 集群上运行的 Kubernetes 服务?
解决方法
检查您的安全组和网络 ACL
集群 IP
集群 IP 服务类型用于在同一 Amazon EKS 集群中运行的微服务之间的通信。确保目标容器组(pod)实例的安全组的入站规则允许客户端的容器组(pod)实例进行通信。
在大多数情况下,有一条 self 规则允许通过 Worker 节点安全组中的所有端口进行所有通信。如果您使用多个节点组,每个节点组都有自己的安全组,则允许安全组之间的所有通信。这样,跨多个节点运行的微服务就可以轻松通信。
要了解更多信息,请参阅 Amazon EKS 安全组要求和注意事项。
节点端口
Worker 节点安全组必须允许经 NodePort 服务定义中指定的端口的传入流量。如果未在服务定义中指定,则端口参数的值与 targetPort 参数的值相同。该端口在 Amazon EKS 集群的所有节点上是公开的。
检查链接到 Worker 节点子网的网络 ACL。确保您的客户端 IP 地址在服务使用的端口上的允许列表中。
如果您通过互联网访问 Kubernetes 服务,请确认您的节点具有公有 IP 地址。要访问该服务,必须同时使用节点的公有 IP 地址和端口。
负载均衡器
确保以下内容正确:
- 负载均衡器安全组允许入站侦听器端口。
- 负载均衡器安全组允许经目标流量端口的出站流量。
- Worker 节点安全组允许来自负载均衡器安全组的入站流量通过应用程序容器运行的端口。
- 如果您使用的网络负载均衡器没有使用客户端 IP 保留功能的安全组关联,则 Worker 节点会允许客户端流量。
- 如果 targetPort 与服务上映射的端口不同,则 Worker 节点允许与目标端口匹配的流量。
- 网络 ACL 允许您的客户端 IP 地址经侦听器端口访问负载均衡器。
- 如果您通过互联网访问负载均衡器,则表明您创建的是面向互联网的负载均衡器。
确认您的服务选择的容器组(pod)端点正确
如果您的容器组(pod)未注册为服务的后端,则可能会收到超时错误。通过浏览器访问服务时,就可能会发生这种情况。或者,运行 curl podIP:podPort 命令时,也可能会发生这种情况。
检查容器组(pod)的标签,并验证服务是否有相应的标签选择器。有关更多信息,请参阅 Kubernetes 网站上的标签和选择器。
运行以下命令来验证您的 Kubernetes 服务是否已正确选择并注册了您的容器组(pod)。
命令:
kubectl get pods -o wide
输出示例:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESnginx-6799fc88d8-2rtn8 1/1 Running 0 3h4m 172.31.33.214 ip-172-31-33-109.us-west-2.compute.internal none none
命令:
kubectl describe svc your_service_name -n your_namespace
**注意:**将 your_service_name 替换为您的服务名称,将 your_namespace 替换为您的命名空间。
输出示例:
Events: noneSession Affinity: none
Endpoints: 172.31.33.214:80
....
在示例输出中,172.31.33.214 是 kubectl get pods -o wide 命令返回的容器组(pod)IP 地址。172.31.33.214 IP 地址也用作在 Amazon EKS 集群中运行的服务的后端。