PDB による削除エラーによる UpgradeFailed エラーのトラブルシューティング
この記事では、Azure Kubernetes Service (AKS) クラスターをアップグレードしようとしたときに発生するポッド中断予算 (PDB) による削除エラーによる UpgradeFailed エラーを特定して解決する方法について説明します。
前提条件
この記事では、Azure CLI バージョン 2.67.0 以降のバージョンが必要です。 バージョン番号を見つけるには、 az --version
を実行します。 Azure CLI をインストールまたはアップグレードする必要がある場合は、「 Azure CLI のインストール方法を参照してください。
アップグレード プロセスの詳細については、「 Azure Kubernetes Service (AKS) クラスターをアップグレードする」の「AKS クラスターのアップグレード」セクションを参照してください。
現象
AKS クラスターのアップグレード操作が失敗し、次のいずれかのエラー メッセージが表示されます。
-
(UpgradeFailed)ポッド
<pod-name>
削除が失敗し、要求数が多すぎるエラーが発生した場合、ドレインnode aks-<nodepool-name>-xxxxxxxx-vmssxxxxxx
が失敗しました。 これは、多くの場合、制限の厳しいポッド中断予算 (PDB) ポリシーが原因で発生します。 以下を参照してください。https://aka.ms/aks/debugdrainfailures 元のエラー: ポッドの中断予算に違反する可能性があるため、ポッドを削除できません。. PDB デバッグ情報:<namespace>/<pod-name>
0 個の未読ポッドを含む pdb<pdb-name>
によってブロックされます。 -
コード: UpgradeFailed
メッセージ: ポッド<pod-name>
削除が失敗し、[要求数が多すぎます] エラーが発生したときに、ドレイン ノードaks-<nodepool-name>-xxxxxxxx-vmssxxxxxx
が失敗しました。 これは、多くの場合、制限の厳しいポッド中断予算 (PDB) ポリシーが原因で発生します。 以下を参照してください。https://aka.ms/aks/debugdrainfailures 元のエラー: ポッドの中断予算に違反する可能性があるため、ポッドを削除できません。. PDB デバッグ情報:<namespace>/<pod-name>
0 個の未読ポッドを含む pdb<pdb-name>
によってブロックされます。
原因
このエラーは、ポッドがポッド中断予算 (PDB) ポリシーによって保護されている場合に発生する可能性があります。 この状況では、ポッドはドレインに抵抗し、数回試行するとアップグレード操作が失敗し、クラスター/ノード プールが Failed
状態になります。
PDB の構成 ( ALLOWED DISRUPTIONS
値) を確認します。 値は 1
以上にする必要があります。 詳細については、「 ポッド中断予算を使用した可用性の計画を参照してください。 たとえば、ワークロードとその PDB を次のように確認できます。
ALLOWED DISRUPTIONS
列で中断が許可されないのを確認する必要があります。
ALLOWED DISRUPTIONS
値が0
されている場合、ポッドは削除されず、アップグレード プロセス中にノードのドレインが失敗します。
$ kubectl get deployments.apps nginx
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 2/2 2 2 62s
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-7854ff8877-gbr4m 1/1 Running 0 68s
nginx-7854ff8877-gnltd 1/1 Running 0 68s
$ kubectl get pdb
NAME MIN AVAILABLE MAX UNAVAILABLE ALLOWED DISRUPTIONS AGE
nginx-pdb 2 N/A 0 24s
コマンド kubectl get events | grep -i drain
を使用して、Kubernetes イベント内のエントリを確認することもできます。 同様の出力は、"要求が多すぎる (通常は pdb) によってブロックされた削除" というメッセージを示しています。
$ kubectl get events | grep -i drain
LAST SEEN TYPE REASON OBJECT MESSAGE
(...)
32m Normal Drain node/aks-<nodepool-name>-xxxxxxxx-vmssxxxxxx Draining node: aks-<nodepool-name>-xxxxxxxx-vmssxxxxxx
2m57s Warning Drain node/aks-<nodepool-name>-xxxxxxxx-vmssxxxxxx Eviction blocked by Too Many Requests (usually a pdb): <pod-name>
12m Warning Drain node/aks-<nodepool-name>-xxxxxxxx-vmssxxxxxx Eviction blocked by Too Many Requests (usually a pdb): <pod-name>
32m Warning Drain node/aks-<nodepool-name>-xxxxxxxx-vmssxxxxxx Eviction blocked by Too Many Requests (usually a pdb): <pod-name>
32m Warning Drain node/aks-<nodepool-name>-xxxxxxxx-vmssxxxxxx Eviction blocked by Too Many Requests (usually a pdb): <pod-name>
31m Warning Drain node/aks-<nodepool-name>-xxxxxxxx-vmssxxxxxx Eviction blocked by Too Many Requests (usually a pdb): <pod-name>
この問題を解決するには、次の解決策のいずれかを使用します。
解決策 1: ポッドのドレインを有効にする
PDB を調整してポッドのドレインを有効にします。 一般に、許可される中断は、
Min Available / Max unavailable
またはRunning pods / Replicas
パラメーターによって制御されます。 PDB レベルでMin Available / Max unavailable
パラメーターを変更するか、Running pods / Replicas
の数を増やして、[許可された中断] 値を 1 以上にプッシュできます。AKS クラスターを以前にアップグレードしようとしたのと同じバージョンにアップグレードし直してください。 このプロセスによって調整がトリガーされます。
$ az aks upgrade --name <aksName> --resource-group <resourceGroupName> Are you sure you want to perform this operation? (y/N): y Cluster currently in failed state. Proceeding with upgrade to existing version 1.28.3 to attempt resolution of failed cluster state. Since control-plane-only argument is not specified, this will upgrade the control plane AND all nodepools to version . Continue? (y/N): y
解決策 2: PDB のバックアップ、削除、再デプロイ
コマンド
kubectl get pdb <pdb-name> -n <pdb-namespace> -o yaml > pdb-name-backup.yaml
を使用して PDB のバックアップを作成し、コマンドkubectl delete pdb <pdb-name> -n <pdb-namespace>
を使用して PDB を削除します。 新しいアップグレードの試行が完了したら、コマンドkubectl apply -f pdb-name-backup.yaml
を使用して、バックアップ ファイルを適用するだけで PDB を再デプロイできます。AKS クラスターを以前にアップグレードしようとしたのと同じバージョンにアップグレードし直してください。 このプロセスによって調整がトリガーされます。
$ az aks upgrade --name <aksName> --resource-group <resourceGroupName> Are you sure you want to perform this operation? (y/N): y Cluster currently in failed state. Proceeding with upgrade to existing version 1.28.3 to attempt resolution of failed cluster state. Since control-plane-only argument is not specified, this will upgrade the control plane AND all nodepools to version . Continue? (y/N): y
解決策 3: ドレインできないポッドを削除するか、ワークロードをゼロにスケールダウンする (0)
ドレインできないポッドを削除します。
注:
ポッドが Deployment または StatefulSet によって作成された場合は、ReplicaSet によって制御されます。 その場合は、Deployment または StatefulSet の 0 (0) にワークロード レプリカを削除またはスケーリングする必要がある場合があります。 その前に、バックアップ (
kubectl get <deployment.apps -or- statefulset.apps> <name> -n <namespace> -o yaml > backup.yaml
) を作成することをお勧めします。スケールダウンするには、調整の前に
kubectl scale --replicas=0 <deployment.apps -or- statefulset.apps> <name> -n <namespace>
を使用できます。AKS クラスターを以前にアップグレードしようとしたのと同じバージョンにアップグレードし直してください。 このプロセスによって調整がトリガーされます。
$ az aks upgrade --name <aksName> --resource-group <resourceGroupName> Are you sure you want to perform this operation? (y/N): y Cluster currently in failed state. Proceeding with upgrade to existing version 1.28.3 to attempt resolution of failed cluster state. Since control-plane-only argument is not specified, this will upgrade the control plane AND all nodepools to version . Continue? (y/N): y
お問い合わせはこちらから
質問がある場合やヘルプが必要な場合は、サポート要求を作成するか、Azure コミュニティ サポートにお問い合わせください。 Azure フィードバック コミュニティに製品フィードバックを送信することもできます。