如何排除建立 AWS Fargate 設定檔的相關問題?

上次更新日期:2021 年 11 月 4 日

我對建立 AWS Fargate 設定檔有所疑問,或是我在建立 AWS Fargate 設定檔時發生問題。在這些情況下,我該如何疑難排解?

簡短描述

Fargate 設定檔是在 Amazon Elastic Kubernetes Service (Amazon EKS) 叢集中指定哪些 Pod 應排程於 Fargate 節點的一種機制。

Fargate 設定檔的選擇器會與每個傳入的 Pod 規格 YAML 檔案相互比對。如果兩者相符並符合 AWS Fargate 考量事項,系統會透過子網路將 Pod 排程到 Fargate 節點上,並在 Fargate 設定檔中指定 AWS Identity and Access Management (IAM) 角色。

部分 Pod 置放規則如下:

  • 如果您已為 Pod 選擇器設定命名空間和比對標籤:
    唯有兩項條件 (命名空間和標籤) 皆與 Pod 規格符合,Fargate 工作流程才會判定 Pod 與 Fargate 設定檔相符。
  • 如果您已在單一 Fargate 設定檔中指定多個 Pod 選擇器:
    Pod 符合其中任一選擇器時,Fargate 排程器會使用相符 Fargate 設定檔中的資料,將 Pod 排程到 Fargate 節點上執行。
  • 如果 Pod 規格與多個 Fargate 設定檔相符:
    排程器會隨機依據任一 Fargate 設定檔為 Pod 排程,除非您已在 Pod 規格中指定以下註解:eks.amazonaws.com/fargate-profile:<Fargate 設定檔名稱>

建立 Fargate 設定檔時,請注意下列限制:

  • 每個叢集最多可以建立十個 Fargate 設定檔。
  • 每個 Fargate 設定檔最多可以有五個選擇器。
  • 每個選擇器最多可以有五組標籤。

解決方案

建立 Fargate 設定檔時常見的情境和問題如下:

如何建立 Fargate 設定檔,以便將 Pod 排程到 Fargate 節點上?

您可以使用 Amazon EKS 主控台、AWS Command Line Interface (AWS CLI)、SDK 或 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 角色,而這些呼叫的功用包括擷取 VPC CNI 和 CoreDNS 等 Amazon Elastic Container Registry (Amazon ECR) 映像。AmazonEKSFargatePodExecutionRolePolicy 受管政策必須與此角色連接。

Fargate 節點上的 Kubelet 會使用此 IAM 角色與 API 伺服器通訊。這個角色必須包含於 aws-auth configMap 中,這樣 kubelet 才能對 API 伺服器執行身分驗證作業。當您建立 Fargate 設定檔時,Fargate 工作流程會自動將此角色新增至叢集的 aws-auth configMap

如果您的 Fargate 節點顯示為「未就緒」,請確認 aws-auth 中是否含有 Pod 執行角色。

建立 Fargate 設定檔 (具有 Pod 執行角色) 後,系統產生的 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 <節點名稱> 命令後顯示的 vCPU 或記憶體數量,可能不會與您為 Pod 提出的 CPU 或記憶體請求數量相同。節點具有的記憶體和 CPU 數量取決於 Fargate 資源分配集區的可用容量。系統會根據您在 Pod 規格中請求配置的數量向您收費,並非依據 kubectl 命令所顯示的資源數量。

AWS Fargate 一概將 CPU 和記憶體視為離散型組合,在此基礎上佈建及收費。計費項目包括節點上除了 Pod 之外的其他執行元件 (例如 kubelet、kube-proxy 等等),均依使用率收費。例如,如果您為 Pod 請求配置一個 vCPU 和 8 GB 記憶體,則系統會採取高一個級別的配置方案,依兩個 vCPU 和 9 GB 記憶體的組合向您收費。此作法將節點上 kubelet 和其他 Kubernetes 元件所使用的資源也一併納入考量。如需詳細資訊,請參閱 Pod CPU 和記憶體


此文章是否有幫助?


您是否需要帳單或技術支援?