AWS Fargate インスタンスで実行されている Amazon Elastic Kubernetes Service (Amazon EKS) ポッドが保留状態のままになっています。
簡単な説明
AWS Fargate を使用する Amazon EKS ポッドが保留中のままになるのはいくつかの理由が存在します。
- 特定のvCPU とメモリの組み合わせが使用できないため、容量エラーが発生しています。
- CoreDNS ポッドは Amazon Elastic Compute Cloud (Amazon EC2) のコンピューティングタイプにマッピングするデフォルトアノテーションを使用して作成されています。Fargate ノードでスケジュールするには、Amazon EC2 コンピューティングタイプを削除してください。
- ポッドは、作成時にどの Fargate プロファイルとも一致せず、fargate-schedulerにも割り当てられていません。作成時にポッドが一致しない場合、自動的に Fargate ノードには再スケジュールされません。これは、後で一致するプロファイルを作成した場合も当てはまります。この場合、ポッドは default-scheduler に割り当てられます。
- ポットが fargate-scheduler に割り当てられていても保留中のままである場合は、ポッドのトラブルシューティングがさらに必要になることがあります。
解決策
前提条件
- 名前空間を設定し、(オプションで) Kubernetes ラベルを指定して、 ポッドセレクターのラベルと一致させます。Fargate ワークフローは、両方の条件がポッドの仕様に一致する場合にのみ、ポッドを Fargate プロファイルと照合します。
- 1 つの Fargate プロファイル内で複数のポッドセレクターを指定した場合、 fargate-scheduler はいずれかのセレクターと一致するポッドをスケジュールします。
- ポッドの仕様が複数の Fargate プロファイルと一致する場合、ポッドはランダムな Fargate プロファイルに従ってスケジュールされます。これを回避するには、ポッド仕様内の eks.amazonaws.com/fargate-profile:fp_name というアノテーションを使用できます。fp_name を自分の Fargate プロファイル名に置き換えてください。
重要: 以下の手順は、AWS Fargate で起動したポッドにのみ適用されます。Amazon EC2 インスタンスで起動されたポッドの詳細については、「Amazon EKS のポッドステータスのトラブルシューティング方法を教えてください」をご参照ください。
ポッドのステータスを確認する
1.次のコマンドを実行してポッドの状態を確認します。
kubectl get pods -n <namespace>
2.ポッドに関する詳細なエラー情報を取得するには、次の describe コマンドを実行します。
kubectl describe pod YOUR\_POD\_NAME -n <namespace>
describe コマンドの出力を参照して、以下の解決策のどれが問題のトラブルシューティングに役立つかを評価してください。
キャパシティエラーの解決
ポッドの容量に問題がある場合、describe の出力は次のようになります。
「現在、Fargate のキャパシティを利用することができません。後ほどもう一度試すか、または別のアベイラビリティゾーンから再度お試しください」
これは、選択した vCPU とメモリの組み合わせに基づいて Fargate が計算能力をプロビジョニングできないことを意味します。
このエラーを解決するには、次の手順を実行します。
- 20 分後にポッドの作成を再試行します。エラーは容量に基づいているため、正確な時間は異なる場合があります。
- ポッド仕様内のリクエスト (CPU とメモリ) を変更します。ポッドの仕様については、Kubernetes のWeb サイトの「 Kubernetes がリソースリクエストと制限を適用する方法」をご参照ください。次に、Fargate ワークフローは vCPU とメモリの新しい組み合わせをプロビジョニングします。
**注:**請求は、いずれかの組み合わせに基づいて行われます。ポッドの仕様に基づいて組み合わせを完了する方法の詳細については、「ポッド CPU とメモリ」をご参照ください。ターミナルまたは統合開発環境 (IDE) から kubectl describe node コマンドを実行すると、vCPU とメモリの組み合わせ値が大幅に高くなる可能性があります。Fargate は、ユーザーのリクエストに基づいて常に利用可能なキャパシティを確保しているわけではなく、ベストエフォートベースでキャパシティプールからリソースをプロビジョニングします。ただし、課金されるのはポッドの使用量と、同等の vCPU とメモリの組み合わせに対してのみです。
保留状態の CoreDNS ポッドの解決
CoreDNS ポッドが保留中のとき、次のメッセージのような出力が表示されます。
kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-6548845887-qk9vf 0/1 Pending 0 157m
これは、CoreDNS デプロイメントに eks.amazonaws.com/compute-type : ec2 というデフォルトアノテーションが付いていることが原因と考えられます。
これを解決してポッドを Fargate スケジューラーに再割り当てするには、「CoreDNS の更新」をご参照ください。
fargate-scheduler に割り当てられたポッドのトラブルシューティング
fargate-scheduler に割り当てられたポッドが保留中で停止する理由は複数あります。ポッドが 保留中のままの場合、describe の出力は次のメッセージのようになります。
Events:
Type Reason Age From
---- ------ ---- ----
Warning FailedScheduling 2m25s (x301 over 5h3m) fargate-scheduler
このエラーを解決するには、次の手順を実行してください。
- ポッドを削除して再作成します。
- ポッド仕様のYAMLに次の仕様が設定されていないかどうかをご確認ください。これらの仕様により、fargate-scheduler はポッドをスキップします。
ノードセレクター
<>ノード名
スケジューラー名
- Fargate プロファイルで選択したサブネットに、新しいポッドを作成するのに十分な空き IP アドレスがあるかをご確認ください。各 Fargate ノードは、サブネットから 1 つの IP アドレスを消費します。
- NAT ゲートウェイがパブリックサブネットに設定され、Elastic IP アドレスがアタッチされているかを確認します。
- 仮想プライベートクラウド (VPC) に関連付けられている DHCP オプションセットに Amazon ProvidedDNS またはドメインネームサーバー用の有効な DNS サーバーホスト名があることを確認します。
- VPC の DNS ホスト名と DNS 解決が有効になっているかどうかを確認します。
- Fargate ポッドが VPC エンドポイントのみがサービス通信用に設定されたプライベートサブネットを使用している場合は、これらのエンドポイントに DNS 名を許可する必要があります。
**ECR-API **
ECR - DKR
S3 ゲートウェイエンドポイント
- VPC エンドポイントにアタッチされているセキュリティグループが Fargate と API サーバー間の通信を許可しているかを確認します。VPC エンドポイントセキュリティグループは、クラスター VPC CIDR からのポート 443 進入を許可する必要があります。また、クラスターのプライベートエンドポイントアクセスを有効にする必要があります。
デフォルトスケジューラーに割り当てられたポッドの解決
ポッドが割り当てられているスケジューラーを確認するには、次のコマンドを実行します。
kubectl get pods -o yaml -n <namespace> <pod-name> | grep schedulerName.
出力で、SchedulerName が、fargate-schedulerであるかを確認します。default-scheduler としてリストされている場合、 fargate-scheduler はこのポッドをスキップしたことになります。この問題をトラブルシューティングするには、ポッド構成でコンピュートタイプのアノテーションを確認してください。詳細については、「AWS Fargate の考慮事項」をご参照ください。