AWS Fargate 上的 Amazon EKS 容器组 (pod) 一直处于“待处理”状态,我该如何解决这一问题?

3 分钟阅读
0

我在 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.

在输出中,确认 schedulerNamefargate-scheduler。如果它被列为 default-scheduler,则 fargate-scheduler 会跳过该容器组 (pod)。要解决此问题,请检查您的容器组 (pod) 配置中是否有计算类型的注释。有关更多信息,请参阅 AWS Fargate 注意事项

AWS 官方
AWS 官方已更新 7 个月前