Ongoing service disruptions
For the most recent update on ongoing service disruptions affecting the AWS Middle East (UAE) Region (ME-CENTRAL-1), refer to the AWS Health Dashboard. For information on AWS Service migration, see How do I migrate my services to another region?
Amazon EKS クラスターで Cluster Autoscaler を設定する際の問題をトラブルシューティングする方法を教えてください。
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」状態のトラブルシューティングを行うには、次の手順を実行してください。
-
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 -
ポッドが「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 ... -
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 Elastic Compute Cloud (Amazon EC2): ec2.amazonaws.com
- Amazon EC2 Auto Scaling: autoscaling.region.amazonaws.com
- AWS Security Token Service (AWS STS): sts.region.amazonaws.com
注: region を実際のリージョンに置き換えてください。
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 および nodeAffinity の requiredDuringSchedulingIgnoredDuringExecution を考慮します。ノードグループには、これらの値を含むラベルが必要です。ノードグループにラベルを付けるには、次のコマンドを実行します。
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 に次の値を設定します。
- key に k8s.io/cluster-autoscaler/example-cluster を入力します。
- value に owned を入力します。
注: example-cluster を実際のクラスター名に置き換えてください。
タグ 2 に次の値を設定します。
- key に k8s.io/cluster-autoscaler/enabled を入力します。
- value に true を入力します。
デプロイマニフェストの設定を確認する
デプロイマニフェストを開くには、次のコマンドを実行します。
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 値を確認します。cpu と memory の値がポッドを維持するのに十分であることを確認してください。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-disable が true に設定されている場合は、次のコマンドを実行してノードのアノテーションを削除し、スケールダウンできるようにします。
kubectl annotate node example_nodename cluster-autoscaler.kubernetes.io/scale-down-disabled-
注: example_nodename を実際のノード名に置き換えてください。
Cluster Autoscaler のその他のトラブルシューティング手順については、GitHub のウェブサイトで「よくある質問」を参照してください。
- トピック
- Containers
- 言語
- 日本語
