Amazon EKS クラスターで Cluster Autoscaler をセットアップするときの問題をトラブルシューティングする方法を教えてください。

所要時間4分
0

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

簡単な説明

開始する前に、次の点を確認してください。

  • eksctl の最新バージョンをインストールまたは更新した。
  • コードスニペットのプレースホルダー値を自分の値に置き換えた。

注: AWS リージョンのデフォルト値が使用されるため、--region 変数がコマンドで常に使用されるとは限りません。デフォルト値を確認するには、AWS コマンドラインインターフェイス (AWS CLI) 構成コマンドを実行します。AWS リージョンを変更する必要がある場合は、--region フラグを使用します。

注: AWS CLI コマンドの実行中にエラーが発生した場合は、AWS CLI の最新バージョンが実行されていることを確認してください

解決方法

Cluster Autoscaler ポッドのステータスが CrashLoopBackOff です

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

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

以下は、ステータスが CrashLoopBackOff である Cluster Autoscaler ポッドの例です。

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

次のコマンドを実行して、Cluster Autoscaler ポッドのログを表示します。

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 ID プロバイダーを作成します。

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 ポッドを再起動します。

ログにネットワークの問題 (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.    サブネットネットワークアクセスコントロールリスト (ネットワーク ACL) またはワーカーノードのセキュリティグループが、これらのエンドポイントへの通信トラフィックをブロックしていないことを確認します。

3.    Amazon EKS クラスターがプライベートの場合は、関連する Amazon 仮想プライベートクラウド (VPC) エンドポイントの設定を確認します。例えば、Amazon EC2、AWS Auto Scaling、AWS STS などです。

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

Cluster Autoscaler がノードをスケールインまたはスケールアウトしない

Cluster Autoscaler がノードをスケールインまたはスケールアウトしない場合は、以下を確認します。

  • Cluster Autoscaler ポッドのログを確認します。
  • Cluster Autoscaler の Auto Scaling グループのタグ付けを確認します。
  • デプロイマニフェストの構成を確認します。
  • 現在のノード数を確認します。
  • ポッドリソースリクエストを確認します。
  • ノードグループ内のノードのテイント構成を確認します。
  • ノードに scale-down-disable という注釈が付いているか確認します。

Cluster Autoscaler ポッドのログを確認する

ポッドログを表示して、Cluster Autoscaler がノードをスケールインまたはスケールアウトしない理由を特定するには、次のコマンドを実行します。

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

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

kubectl describe pod <example_podname> -n <example_namespace>

出力のイベントセクションを確認します。このセクションには、ポッドのステータスが保留になっている理由に関する情報が表示されます。

注: Cluster Autoscaler は nodeAffinitynodeSelectorrequiredDuringSchedulingIgnoredDuringExecution を尊重し、それに応じてユーザーがノードグループをラベル付けしたことを前提としています。nodeSelector、または requiredDuringSchedulingIgnoredDuringExecution でポッドをスケジュールできない場合、Cluster Autoscaler はこれらの要件を満たすノードグループのみを拡張対象とみなします。ポッドがノードでスケジュールされるように、ポッドまたはノードで定義されているスケジューリングルールを適宜変更します。

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

Cluster Autoscaler が Auto Scaling グループを検出するには、ノードグループが対応する 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>

最小値または最大値に達した場合は、新しいワークロード要件に合わせて値を変更します。

ポッドリソースリクエストを確認する

ポッドリソースリクエストが現在のノードインスタンスタイプで満たされないかどうかを確認するには、次のコマンドを実行します。

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

リソースリクエストを満たすには、ポッドリソースリクエストを変更するか、新しいノードグループを作成します。新しいノードグループを作成する場合は、ノードのインスタンスタイプがポッドのリソース要件を満たしていることを確認してください。

ノードグループ内のノードのテイント構成をチェックする

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

kubectl describe node <example_nodename> | grep taint -A2

テイントが構成されている場合は、ノードで定義されているテイントを削除します。ポッドがテイントを許容できない場合は、ポッドに許容範囲を定義して、ポッドがテイントのあるノードでスケジュールできるようにします。

ノードに scale-down-disable の注釈が付いているか確認する

ノードに scale-down-disable という注釈が付いていることを確認するには、次のコマンドを実行します。

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

期待される結果は次のとおりです。

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

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

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

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


AWS公式
AWS公式更新しました 2年前
コメントはありません

関連するコンテンツ