如何对 Amazon ECS 中的 Service Connect 问题进行故障排除?
我的 Amazon Elastic Container Service (Amazon ECS) 服务无法连接到其他服务。
解决方案
**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI。
配置错误或网络问题会导致服务间通信问题。要解决这些问题,请执行以下故障排除操作。
检查 Service Connect 配置
验证是否已激活 Service Connect
**先决条件:**要使用 Amazon ECS Service Connect,请确保您满足 Service Connect 要求。
要检查是否为 Amazon ECS 服务激活了 Service Connect,请运行以下 AWS CLI 命令 describe-services:
aws ecs describe-services --cluster cluster-name --services service-name
**注意:**请将 cluster-name 替换为您的集群名称,将 service-name 替换为您的服务名称。
输出示例:
"serviceConnectConfiguration": { "enabled": true,
**注意:**如果 Amazon ECS 服务必须允许来自其他服务的网络流量,请确保将 Service Connect 配置设置为客户端-服务器服务。要检查此配置,请查看命令输出中 "serviceConnectionConfiguration" 下的 "services"。
检查您的服务的命名空间
要使用 Service Connect,必须在同一个命名空间中配置您的 Amazon ECS 服务。此外,请确保您的客户端服务和客户端-服务器服务位于同一个命名空间中。要检查服务的命名空间,请运行以下 describe-services 命令:
aws ecs describe-services --cluster cluster-name --services service-name | grep namespace
**注意:**请将 cluster-name 替换为您的集群名称,将 service-name 替换为您的服务名称。
在输出中,检查 namespace 的值。要更新服务的命名空间,请使用 Amazon ECS 控制台更新 Service Connect 配置设置。或者,运行以下 update-service 命令:
aws ecs update-service --cluster cluster-name --service service-name --service-connect-configuration enabled=true,namespace=Namespace-name --force-new-deployment
**注意:**请将 cluster-name 替换为您的集群名称,将 service-name 替换为您的服务名称,将 Namespace-name 替换为您的命名空间。
如果客户端服务无法解析客户端-服务器服务 DNS,则您会收到以下错误消息之一:
- “服务器找不到 DNS: NXDOMAIN”
- “服务器找不到 example.core.staging.local: NXDOMAIN”
要解决此问题,请运行以下 get-namespace 命令,以验证您是否已在 AWS Cloud Map 中注册了该命名空间:
aws servicediscovery get-namespace --id namespace
**注意:**请将 namespace 替换为您的命名空间 ID。
检查命令的输出,以查看您的 AWS 账户和 AWS 区域中的可用命名空间。
要确认是否已将任务注册到实例命名空间中,请完成以下步骤:
-
要获取命名空间 ID,请运行以下 list-namespaces 命令:
aws servicediscovery list-namespaces -
要查看服务的已注册实例,请运行以下 list-instances 命令:
aws servicediscovery list-instances --service-id srv-serviceID**注意:**请将 serviceID 替换为您的服务 ID。
-
如果您未注册您的实例,请运行以下 update-service 命令来重新部署任务:
aws ecs update-service --cluster cluster-name --service service-name --region region-name --force-new-deployment**注意:**请将 cluster-name 替换为您的集群名称,将 service-name 替换为您的服务名称,将 region-name 替换为您的区域。
或者,使用 Amazon ECS 控制台更新服务,并选择 Force new deployment(强制实施新部署)。
检查您的端口映射名称
如果您未在任务定义中设置端口映射名称,则您会收到以下错误消息:
“未找到端口别名。请选择端口映射配置为使用客户端和服务器模式的其他任务定义系列和版本。”
要解决此问题,请更新任务定义,并在 portMappings 下为 name 参数添加值。
任务定义示例:
"portMappings": [ { "name": "portmappingnameexample", "containerPort": 3000, "hostPort": 3000, "protocol": "tcp" }
检查网络 ACL 和安全组设置
确保您的网络访问控制列表(网络 ACL)和安全组使用以下配置:
- 客户端服务允许出站流量流向客户端-服务器服务安全组的端口。
- 客户端-服务器服务安全组允许客户端服务端口上的入站流量。
- 虚拟专用网络 (VPC) 网络 ACL 允许容器端口和 ingressPortOverride 端口上的流量。
- 如果服务任务在不同的 VPC 中运行,则 VPC 对等连接或中转网关必须允许 VPC 之间的流量。
检查服务任务之间的连接
完成以下步骤:
-
如果您在 AWS Fargate 上运行任务,请激活 ECS Exec。如果您在 Amazon Elastic Compute Cloud (Amazon EC2) 上运行任务,请继续执行步骤 3。
-
运行以下 execute-command 命令,以远程连接到容器:
aws ecs execute-command --cluster cluster-name \ --task task-id \ --container container-name \ --interactive \ --command "/bin/sh"**注意:**请将 cluster-name 替换为您的集群名称,将 task-id 替换为您的任务 ID,将 container-name 替换为您的容器实例。
-
要确保您的连接使用了 Service Connect 代理,请运行以下命令:
curl -I http://$IPaddress:portnumber/healthcheck**注意:**请将 IPaddress 替换为任务的私有 IP 地址,将 portnumber 替换为容器实例端口,将 healthcheck 替换为容器运行状况检查路径。
检查命令输出中是否存在 server: envoy 标头,以确认连接是否使用了代理。如果连接未使用代理,请确保您的 Service Connect 配置正确。
-
要打开 /etc/hosts 文件,请运行以下命令:
cat /etc/hosts检查命令的输出,以确保您可以看到其他服务的端点。如果您看不到服务端点,请确保您的 Service Connect 配置正确。
-
如果您更改 Service Connect 配置,请运行以下 update-service 命令来重新部署任务:
aws ecs update-service --cluster cluster-name --service service-name --region region-name --force-new-deployment**注意:**请将 cluster-name 替换为您的集群名称,将 service-name 替换为您的服务名称,将 region-name 替换为您的区域。
或者,使用 Amazon ECS 控制台更新服务,并选择 Force new deployment(强制实施新部署)。
重新部署您的客户端服务任务
如果您收到“Could not resolve host”(无法解析主机)错误消息,则表明您的任务无法解析服务端点。相反,您可能会收到“ping: bad address 'DNS'”(ping: 地址错误 'DNS')错误消息。
要解决这些问题,请重新部署现有的客户端服务任务。
查看您的应用程序日志
检查您的应用程序日志中是否存在连接或运行时错误。Amazon ECS 会根据您使用的日志驱动程序将日志导出到不同的目标。如果您使用 awslogs 驱动程序,则 Amazon ECS 会将日志导出到 Amazon CloudWatch。
相关信息
- 语言
- 中文 (简体)
