如何排查创建 AWS Fargate 配置文件时出现的问题?

上次更新日期:2021-11-04

我有关于创建 AWS Fargate 配置文件的问题。或者,我在创建 AWS Fargate 配置文件时遇到问题。如何排查此问题?

简短描述

Fargate 配置文件是一种机制,用于指定应在 Amazon Elastic Kubernetes Service (Amazon EKS) 集群中的 Fargate 节点上调度哪些 Pod。

Fargate 配置文件包含与每个传入的 Pod 规范 YAML 文件匹配的选择器。如果匹配成功且满足 AWS Fargate 注意事项,则会使用在 Fargate 配置文件中指定的子网和 AWS Identity and Access Management (IAM) 角色在 Fargate 节点上调度 Pod。

一些 Pod 放置规则如下:

  • 如果您为 Pod 选择器配置了命名空间和匹配标签:
    只有当两个条件(命名空间和标签)都与 Pod 规范匹配时,Fargate 工作流才会认为您的 Pod 与 Fargate 配置文件相匹配。
  • 如果在单个 Fargate 配置文件中指定了多个 Pod 选择器:
    当某个 Pod 与这些选择器中的任意一个匹配时,Fargate 调度器将使用匹配的 Fargate 配置文件中的数据在 Fargate 节点上对它进行调度。
  • 如果 Pod 规范与多个 Fargate 配置文件匹配:
    将根据随机 Fargate 配置文件调度该 Pod,除非 Pod 规范中指定了以下注释:eks.amazonaws.com/fargate-profile:<fp_name>

创建 Fargate 配置文件时,请注意以下限制:

  • 每个集群最多可以创建十个 Fargate 配置文件。
  • 每个 Fargate 配置文件最多可以有五个选择器。
  • 每个选择器最多可以有五个标签对。

解决方法

以下是创建 Fargate 配置文件时遇到的一些常见情况和问题:

如何创建 Fargate 配置文件以在 Fargate 节点上调度 Pod?

您可以使用 Amazon EKS 控制台、AWS Command Line Interface (AWS CLI)、软件开发工具包或 API(Cloudformation/eksctl 等)来创建 Fargate 配置文件

如何使用 AWS CloudFormation 创建 Fargate 配置文件?

您可以使用 AWS::EKS::FargateProfile CloudFormation 资源类型来创建 Fargate 配置文件。

但是,如果您不是随 Fargate 节点一起创建 Amazon Elastic Compute Cloud (Amazon EC2) 节点组,则 coredns 附加组件默认具有以下注释:

eks.amazonaws.com/compute-type : ec2

要更改 coredns 注释,必须在外部修补部署。您可以在管理 EKS 集群的终端上执行此操作。或者,您可以根据自己的使用案例,使用 CloudFormation 自定义资源自动执行此过程。

注意:最佳做法是使用 eksctl 创建/更新 EKS 集群,因为这样可以简化集群资源的管理。

Fargate 配置文件中必须包含什么 Pod 执行角色?

Pod 执行角色是 Fargate 节点用来进行 AWS API 调用的 IAM 角色。这些调用包括为获取 Amazon Elastic Container Registry (Amazon ECR) 镜像(例如 VPC CNI、CoreDNS 等)而进行的调用。AmazonEKSFargatePodExecutionRolePolicy 托管式策略必须附加到此角色。

Fargate 节点上的 Kubelet 使用此 IAM 角色与 API 服务器进行通信。此角色必须包含在 aws-auth configmap 中,以便 kubelet 向 API 服务器进行身份验证。当您创建 Fargate 配置文件时,Fargate 工作流会自动将此角色添加到集群的 aws-auth configmap 中。

如果您的 Fargate 节点显示为“Not Ready(未就绪)”,请确保 aws-auth 中包含 Pod 执行角色。

以下是创建包含 Pod 执行角色的 Fargate 配置文件后的 aws-auth mapRoles 代码段示例:

mapRoles: |   
    - groups:
      - system:bootstrappers
      - system:nodes
      - system:node-proxier
      rolearn: <Pod_execution_role_ARN>
      username: system:node:{{SessionName}}

如果在创建 Fargate 配置文件后更改了 aws-auth configmap,那么在 Fargate 节点上调度 Pod 时,您可能会收到以下警告:

Pod provisioning timed out (will retry) for pod: <pod_nginx>

我计划将工作负载迁移到 EKS Fargate。如何创建子网和安全组以供使用?

EKS Fargate 目前仅支持私有子网。这表示,在附加到 Fargate 配置文件中指定的子网的路由表中,没有通往互联网网关的默认路由。因此,您可以为计划用于 Fargate 配置文件的子网配置 NAT 网关或 VPC 终端节点

集群安全组默认会附加到 Fargate 节点。您无需专门为此目的预置安全组。此外,如果您为子网使用 VPC 终端节点,请确保集群已激活私有端点访问

请确保附加到 VPC 终端节点的安全组包含入站规则,允许来自集群 VPC CIDR 的 HTTPS 端口 443 的流量。

我正在使用基于 API 的配置程序(例如 Terraform 或 AWS CloudFormation)创建 Fargate 配置文件。为什么 Fargate 配置文件变为 CREATE_FAILED 状态。

一次只能创建或删除一个 Fargate 配置文件。因此,如果您正在删除某个 Fargate 配置文件,则无法同时创建或删除其他 Fargate 配置文件。

使用基于 API 的配置程序(例如 CloudFormation)时,请确保在所有其他 Fargate 配置文件成功创建之后,再开始创建 Fargate 配置文件。您可以使用 DependsOn 属性在 Fargate 配置文件之间创建链状层次结构,以便按顺序执行创建和删除。如果请求不是按顺序进行,那么您可能会收到类似如下的错误:

Cannot create Fargate Profile <fp_name1> because cluster <cluster_name> currently has Fargate profile <fp_name2> in status CREATING

我能否在 Fargate 配置文件中指定要为 Fargate 节点预置的资源(CPU、内存)?

您不能在 Fargate 配置文件中直接指定要预置的资源量。最佳做法是在 Fargate Pod 规范 YAML 文件中指定资源请求。这样做可帮助 Fargate 工作流至少为 Pod 分配该数量的资源。

您在运行 kubectl describe node <node_name> 命令后看到的 vCPU 或内存量可能与您为 Pod 请求的 CPU 或内存量不同。节点拥有的内存和 CPU 数量取决于 Fargate 资源分配池中的可用容量。我们会根据您在 Pod 规范中请求的资源量向您收取费用。您的付费依据不是通过 kubectl 看见的资源量。

CPU 和内存始终由 AWS Fargate 作为离散组合进行预置和计费。计费资源量包括节点上运行的除 Pod 以外组件使用的资源量,例如 kubelet、kube-proxy 等所用的资源。例如,如果您为 Pod 请求 1 个 vCPU 和 8 GB 内存,那么您需要按照 2 个 vCPU 和 9 GB 内存的更高一级组合付费。这考虑了 kubelet 和节点上其他 Kubernetes 组件所使用的资源。有关更多信息,请参阅 Pod CPU 和内存


这篇文章对您有帮助吗?


您是否需要账单或技术支持?