Amazon EKS で Cluster Autoscaler を使用してポッドをスケジュールする際の、トラブルシューティング方法を教えてください。
Amazon Elastic Kubernetes Service (Amazon EKS) で Cluster Autoscaler を使用すると、ポッドのスケジュールで問題が発生します。ポッドが Pending ステータスから移行せず、イベントのスケジュール失敗に関する通知が届きます。
解決策
Cluster Autoscaler が有効であり、ポッドが Pending ステータスから移行できない場合、Cluster Autoscaler は未スケジュールポッドに新規ノードを追加していない可能性があります。
ポッドの状態を確認する
ポッドの状態を確認するには、次の kubectl get pods コマンドを実行します。
kubectl get pods -n kube-system -l app=cluster-autoscaler
ポッドのステータスが Pending であるか、ポッドのコンテナステータスが Waiting である場合は、これらのポッドステータスをトラブルシューティングします。
ポッドのステータスが CrashLoopBackOff である場合は、次の kubectl describe pod コマンドを実行します。
kubectl describe pod cluster-autoscaler-####-#### -n kube-system
注: cluster-autoscaler-####-#### を実際の Cluster Autoscaler ポッドに置き換えてください。
コマンドの出力に "OOMKilled" および終了コード 137 が表示される場合は、cluster-autoscaler デプロイのメモリリソース制限およびリクエストを増やします。詳細については、Kubernetes のウェブサイトで「メモリリクエストとメモリ制限を指定する」を参照してください。
ポッドログを確認するには、次の kubectl logs コマンドを実行します。
kubectl logs -f -n kube-system -l app=cluster-autoscaler
ログからトラブルシューティング情報を取得できる可能性があります。たとえば、ポッドログには次のように "AccessDenied" エラーメッセージが表示される場合があります。
"Failed to create AWS Manager: AccessDenied: User: arn:aws:sts::444455556666:assumed-role/your-role is not authorized to perform: your-action because no identity-based policy allows the your-action action"
AWS Identity and Access Management (IAM) 権限の問題を解決するには、ポッドに適切な IAM ポリシーをアタッチします。詳細については、GitHub のウェブサイトで「IAM ポリシー」を参照してください。
または、ログに次のエラーメッセージが表示される場合もあります。
"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"
ネットワーク接続に問題がある場合は、ワーカーノードのサブネットに次の AWS サービスエンドポイントへのルートが設定されていることを確認します。
- ec2.region.amazonaws.com
- autoscaling.region.amazonaws.com
- sts.region.amazonaws.com
さらに、サブネットのネットワークアクセスコントロールリスト (ネットワーク ACL) またはワーカーノードのセキュリティグループより、上記エンドポイントへのトラフィックがブロックされないことを確認します。
プライベートクラスターでは、次の手順を実行します。
- 上記のエンドポイントを仮想プライベートクラウド (VPC) に追加します。
- エンドポイントのセキュリティグループ構成では、ワーカーノードのサブネットグループからのポート 443 でのトラフィックを許可します。
Cluster Autoscaler が Auto Scaling グループをスケールアウトできない原因を特定する
ポッドにアフィニティやアンチアフィニティなどのスケジューリングルールが含まれているかどうかを確認するには、次の kubectl describe pod コマンドを実行します。
kubectl describe pod pending-pod-name -n pending-pod-namespace
注: pending-pod-name を保留状態のポッド名に、pending-pod-namespace を保留中ポッドの名前空間名に置き換えてください。詳細については、Kubernetes のウェブサイトで「アフィニティとアンチアフィニティ」を参照してください。
コマンドの出力内の Events セクションを参照し、ポッドが Pending ステータスに留まっている原因を判断します。たとえば、ノードグループのラベルに関する問題を特定できる可能性があります。
ノードグループを機能させるには、次の手順を実行します。
- ポッドの nodeAffinity 仕様で設定された nodeSelector および requiredDuringSchedulingIgnoredDuringExecution と一致するラベルを使用し、ノードを構成します。詳細については、Kubernetes のウェブサイトで「ノードのステータス」を参照してください。ラベルを適切に使用すると、Cluster Autoscaler はスケーリング操作の対象となるノードを特定できます。
- ポッドスケジュールのルールが正しく定義されていることを確認します。詳細については、Kubernetes のウェブサイトで「ノードにポッドを割り当てる」を参照してください。ポッドに nodeSelector または requiredDuringSchedulingIgnoredDuringExecution が設定されている場合、Cluster Autoscaler は、設定のスケジュール要件に合致したノードグループのスケーリングのみを対象とします。
Cluster Autoscaler の構成を確認するには、次の kubectl get deployment コマンドを実行します。
kubectl get deployment cluster-autoscaler -n kube-system -o yaml
Cluster Autoscaler の引数 node-group-auto-discovery が適切な場合、コマンドの出力には次の構成が表示されます。
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/your-cluster-name
Auto Scaling グループに適切なタグが設定されているかどうか確認します。
Cluster Autoscaler がノードグループに関連付けられた Auto Scaling グループを検出するには、次のタグが必要です。
Tag 1: key: k8s.io/cluster-autoscaler/your-cluster-name value: owned Tag 2: key: k8s.io/cluster-autoscaler/enabled value: true
ノードグループがノード数の最大制限に達しているかどうかを判断するには、describe-nodegroup コマンドを実行します。
aws eks describe-nodegroup --cluster-name your-cluster-name --nodegroup-name your-nodegroup-name
注: your-cluster-name をクラスター名に、your-nodegroup-name ノードグループ名に置き換えてください。
ノードグループが最大ノード数に達している場合は、ノードグループを更新し、最大ノード数を増やします。その後、新しいノードは新しいポッドをスケジュールできるようになります。
Auto Scaling グループが起動した Amazon Elastic Compute Cloud (Amazon EC2) インスタンスがクラスターに参加できるかどうかを確認します。インスタンスがクラスターに参加できない場合は、ワーカーノードをトラブルシューティングします。
ポッドのリソースリクエストを確認するには、次の kubectl get pod コマンドを実行します。
kubectl get pod pending-pod-name -n pending-pod-namespace -o yaml | grep resources -A6
注: pending-pod-name を保留状態のポッド名に、pending-pod-namespace を保留中ポッドの名前空間名に置き換えてください。
現在のノードインスタンスタイプがポッドのリソースリクエストを満たしているかどうかを確認し、必要に応じてポッドのリソースリクエストを変更します。または、インスタンスタイプを変更して新しいノードグループを作成します。ポッドのリソースリクエストに関する詳細については、Kubernetes のウェブサイトで「ポッドとコンテナのリソース管理」を参照してください。
ノードのテイントを確認するには、次の kubectl describe node コマンドを実行します。
kubectl describe node your-node-name
注: your-node-name をノード名に置き換えてください。
ポッドが、ノードに追加したテイントを許容できることを確認するノードにテイントが必要ない場合は、ノードからテイントを削除します。詳細については、Kubernetes のウェブサイトで「テイントとトレレーションズ」を参照してください。
関連情報
よくある質問 (GitHub のウェブサイト)
- トピック
- Containers
- 言語
- 日本語
