我想要排查尝试从 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):
解决方案
当安全组规则或网络 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-Ray | com.amazonaws.region-code.xray |
Amazon CloudWatch | com.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 端点的安全组具有允许来自工作节点的流量的入站规则。