スキップしてコンテンツを表示

Amazon EKS クラスターで Cluster Autoscaler を設定する際の問題をトラブルシューティングする方法を教えてください。

所要時間5分
0

Amazon Elastic Kubernetes Service (Amazon EKS) クラスターで Cluster Autoscaler を起動する際の問題をトラブルシューティングしたいです。

解決策

注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI で発生したエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。

次の解決策のコマンドでは、デフォルト AWS リージョンを使用しているため、--region フラグは指定されていません。デフォルトのリージョンを確認するには、次の AWS CLI コマンド configure を実行します。

aws configure

リージョンを変更する場合は、--region フラグを指定します。

前提条件: eksctl をインストールするか、最新バージョンに更新すること。手順については、eksctl のウェブサイトで「インストール」を参照してください。

発生した問題に応じて、次のトラブルシューティング手順を実行します。プローブに関する問題のトラブルシューティング方法については、「Amazon EKS クラスターにおける稼働状況と準備状況のプローブに関する問題をトラブルシューティングする方法を教えてください」を参照してください。

Cluster Autoscaler ポッドが "CrashLoopBackOff" ステータスである場合

"CrashLoopBackOff" ステータスをトラブルシューティングするには、次の手順を実行します。

  1. Cluster Autoscaler ポッドのステータスを確認するには、次のコマンドを実行します。

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

    出力例:

    NAME                            READY   STATUS             RESTARTS      AGE
    cluster-autoscaler-abcd-abcd   0/1     CrashLoopBackOff   3 (20s ago)   99s
  2. ポッドが "CrashLoopBackOff" ステータスから移行できない原因の詳細を取得するには、次のコマンドを実行します。

    kubectl describe pod cluster-autoscaler-abcd-abcde -n kube-system

    注: cluster-autoscaler-abcd-abcde を Cluster Autoscaler ポッドの名前に置き換えてください。
    出力に表示される Reason の値を確認します。OOMKilled の問題が発生している場合は、kubectl edit コマンドを実行し、Cluster Autoscaler のデプロイにおけるメモリリソースの limits 値と requests 値を増やします。kubectl edit の詳細については、Kubernetes のウェブサイトで kubectl edit を参照してください。Cluster Autoscaler のデフォルトメモリ値については、GitHub のウェブサイトで cluster-autoscaler-autodiscover.yaml を参照してください。
    出力例:

    Name:               cluster-autoscaler-abcd-abcde
    Namespace:          kube-system
    State:              Waiting
    Reason:             CrashLoopBackOff
    Last State:         Terminated
    Reason:             OOMKilled
    Exit Code:          137
    ...
  3. Cluster Autoscaler ポッドのログに問題が発生していないかを確認するには、次のコマンドを実行します。

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

    ログに AWS Identity and Access Management (IAM) 権限に関する問題が表示される場合は、「Cluster Autoscaler ポッドに IAM 権限の問題がある場合」に進んでください。出力例:

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

    ログにネットワークの問題 (例: I/O タイムアウト) が表示される場合は、「Cluster Autoscaler ポッドにネットワークの問題がある場合」に進んでください。出力例:

    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

Cluster Autoscaler ポッドに IAM 権限の問題がある場合

OIDC プロバイダーがクラスターに関連付けられているかどうかを確認する

クラスターで OpenID Connect (OIDC) プロバイダーが作成済みであることを確認します。

Cluster Autoscaler サービスアカウントに IAM ロールがアノテーションとして付与されているかどうかを確認する

AWS サービスアカウントのアノテーションを確認するには、次のコマンドを実行します。

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

annotations を参照し、出力に Cluster Autoscaler サービスアカウントロールが含まれていることを確認します。出力例:

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

サービスアカウントロールに関する問題のトラブルシューティング方法については、「Amazon EKS における OIDC プロバイダーと IRSA のトラブルシューティング方法を教えてください」を参照してください。

IAM ポリシーを確認する

