Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
Amazon EKS のマネージドノードグループの更新に関する問題をトラブルシューティングするにはどうすればよいですか?
Amazon Elastic Kubernetes Service (Amazon EKS) のマネージドノードグループを更新しようとしていますが、問題が発生しています。
簡単な説明
Amazon EKS マネージドノードグループを更新する際、次のいずれかのエラーが発生する可能性があります。
- "PodEvictionFailure Reached max retries while trying to evict pods from nodes in node group nodegroup-1234"
- "Error: Nodegroup health has issues other than AsgInstanceLaunchFailures, InstanceLimitExceeded, InsufficientFreeAddresses, ClusterUnreachable"
- "Error: InvalidParameterException: Launch template details can't be null for Custom ami type node group"
または、
"An error occurred (InvalidParameterException) when calling the UpdateNodegroupVersion operation: You cannot specify the field kubernetesVersion when using custom AMIs"
- "UPDATE_FAILED Resource handler returned message: Requested release version 1.xx is not valid for kubernetes version 1.yy"
解決策
Amazon EKS マネージドノードグループの更新エラーを解決するには、以下のトラブルシューティング手順に従ってください。
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、最新バージョンの AWS CLI を使用していることを確認してください。
ノードグループ nodegroup-1234 のノードからポッドを排除しようとする際に、PodEvictionFailure がポッド排除の最大リトライ回数に達しました
PODevictionFailure エラーは、アップグレードでノードからすべてのポッドをドレインできない場合に発生します。ポッドの停止状態の予算 (PDB) が原因でポッドがノードからドレインされない場合、これが問題の原因となる可能性があります。たとえば、アプリケーションに PDB (PodDisruptionBudget) の設定が 2 つある場合、そのアプリケーションに対して少なくとも 2 つのポッドが実行されている必要があります。
アプリケーションが PDB を使用しているかどうかを確認するには、次の kubectl コマンドを実行します。
$ kubectl get pdb —all-namespaces
PDB を使用している場合は、次のいずれかのアクションを実行します。
- Amazon Elastic Compute Cloud (Amazon EC2) ノードで使用できる IP アドレスの数を増やして、 ポッドの数を増やします。
- PDB を一時的に削除します。
- 強制更新オプションを使用します。
強制更新オプションでは、PDB は認識されません。ノードを強制的に再起動することで、PDB の問題に関係なく更新が行われます。
注: Kubernetes コントローラーからのポッドがノードに均等に分散されていない場合、このオプションはアプリケーションのダウンタイムを引き起こす可能性があります。
強制オプションを指定するには、次の例を参考に AWS CLI コマンドを実行します。
$ aws eks update-nodegroup-version --cluster-name cluster-123 --nodegroup-name nodegroup-1234 --force
または、
次の eksctl コマンドを実行します。
$ eksctl upgrade nodegroup --cluster OneCluster --name managed-ng --force-upgrade
CloudWatch Logs Insights を使用して PodDisruptionBudget のエビクション失敗をトラブルシューティングする
Amazon CloudWatch Logs Insights を使用して、Amazon EKS コントロールプレーンのログデータを検索できます。詳細については、「 CloudWatch Logs Insights を使用したログデータの分析」を参照してください。
重要: CloudWatch Logs は、クラスターでコントロールプレーンの記録を有効化した後のログイベントのみを表示できます。CloudWatch Logs Insights でクエリを実行するための時間範囲を選択する前に、コントロールプレーンのロギングがオンになっていることを確認してください。詳細については、「CloudWatch Logs から Amazon EKS コントロールプレーンのログを取得する方法を教えてください」を参照してください。
エビクションに失敗したポッドとその失敗回数を特定するには、次のようなクエリを実行します。
fields @timestamp, @message | stats count(*) as count by objectRef.name | filter @logStream like /audit/ | filter user.username == "eks:node-manager" and requestURI like "eviction" and requestURI like "pod" and responseStatus.code > 400 | sort count desc
エビクションポッドの最大リトライ回数は 20 回です。表示されるポッドのカウントが 20 回以上の場合、そのポッドがエビクションに失敗したポッドになります。
前述のポッドのエビクションを妨げているポッドの停止状態の予算名を特定するには、次のクエリを実行します。
filter @logStream like /^kube-apiserver-audit/ | fields @logStream, @timestamp, @message | sort @timestamp desc | filter user.username == "eks:node-manager" and requestURI like "eviction" and requestURI like "pod_name" and responseStatus.code > 400 | limit 999 | display responseObject.details.causes.0.message,objectRef.name,objectRef.namespace,objectRef.resource
注: pod_name をご自身のポッド名に置き換えてください。
出力には次のようなメッセージが表示されます。ここで、pod_distruption_budget はエビクション失敗の原因となっているオブジェクトです。
The disruption budget pod_distruption_budget needs 1 healthy pods and has 1 currently
エラー: ノードグループのヘルスには、AsgInstanceLaunchFailures、InstanceLimitExceeded、InsufficientFreeAddresses、ClusterUnreachable 以外の問題があります
このエラーメッセージが表示される場合は、管理されたノードグループの詳細を確認し、ヘルスの問題を特定してください。詳細な情報とトラブルシューティングについては、マネージドノードグループのエラー と Amazon EKS の問題 API リファレンスを確認してください。
エラー: InvalidParameterException: Launch template details can't be null for Custom ami type node group
または、
An error occurred (InvalidParameterException) when calling the UpdateNodegroupVersion operation: カスタム AMI を使用する場合、kubernetesVersion フィールドを指定することはできません。
カスタム AMI を使用するマネージドノードグループの場合、アップグレード先の Kubernetes バージョンで新しい AMI バージョンを作成する必要があります。アップグレード中に、起動テンプレートとバージョンを指定します。
AWS CLI を使用している場合は、--launch-template フラグを指定します。eksctl では、--launch-template-version フラグを指定します。
注: これらのコマンドで --kubernetes-version フラグを指定しないでください。
UPDATE_FAILED Resource handler returned message: "Requested release version 1.xx is not valid for kubernetes version 1.yy"
UpdateStack API コールを実行し、同じ AWS CloudFormation スタックの Amazon EKS クラスターを含むマネージドノードグループを更新しようとした場合、このエラーが発生します。
CloudFormation はスタックをロールバックしようとしますが、Amazon EKS クラスターは正常にアップグレードされ、元に戻すことができないため失敗します。Amazon EKS クラスターは 1.xx と 1.yy を一致させることはできません (たとえば、1.21 と 1.22)。
問題の修正方法の詳細については、CloudFormation スタック内のノードグループで発生した最初のエラーを確認してください。次に、CloudFormation スタックを再度更新します。
詳細については、「 マネージドノードの更新動作」を参照してください。
関連情報
Amazon EKS マネージドノードグループを作成できない場合のトラブルシューティング方法を教えてください
- トピック
- Containers
- 言語
- 日本語
