New user sign up using AWS Builder ID
New user sign up using AWS Builder ID is currently unavailable on re:Post. To sign up, please use the AWS Management Console instead.
Amazon EKS のマネージドノードグループの更新に関する問題をトラブルシューティングするにはどうすればよいですか?
Amazon Elastic Kubernetes Service (Amazon EKS) のマネージドノードグループを更新しようとしていますが、問題が発生しています。
簡単な説明
Amazon EKS マネージドノードグループを更新すると、次のいずれかのエラーが表示されることがあります。
- 「ノードグループ nodegroup-1234 のノードからポッドを排除しようとする際に、PodEvictionFailure がポッド排除の最大リトライ回数に達しました」
- 「エラー: ノードグループのヘルスには、AsgInstanceLaunchFailures、InstanceLimitExceeded、InsufficientFreeAddresses、ClusterUnreachable 以外の問題があります」
- 「エラー: InvalidParameterException: カスタム AM I タイプのノードグループに対して、起動テンプレートの詳細を null にすることはできません」
-または-
「UpdateNodeGroupVersion オペレーションを呼び出すときにエラーが発生しました (InvalidParameterException): カスタム AMI を使用する場合は、kubernetesVersion フィールドを指定することはできません。」
- 「UPDATE_FAILED: リソースハンドラーがメッセージを返しました: リクエストされたリリースバージョン 1.xx は、kubernetes バージョン 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 EK Sコントロールプレーンログを取得するにはどうすればよいですか?」を参照してください。
エビクションに失敗したポッドとその失敗回数を特定するには、次のようなクエリを実行します。
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: カスタム AMI タイプのノードグループには、起動 テンプレートの詳細を null にすることはできません
-または-
UpdateNodeGroupVersion オペレーションを呼び出すときにエラーが発生しました (InvalidParameterException): カスタム AMI を使用する場合、kubernetesVersion フィールドを指定することはできません。
カスタム AMI を使用するマネージドノードグループの場合、アップグレード先の Kubernetes バージョンで新しい AMI バージョンを作成する必要があります。アップグレード中に、起動テンプレートとバージョンを指定します。
AWS CLI を使用している場合は、--launch-templateフラグを使用します。eksctlでは、--launch-template-versionフラグを使用します。
注: これらのコマンドで --kubernetes-version フラグを使用しないでください。
UPDATE_FAILED リソースハンドラーが返したメッセージ: 「リクエストされたリリースバージョン 1.xx は kubernetes バージョン 1.yy では無効です」
このエラーは、UpdateStack API 呼び出しを使用して、 Amazon EKS クラスターを含むマネージドノードグループを、同じ AWS CloudFormation スタックからアップグレードする場合に発生します。
CloudFormation はスタックをロールバックしようとしますが、Amazon EKS クラスターは正常にアップグレードされ、元に戻すことができないため失敗します。Amazon EKS クラスターは 1.xx と 1.yy を一致させることはできません (たとえば、1.21 と 1.22)。
問題の修正方法の詳細については、CloudFormation スタック内のノードグループで発生した最初のエラーを確認してください。次に、CloudFormation スタックを再度更新します。
詳細については、「 マネージドノードの更新動作」を参照してください。
関連情報
Amazon EKS マネージドノードグループ作成の失敗をトラブルシューティングするにはどうすればよいですか?

関連するコンテンツ
- 質問済み 1ヶ月前lg...
- 質問済み 10ヶ月前lg...
- 質問済み 6ヶ月前lg...
- AWS公式更新しました 1年前
- AWS公式更新しました 2年前
- AWS公式更新しました 8ヶ月前