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

上次更新时间:2021 年 8 月 30 日

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

简短描述

注意:如果您在运行 AWS Command Line Interface (AWS CLI) 命令时遇到错误,请确保您使用的是最新版的 AWS CLI

如果您的 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 指导原则
  • 您的 Pod 安全组允许 Pod 彼此通信
  • 网络访问控制列表 (ACL) 未拒绝连接
  • 您的子网通过本地路由在 Amazon Virtual Private Cloud (Amazon VPC) 中通信
  • 子网中有足够多的可用 IP 地址
  • 您的 Pod 有既定计划,而且处于“正在运行”状态
  • 您有适用于 Kubernetes 的 Amazon VPC Container Network Interface (CNI) 插件的推荐版本

解决方法

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

确认您符合 Kubernetes 的联网要求(可从 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 故障?

注意:有关更多信息,请参阅 Kubernetes 网站上的 Pod服务Headless Service

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

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

最佳实践是为工作线程节点的安全组启用所有流量。您无需每次在创建新 Pod 和新端口时更改安全组规则。

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

您的 Pod 安全组允许 Pod 彼此通信

如果您使用适用于 Pod 的安全组CNI 自定义联网,则可以将任何安全组分配给 Pod 。在这种情况下,请确认安全组允许 Pod 之间正确通信。

网络 ACL 不会拒绝连接

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

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

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

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

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

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

如需更多信息,请参阅 VPC IP 寻址

要查看可用的 IP 地址,请运行以下 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 插件,请考虑升级到最新的版本。

如果使用的是推荐版本,但依然遇到问题,请参阅如何排查 Amazon EKS 的 Kubelet 或 CNI 插件问题?


这篇文章对您有帮助吗?


您是否需要账单或技术支持?