我在 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 注意事项。