Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
AWS Fargate 上的 Amazon EKS 容器组 (pod) 一直处于“待处理”状态,我该如何解决这一问题?
我在 AWS Fargate 实例上运行的 Amazon Elastic Kubernetes Service (Amazon EKS) 容器组 (pod) 一直处于“待处理”状态。
简短描述
使用 AWS Fargate 的 Amazon EKS 容器组 (pod) 可能会因为许多原因而处于待处理状态:
- 由于特定 vCPU 和内存组合不可用,因此出现了容量错误。
- 您使用默认注释创建了 CoreDNS 容器组 (pod),该注释将这些容器组 (pod) 映射到 Amazon Elastic Compute Cloud (Amazon EC2) 计算类型。要在 Fargate 节点上进行调度,请移除 Amazon EC2 计算类型。
- 当您创建容器组 (pod) 并将其分配给 fargate-scheduler 时,该容器组 (pod) 与任何 Fargate 配置文件都不匹配。如果容器组 (pod) 在创建时不匹配,则不会自动将其重新调度到 Fargate 节点。即使您创建了之后匹配的配置文件,也是如此。在这种情况下,容器组 (pod) 被分配给 default-scheduler。
- 如果容器组 (pod) 已分配给 fargate-scheduler,但仍处于待处理状态,则可能需要另外对其进行故障排除。
解决方法
先决条件
- 配置命名空间并(可选)指定 Kubernetes 标签以匹配您的容器组 (pod) 选择器的标签。只有当两个条件均符合容器组 (pod) 规范时,Fargate 工作流程才会将容器组 (pod) 与 Fargate 配置文件进行匹配。
- 如果您在单个 Fargate 配置文件中指定了多个容器组 (pod) 选择器,则 fargate-scheduler 会在容器组 (pod) 与任一选择器匹配时对其进行调度。
- 如果一个容器组 (pod) 规范与多个 Fargate 配置文件相匹配,则会根据随机的 Fargate 配置文件来调度容器。为了避免出现这种情况,可以在容器组 (pod) 规范中使用注释eks.amazonaws.com/fargate-profile:fp_name。将 fp_name 替换为您的 Fargate 配置文件名。
重要事项: 以下步骤仅适用于使用 AWS Fargate 启动的容器组 (pod)。有关在 Amazon EC2 实例上启动的容器组 (pod) 的信息,请参阅如何解决 Amazon EKS 中的容器组 (pod) 状态问题?
找出您的容器组 (pod) 状态
1.要检查您的容器组 (pod) 状态,请运行以下命令:
kubectl get pods -n <namespace>
2.要获取有关您的容器组 (pod) 的更多错误信息,请运行以下 describe 命令:
kubectl describe pod YOUR\_POD\_NAME -n <namespace>
请参阅 describe 命令的输出结果以评估要完成的解决步骤。
解决容量错误
如果您的容器组 (pod) 存在容量问题,则 describe 输出将显示类似下面这样的消息:
“Fargate 的容量目前不可用。请稍后重试或在其他可用区重试。”
这表示 Fargate 无法根据您选择的 vCPU 和内存组合预置计算容量。
要解决此错误,请完成以下步骤:
- 20 分钟后尝试再次创建容器组 (pod)。由于该错误是基于容量的,因此确切时长可能会有所不同。
- 在容器组 (pod) 规范中更改请求(CPU 和内存)。有关容器组 (pod) 规范的信息,请参阅 Kubernetes 网站上的 Kubernetes 如何应用资源请求和限制。然后,Fargate 工作流程会提供 vCPU 和内存的新组合。
**注意:**您需要按其中一种组合付费。有关如何根据您的容器组 (pod) 规范最终确定组合的更多信息,请参阅容器组 (pod) CPU 和内存。从您的终端或集成式开发环境 (IDE) 执行 kubectl describe 节点命令,以获得更高的 vCPU 和内存组合值。根据您的请求,Fargate 并非总有可用容量。Fargate 会尽最大努力从容量池中配置资源。您只需按照容器组 (pod) 使用量以及等效的 vCPU 和内存组合付费。
解析处于“待处理”状态的 CoreDNS 容器组 (pod)
如果 CoreDNS 容器组 (pod) 处于待处理状态,则输出结果将显示类似下面这样的消息:
kubectl get pods -n kube-system NAME READY STATUS RESTARTS AGE coredns-6548845887-qk9vf 0/1 Pending 0 157m
这可能是因为 CoreDNS 部署有以下默认注释:eks.amazonaws.com/compute-type : ec2。
要解决此问题并将容器组 (pod) 重新分配给 Fargate 调度器,请参阅更新 CoreDNS。
对分配给 fargate-scheduler 的容器组 (pod) 进行故障排除
分配给 fargate-scheduler 的容器组 (pod) 可能会出于很多原因而停留在待处理状态。如果您的容器组 (pod) 仍处于待处理状态,则 describe 输出将显示类似下面这样的消息:
Events: Type Reason Age From ---- ------ ---- ---- Warning FailedScheduling 2m25s (x301 over 5h3m) fargate-scheduler
要解决此错误,请完成以下任务:
- 删除并重新创建容器组 (pod)。
- 确认容器组 (pod) 规范 YAML 中未设置以下规范。这些规范会导致 fargate-scheduler 跳过容器组 (pod):
node selector
<>node name
schedulerName - 确认您在 Fargate 配置文件中选择的子网有足够的空闲 IP 地址来创建新的容器组 (pod)。每个 Fargate 节点将消耗子网中的一个 IP 地址。
- 确认 NAT 网关已设置为公有子网,并且已连接弹性 IP 地址。
- 确认与您的虚拟私有云 (VPC) 关联的 DHCP 选项集具有 AmazonProvidedDNS 或 domain-name-servers 的有效 DNS 服务器主机名。
- 确认您的 VPC 的 DNS 主机名和 DNS 解析已启用。
- 如果您的 Fargate 容器组 (pod) 使用私有子网,并且仅配置了用于服务通信的 VPC 端点,则应允许这些端点具有 DNS 名称:
ECR - API
ECR - DKR
S3 网关端点 - 确认连接到 VPC 端点的安全组允许在 Fargate 和 API 服务器之间来回通信。VPC 端点安全组必须允许端口 443 从集群 VPC CIDR 传入。您还必须为您的集群开启私有端点访问权限。
解析分配给 default-scheduler 的容器组 (pod)
要确定分配给您的容器组 (pod) 的调度器,请运行以下命令:
kubectl get pods -o yaml -n <namespace> <pod-name> | grep schedulerName.
在输出中,确认 schedulerName 为 fargate-scheduler。如果它被列为 default-scheduler,则 fargate-scheduler 会跳过该容器组 (pod)。要解决此问题,请检查您的容器组 (pod) 配置中是否有计算类型的注释。有关更多信息,请参阅 AWS Fargate 注意事项。
- 语言
- 中文 (简体)
