如何排解在 Amazon EKS 叢集上設定 Cluster Autoscaler 時遇到的問題?

4 分的閱讀內容
0

我想要排解在 Amazon Elastic Kubernetes Service (Amazon EKS) 叢集上啟動 Cluster Autoscaler 時遇到的問題。

簡短描述

開始之前,請確定您已驗證下列事項:

  • 您已安裝或更新 eksctl 至最新版本。
  • 您已使用自己的值取代程式碼片段中的預留位置值。

**注意:**由於使用了 AWS 區域的預設值,指令中並非一律使用 --region 變數。透過執行 AWS Command Line Interface (AWS CLI) 設定命令來檢查預設值。如果您需要變更 AWS 區域,請使用 --region 旗標。

**注意:**如果您在執行 AWS CLI 命令時收到錯誤訊息,請確認您執行的是最新版本的 AWS CLI

解決方案

Cluster Autoscaler Pod 處於 CrashLoopBackOff 狀態

透過執行下列命令來檢查 Cluster Autoscaler Pod 狀態:

kubectl get pods -n kube-system | grep cluster-autoscaler

以下是處於 CrashLoopBackOff 狀態的 Cluster Autoscaler Pod 的範例:

NAME                            READY   STATUS             RESTARTS      AGE
cluster-autoscaler-xxxx-xxxxx   0/1     CrashLoopBackOff   3 (20s ago)   99s

透過執行下列命令來檢視 Cluster Autoscaler Pod 日誌:

kubectl logs -f -n kube-system -l app=cluster-autoscaler

如果日誌指出存在 AWS Identity and Access Management (IAM) 許可問題,則執行以下操作:

  • 檢查 OIDC 提供者是否與 Amazon EKS 叢集建立關聯。
  • 檢查 Cluster Autoscaler 服務帳戶是否使用 IAM 角色加以註解。
  • 檢查前述 IAM 角色是否已連接正確的 IAM 政策。
  • 檢查信任關係是否設定正確。

**注意:**以下是指出 IAM 許可問題的日誌範例:

Failed to create AWS Manager: cannot autodiscover ASGs: AccessDenied: User: xxx is not authorized to perform: autoscaling: DescribeTags because no identity-based policy allows the autoscaling:DescribeTags action status code: 403, request id: xxxxxxxx

重要事項:請務必檢查所有指定的 AWS CLI 命令,並用您的值取代範例字串的所有執行個體。例如,用您的叢集取代 example-cluster

檢查 OIDC 提供者是否與 EKS 叢集建立關聯

1.    透過執行下列命令,檢查叢集是否擁有現有的 IAM OpenID Connect (OIDC) 提供者

oidc_id=$(aws eks describe-cluster --name example-cluster --query "cluster.identity.oidc.issuer" --output text | cut -d '/' -f 5)

2.    透過執行下列命令,檢查您的帳戶中是否已經有使用您的叢集 ID 的 IAM OIDC 提供者:

aws iam list-open-id-connect-providers | grep $oidc_id | cut -d "/" -f4

**注意:**如果傳回輸出,則您的叢集已經有 IAM OIDC 提供者,而且您可以略過下一個步驟。如果沒有傳回任何輸出,則必須在下一個步驟為叢集建立 IAM OIDC 提供者。

3.    透過執行下列命令,為您的叢集建立 IAM OIDC 身分識別提供者:

eksctl utils associate-iam-oidc-provider --cluster example-cluster --approve

檢查 Cluster Autoscaler 服務帳戶是否使用 IAM 角色加以註解

透過執行下列命令,檢查服務帳戶是否已使用 IAM 角色加以註解:

kubectl get serviceaccount cluster-autoscaler -n kube-system -o yaml

以下是預期的結果:

apiVersion: v1
kind: ServiceAccount
metadata:
  annotations:
    eks.amazonaws.com/role-arn: arn:aws:iam::012345678912:role/<cluster_auto_scaler_iam_role>
  name: cluster-autoscaler
  namespace: kube-system

檢查前述 IAM 角色是否已連接正確的 IAM 政策

請參閱下列範例:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "VisualEditor0",
      "Effect": "Allow",
      "Action": [
        "autoscaling:DescribeAutoScalingInstances",
        "autoscaling:SetDesiredCapacity",
        "autoscaling:DescribeAutoScalingGroups",
        "autoscaling:DescribeTags",
        "autoscaling:DescribeLaunchConfigurations",
        "ec2:DescribeLaunchTemplateVersions",
        "ec2:DescribeInstanceTypes",
        "autoscaling:TerminateInstanceInAutoScalingGroup"
      ],
      "Resource": "*"
    }
  ]
}

檢查信任關係是否設定正確

請參閱下列範例:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::<example_awsaccountid>:oidc-provider/oidc.eks.<example_region>.amazonaws.com/id/<example_oidcid>"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "oidc.eks.<example_region>.amazonaws.com/id/<example_oidcid>:aud": "sts.amazonaws.com",
          "oidc.eks.<example_region>.amazonaws.com/id/<example_oidcid>:sub": "system:serviceaccount:kube-system:cluster-autoscaler"
        }
      }
    }
  ]
}

對服務帳戶角色或 IAM 政策做出任何變更時,請重新啟動 Cluster Autoscaler Pod。

如果日誌指出任何聯網問題 (例如 I/O 逾時),則請執行下列動作:

**注意:**以下是指出聯網問題的日誌範例:

Failed to create AWS Manager: cannot autodiscover ASGs: WebIdentityErr: failed to retrieve credentials caused by: RequestError: send request failed caused by: Post https://sts.region.amazonaws.com/: dial tcp: i/o timeout