Cluster Autoscaler サービスアカウントロールに正しい IAM ポリシーがアタッチされていることを確認します。ポリシー例および必要な権限のリストについては、GitHub のウェブサイトで「IAMポリシー」を参照してください。

信頼関係が正しく構成されているかどうかを確認する

信頼関係が正しく構成されていることを確認します。信頼関係の例:

{  "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"
        }
      }
    }
  ]
}

注: example_awsaccountid を AWS アカウント ID に、example_region を実際のリージョンに、example_oidcid を OIDC ID に置き換えてください。

サービスアカウントロールまたはポリシーを変更するたびに、次のコマンドを実行して Cluster Autoscaler ポッドを再起動してください。

kubectl rollout restart deployment cluster-autoscaler -n kube-system

Cluster Autoscaler ポッドにネットワークの問題がある場合

Amazon EKS クラスターの構成で必須のネットワーク設定を行ったことを確認します。ワーカーノードのサブネットには、トラフィックを次のエンドポイントにルーティングできるルートテーブルが含まれることを確認します。

Amazon EKS クラスターがプライベートの場合は、上記のエンドポイントに対する Amazon Virtual Private Cloud (Amazon VPC) エンドポイントを作成する必要があります。

注: 各 VPC エンドポイントのセキュリティグループは、Amazon EKS ワーカーノードのセキュリティグループを許可する必要があります。また、セキュリティグループは、Amazon EKS VPC CIDR ブロックへの内向きトラフィックをポート 443 で許可する必要があります。

サブネットのネットワークアクセスコントロールリスト (ネットワーク ACL) およびワーカーノードのセキュリティグループは、これらのエンドポイントと通信するトラフィックをブロックしていないことを確認します。

Cluster Autoscaler がノードをスケールイン、スケールアウトしない場合

Cluster Autoscaler ポッドのログでスケジューリングルールの有無を確認する

ポッドのステータスを確認するには、次のコマンドを実行します。

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

Pending ステータスのポッドにスケジューリングルール (例: アフィニティルール) が含まれているかどうかを確認するには、次のコマンドを実行します。

kubectl describe pod example_podname -n example_namespace

注: example_podname をポッド名に、example_namespace を名前空間名に置き換えてください。

出力の events セクションを参照し、ポッドが Pending ステータスである原因を確認します。出力例:

$ kubectl describe pod cluster-autoscaler-abcde-abcd -n kube-system
Name: cluster-autoscaler-5b6b675456-npf8p
...
Status: Pending
...
Events:
 Type Reason Age From Message
 ---- ------ ---- ---- -------
 Warning FailedScheduling 12s (x4 over 2m) default-scheduler 0/4 nodes are available: 1 node(s) didn't match node selector, 3 node(s) didn't match pod affinity rules.

注: Cluster Autoscaler は、nodeSelector および nodeAffinityrequiredDuringSchedulingIgnoredDuringExecution を考慮します。ノードグループには、これらの値を含むラベルが必要です。ノードグループにラベルを付けるには、次のコマンドを実行します。

kubectl get nodes --show-labels

Cluster Autoscaler が nodeSelector または requiredDuringSchedulingIgnoredDuringExecution に従ってポッドをスケジュールできない場合は、Cluster Autoscaler は、拡張要件を満たすノードグループのみを使用します。ノードでポッドをスケジュールするには、ポッドまたはノードで定義されたスケジューリングルールを変更する必要があります。詳細については、Kubernetes のウェブサイトで「アフィニティとアンチアフィニティ」を参照してください。

Cluster Autoscaler に対する Amazon EC2 Auto Scaling グループのタグ付けを確認する

Cluster Autoscaler に Auto Scaling グループを検出させるには、ノードグループの Amazon EC2 Auto Scaling グループに次のタグを付ける必要があります。

タグ 1 に次の値を設定します。

  • keyk8s.io/cluster-autoscaler/example-cluster を入力します。
  • valueowned を入力します。

注: example-cluster を実際のクラスター名に置き換えてください。

タグ 2 に次の値を設定します。

  • keyk8s.io/cluster-autoscaler/enabled を入力します。
  • valuetrue を入力します。

