为什么我的 Pod 不会连接到 Amazon EKS 中的其他 pod?

上次更新时间:2020 年 2 月 21 日

我的 pod 不会连接到 Amazon Elastic Kubernetes Service (Amazon EKS) 中的其他 pod。

简短描述

如果您的 pod 无法与其他 pod 连接,您可能收到以下错误消息(取决于您的应用程序)。

若来自某工作线程节点的安全组不允许工作线程之间进行通信:

curl: (7) Failed to connect to XXX.XXX.XX.XXX port XX: Connection timed out

若 DNS 不运行:

Error: RequestError: send request failed caused by: Post  dial tcp: i/o timeout

若 DNS 正在运行,但还是发生 pod 连接问题:

Error: RequestError: send request failed caused by: Post  dial tcp 1.2.3.4.5:443: i/o timeout

若 pod 不通过服务公开,而您尝试为该 pod 解析 DNS:

kubectl exec -it busybox -- nslookup nginx 
Server:	  10.100.0.10
Address:  10.100.0.10:53
** server can't find nginx.default.svc.cluster.local: NXDOMAIN
*** Can't find nginx.svc.cluster.local: No answer
*** Can't find nginx.cluster.local: No answer
*** Can't find nginx.ap-southeast-2.compute.internal: No answer
*** Can't find nginx.default.svc.cluster.local: No answer
*** Can't find nginx.svc.cluster.local: No answer
*** Can't find nginx.cluster.local: No answer
*** Can't find nginx.ap-southeast-2.compute.internal: No answer

要解决这些错误,通过确认以下各项检查您的环境是否设置正确:

  • 您满足 Kubernetes 的联网要求(任何意向性 NetworkPolicy 除外)
  • 您的 pod 正确使用 DNS 进行相互通信
  • 您的安全组符合 Amazon EKS 指导原则
  • 网络访问控制列表 (ACL) 未拒绝连接
  • 您的子网通过本地路由在 Amazon Virtual Private Cloud (Amazon VPC) 中通信
  • 子网中有足够多的可用 IP 地址
  • 您的 pod 有既定计划,而且处于“正在运行”状态
  • 您有适用于 Kubernetes 的 Amazon VPC CNI 插件的推荐版本

解决方法

您满足 Kubernetes 的联网要求(任何意向性 NetworkPolicy 除外)

确认您满足 Kubernetes 的联网要求

在默认情况下,pod 不会被隔离。Pods 接受来自任何源的流量。Pod 会根据选择它们的 NetworkPolicy 被隔离。

注意:对于 NetworkPolicy 配置,见在 Amazon EKS 上安装 Calico

您的 pod 正确使用 DNS 进行相互通信

您必须首先通过服务公开您的 pod。如果您没有这么做,那么您的 pod 不会有 DNS 名称,而且仅可通过其特定 IP 地址连接。

见以下示例:

$ kubectl run nginx --image=nginx --replicas=5 -n web
deployment.apps/nginx created

$ kubectl expose deployment nginx --port=80 -n web
service/nginx exposed

$ kubectl get svc -n web
NAME    TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
nginx   ClusterIP   10.100.94.70   <none>        80/TCP    2s

# kubectl exec -ti busybox -n web -- nslookup nginx
Server:    10.100.0.10
Address 1: 10.100.0.10 ip-10-100-0-10.ap-southeast-2.compute.internal
Name:      nginx
Address 1: 10.100.94.70 ip-10-100-94-70.ap-southeast-2.compute.internal

输出显示,在为 nginx 服务解析 DNS 名称时,ClusterIP 10.100.94.70 被返回。

如果您的 pod 还是无法解析 DNS,见如何使用 Amazon EKS 排查 DNS 故障?

注意:如需更多信息,见 Pod服务,和 Headless Service

您的安全组符合 Amazon EKS 指导原则

如果您想限制在工作线程节点安全组上允许哪些流量,为被您的工作线程节点用于工作线程间通信的任何协议或任何端口创建入站规则。

最好的做法是为其自身启用全部流量。您无需每次在创建新 pod 和新端口时更改安全组规则。

如需更多信息,见 Amazon EKS 安全组注意事项

网络 ACL 未拒绝连接

1.    确认流量在您的网络 ACL 上的 Amazon EKS 集群和 VPC CIDR 之间自由流动。

2.    (可选)要为您的 VPC 添加更多安全层,考虑使用与您的安全组类似的规则设置网络 ACL。

您的子网通过本地路由在您的 VPC 中通信

确认您的子网有默认的路由,以便在 VPC 中进行通信。

子网中有足够多的可用 IP 地址

确认您的指定子网有足够多可用于跨账户弹性网络接口和您的 pod 的 IP 地址。

如需更多信息,见 VPC IP 寻址

要检查可用的 IP 地址,运行以下 AWS 命令行界面 (AWS CLI) 命令:

$ aws ec2 describe-subnets --subnet-id YOUR-SUBNET-ID --query 'Subnets[0].AvailableIpAddressCount'

您的 pod 有既定计划,而且处于“正在运行”状态

确认您的 pod 有既定计划,而且处于“正在运行”状态。

要排查您的 pod 状态,见如何排查 Amazon EKS 中的 pod 状态?

您有适用于 Kubernetes 的 Amazon VPC CNI 插件的推荐版本

如果您运行的不是适用于 Kubernetes 的 Amazon VPC CNI 插件推荐版本,请考虑升级到最新的版本。

如果您有推荐的版本,但依然遇到问题,请见如何排查 Amazon EKS 的 CNI 插件问题?


这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助?