1.    檢查 Amazon EKS 叢集是否已設定所需的聯網設定。確認工作節點子網路具有路由表,可將流量路由至下列端點,無論是全域或是區域端點

  • Amazon Elastic Compute Cloud (Amazon EC2)
  • AWS Auto Scaling
  • AWS Security Token Service (AWS STS)

2.    確定子網路的網路存取控制清單 (network ACL) 或工作節點安全群組未封鎖與這些端點通訊的流量。

3.    如果 Amazon EKS 叢集為私有,則檢查相關 Amazon Virtual Private Cloud (VPC) 端點的設定。例如,Amazon EC2、AWS Auto Scaling 和 AWS STS。

**注意:**每個 VPC 端點的安全群組為必要項,以允許 Amazon EKS 工作節點安全群組。此外,還需要依據傳入流量在 443 連接埠上允許 Amazon EKS VPC CIDR 區塊。

Cluster Autoscaler 不會向內擴展或向外擴展節點

如果 Cluster Autoscaler 未向內擴展或向外擴展節點,則檢查以下項目:

  • 檢查 Cluster Autoscaler Pod 日誌。
  • 檢查 Cluster Autoscaler 的 Auto Scaling 群組標記。
  • 檢查部署清單檔案的組態。
  • 檢查節點的目前數目。
  • 檢查 Pod 資源請求。
  • 檢查節點群組中節點的污點組態。
  • 檢查節點是否用縮減-停用加以註解。

檢查 Cluster Autoscaler Pod 日誌

若要檢視 Pod 日誌並識別 Cluster Autoscaler 無法向內擴展或向外擴展節點的原因,請執行下列命令:

kubectl logs -f -n kube-system -l app=cluster-autoscaler

執行下列 describe pod 命令,檢查處於擱置中狀態的 Pod 是否包含任何排程規則,例如親和性規則:

kubectl describe pod <example_podname> -n <example_namespace>

檢查輸出中的事件部分。本節介紹 Pod 為何處於擱置中狀態的相關資訊。

**注意:**Cluster Autoscaler 會遵循 nodeSelectornodeAffinity 中的 requiredDuringSchedulingIgnoredDuringExecution,假設您已相應地標記節點群組。如果無法使用 nodeSelectorrequiredDuringSchedulingIgnoredDuringExecution 對 Pod 進行排程,則 Cluster Autoscaler 只會考慮滿足這些擴充需求的節點群組。相應地修改 Pod 或節點上定義的排程規則,以便在節點上排程 Pod。

檢查 Cluster Autoscaler 的 Auto Scaling 群組標記

必須標記節點群組對應的 Auto Scaling 群組,Cluster Autoscaler 才能如下所示探索 Auto Scaling 群組:

標籤 1︰

  • 索引鍵︰k8s.io/cluster-autoscaler/example-cluster
  • 值:owned

標籤 2︰

  • 索引鍵︰k8s.io/cluster-autoscaler/enabled
  • 值:true

檢查部署清單檔案的組態

若要檢查 Cluster Autoscaler 部署清單檔案的組態,請執行下列命令:

kubectl -n kube-system edit deployment.apps/cluster-autoscaler

檢查清單檔案是否已如下所示設定正確的 node-group-auto-discovery 引數:

containers:
- command
   ./cluster-autoscaler
   --v=4
   --stderrthreshold=info
   --cloud-provider=aws
   --skip-nodes-with-local-storage=false
   --expander=least-waste
   --node-group-auto-discovery=asg:tag=k8s.io/cluster-autoscaler/enabled,k8s.io/cluster-autoscaler/example-cluster
   --balance-similar-node-groups
   --skip-nodes-with-system-pods=false

檢查節點的目前數目

若要檢查目前的節點數目是否已達到受管節點群組的最小值或最大值,請執行下列命令:

aws eks describe-nodegroup --cluster-name <example-cluster> --nodegroup-name <example-nodegroup>

如果已達到最小值或最大值,則使用新的工作負載需求修改這些值。

檢查 Pod 資源請求

若要檢查目前的節點執行個體類型是否無法滿足 Pod 資源請求,請執行下列命令:

kubectl -n <example_namespace> get pod <example_podname> -o yaml | grep resources -A6

若要滿足資源要求,請修改 Pod 資源請求或建立新的節點群組。建立新的節點群組時,請確定節點的執行個體類型可滿足 Pod 的資源請求。

檢查節點群組中節點的污點組態

透過執行下列命令,檢查是否已為節點設定污點,以及 Pod 是否可以容忍該污點:

kubectl describe node <example_nodename> | grep taint -A2

如果已設定污點,則移除節點上定義的污點。如果 Pod 無法容忍污點,則在 Pod 上定義容忍值,以便在具有污點的節點上對 Pod 排程。

檢查節點是否用縮減-停用加以註解

若要檢查節點是否使用縮減-停用加以註解,請執行下列命令:

kubectl describe node <example_nodename> | grep scale-down-disable

以下是預期的結果:

cluster-autoscaler.kubernetes.io/scale-down-disabled: true

如果縮減-停用設定為 true,則移除節點的註解,以便透過執行下列命令來縮減規模:

kubectl annotate node <example_nodename> cluster-autoscaler.kubernetes.io/scale-down-disabled-

如需疑難排解的詳細資訊,請參閱 GitHub 網站上的 Cluster Autoscaler 常見問答集


AWS 官方
AWS 官方已更新 1 年前