デプロイマニフェストの設定を確認する

デプロイマニフェストを開くには、次のコマンドを実行します。

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

出力の node-group-auto-discover において、マニフェストには正しいクラスター名またはノードグループ名が含まれていることを確認します。出力例:

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

最大ノード数を超えないようにする

現在のノード数を確認するには、次の describe-nodegroup コマンドを実行します。

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

注: example-cluster をクラスター名に、example-nodegroup をノードグループ名に置き換えてください。

ノードの最小数または最大数に達している場合は、次の update-nodegroup-config コマンドを実行して値を変更します。

aws eks update-nodegroup-config \
    --cluster-name cluster-name \
    --nodegroup-name nodegroup-name \
    --scaling-config minSize=minvalue,maxSize=maxvalue,desiredSize=desiredvalue \

注: cluster-name をクラスター名に、nodegroup-name をノードグループ名に置き換えてください。さらに、minvalue を最小ノード数に、maxvalue を最大ノード数に、desiredvalue をノードの目標値に置き換えてください。

ノードがクラスターに参加できることを確認する

Amazon EC2 Auto Scaling グループが起動した新しいインスタンスが、Amazon EKS クラスターに参加できるかどうかを確認します。参加できない場合は、「ワーカーノードを Amazon EKS クラスターに参加させる方法を教えてください」を参照してください。

ノードのインスタンスタイプが適切であることを確認する

現在のノードインスタンスタイプで Cluster Autoscaler が Pod リソースリクエストを満たすことができるかどうかを確認するには、次のコマンドを実行します。

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

注: example-cluster をクラスター名に、example-podname をポッド名に置き換えてください。

出力例:

 containers:
        - image: registry.k8s.io/autoscaling/cluster-autoscaler:v1.32.1
          name: cluster-autoscaler
          resources:
            limits:
              cpu: 100m
              memory: 600Mi
            requests:
              cpu: 100m
              memory: 600Mi

出力の limits 値および requests 値を確認します。cpumemory の値がポッドを維持するのに十分であることを確認してください。Pod の要件を確認するには、次のコマンドを実行します。

kubectl describe pod podname -n namespace,

注: podname をポッド名に、namespace を名前空間に置き換えてください。

ポッドの要件がノードの性能を上回っている場合は、kubectl edit コマンドを実行し、Cluster Autoscaler のデプロイにおけるメモリリソースの limits 値と requests 値を増やします。または、ポッドのリソース要件を満たす別のインスタンスタイプを使用し、新しいノードグループを作成してもかまいません。kubectl edit の詳細については、Kubernetes のウェブサイトで kubectl edit を参照してください。

ノードグループのノードに対するテイント設定を確認する

ノードにテイントが設定されているかどうか、およびポッドがテイントを許容できるかどうかを確認するには、次のコマンドを実行します。

kubectl describe node example_nodename | grep taint -A2

注: example_nodename を実際のノード名に置き換えてください。

テイントが設定されている場合は、ノードに定義されたテイントを削除します。手順については、「ポッドが Pending ステータスの場合」 (Amazon EKS でポッドのステータスをトラブルシューティングする方法を教えてください) を参照してください。ポッドがテイントを許容できない場合は、そのポッドに容認を定義します。詳細については、Kubernetes のウェブサイトで「テイントと容認」を参照してください。

ノードでスケールダウンが無効になっていないことを確認する

ノードに対する scale-down-disable のステータスを確認するには、次のコマンドを実行します。

kubectl describe node example_nodename | grep scale-down-disable

注: example_nodename を実際のノード名に置き換えてください。

出力例:

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

scale-down-disabletrue に設定されている場合は、次のコマンドを実行してノードのアノテーションを削除し、スケールダウンできるようにします。

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

注: example_nodename を実際のノード名に置き換えてください。

Cluster Autoscaler のその他のトラブルシューティング手順については、GitHub のウェブサイトで「よくある質問」を参照してください。

AWS公式更新しました 5ヶ月前
コメントはありません

関連するコンテンツ