为什么我无法从 Amazon EKS 连接到其他 AWS 服务?

2 分钟阅读
0

我想要排查尝试从 Amazon Elastic Kubernetes Service (Amazon EKS) 连接到其他服务时出现的错误。

简短描述

如果您的 Pod 无法连接到其他服务,您可能会收到以下一个或多个错误:

  • RequestError: send request failed\\ncaused by: Post \\\"https://ec2.us-west-2.amazonaws.com/\\\": dial tcp <IP address>: i/o timeout\"\
  • Couldn't connect to host, port: imap.mail.<region>.awsapps.com,<port>; timeout -1
  • java.net .SocketTimeoutException: connect timed out
  • Connection could not be created to jdbc:postgresql://<hostname>.<region>.rds.amazonaws.com:5432/
  • <URL>.<region>.rds.amazonaws.com (<IPaddress>:3306): Operation timed out
  • Error : java.sql.SQLNonTransientConnectionException: Could not connect to address=(host=<hostname>.<region>.rds.amazonaws.com)(port=3306)(type=master) : Socket fail to connect to host:<hostname>.<region>.rds.amazonaws.com , port:3306. connect timed out***
  • o.apache.kafka.clients.NetworkClient -[Producer clientId=producer-1] Connection to node -1 (<hostname>.c3.kafka.<region>.amazonaws.com/<IPaddress>:9092) could not be established.代理可能不可用。

收到这些错误的原因是网络连接问题,而这些问题可能是由错误的 Amazon Virtual Private Cloud (Amazon VPC) 配置引起的。要解决这些问题,请检查与以下内容相关的安全组和网络访问控制列表 (ACL):

  • 工作节点实例
  • Pod 正在尝试连接的服务

解决方案

当安全组规则或网络 ACL 明确拒绝所需权限时,通常会出现连接超时错误。

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

  • 您的安全组符合 Amazon EKS 要求。
  • 您的 Pod 安全组允许 Pod 彼此通信。
  • 网络 ACL 不会拒绝连接。
  • 您的子网通过本地路由在您的 Amazon VPC 中通信。
  • 您的 Pod 有既定计划,而且处于“正在运行”状态。
  • 您有适用于 Kubernetes 的 Amazon VPC Container Network Interface (CNI) 插件的最新可用版本。
  • 您集群的 VPC 子网有用于 AWS 服务的 VPC 接口端点,您的容器需要访问该端点。

您的安全组符合 Amazon EKS 要求

确保入站和出站规则允许特定协议或端口上的流量,您的工作节点使用这些协议和端口与其他服务通信。最佳实践是允许所有流量在集群和节点之间流动,并允许所有出站流量流向任何目的地。您无需每次在创建新 Pod 和新端口时更改安全组规则。如需更多信息,请参阅 Amazon EKS 安全组要求和注意事项

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

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

网络 ACL 不会拒绝连接

  • 确认流量在您的网络 ACL 上的 Amazon EKS 集群和 VPC CIDR 之间自由流动。
  • 考虑使用与安全组中相似的规则来设置网络 ACL。

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

确认您的子网有默认的路由,以便在您的 VPC 中进行通信。有关更多信息,请参阅Amazon EKS VPC 和子网的要求与注意事项

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

确认您的 Pod 有既定计划,而且处于“正在运行”状态。要排查 Pod 状态问题,请参阅如何排查 Amazon EKS 中的 Pod 状态问题?

您有适用于 Kubernetes 的 Amazon VPC CNI 插件的最新可用版本

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

如果您仍然遇到问题,请参阅如何为 Amazon EKS 解决 kubelet 或 CNI 插件问题?

您集群的 VPC 子网必须有 VPC 端点接口,用于您的 Pod 需要访问的服务

下表列出了一些常用的服务和端点:

服务端点
Amazon Elastic Compute Cloud (Amazon EC2)com.amazonaws.region-code.ec2
Amazon Elastic Container Registry (Amazon ECR)com.amazonaws.region-code.ecr.api com.amazonaws.region-code.ecr.dkr com.azonaws.region-code.s3
弹性负载均衡 (ELB)com.amazonaws.region-code.elasticloadban
AWS X-Raycom.amazonaws.region-code.xray
Amazon CloudWatchcom.amazonaws.region-code.logs
AWS Security Token Service (AWS STS) (在为服务账户使用 IAM 角色时为必要项目)com.azonaws.region-code.sts
AWS App Mesh 不支持适用于 Kubernetes 的 App Mesh 控制器。有关更多信息,请参阅 GitHub 网站上的 App Mesh 控制器。 支持 Cluster Autoscaler。部署 Cluster Autoscaler Pod 时,请确保命令行包含 --aws-use-static-instance-list=true。有关更多信息,请参阅 GitHub 网站上的使用静态实例列表。工作节点 VPC 还必须包括 AWS STS VPC 端点和 Amazon EC2 Auto Scaling 端点。com.amazonaws.region-code.appmesh-envoy-man

有关端点的完整列表,请参阅与 AWS PrivateLink 集成的 AWS 服务

确保 VPC 端点的安全组具有允许来自工作节点的流量的入站规则。


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