ローリング アップグレード戦略では、ノードを一度に 1 つずつ (または一度に数個) アップグレードし、ワークロードの中断を最小限に抑えながら、アップグレード プロセス全体でノード プールを引き続き使用できるようにします。 この記事では、サージ設定、ドレイン タイムアウト、ソーク時間など、AKS ノード プールのローリング アップグレードを構成する方法について説明します。
開始する前に
- コントロール プレーンがターゲットの Kubernetes バージョンに既にアップグレードされていることを確認します。 ノード プールをコントロール プレーンより高いバージョンにアップグレードすることはできません。 詳細については、「 AKS クラスター コントロール プレーンのアップグレード」を参照してください。
- Azure CLI を使っている場合、この記事では Azure CLI バージョン 2.34.1 以降が必要です。
az --versionコマンドを使用してバージョンを検索します。 インストールまたはアップグレードする必要がある場合は、[Azure CLI のインストール][azure-cli-install] を参照してください。 - AKS ノード プールのローリング アップグレードを構成するには、
Microsoft.ContainerService/managedClusters/agentPools/writeRBAC ロールのアクセス許可が必要です。
ローリング アップグレードプロセスの概要
ローリング アップグレード中、AKS はノード プール内の各ノードに対して次の操作を実行します。
-
サージ ノードの追加: アップグレード中に容量を維持するために、最大サージ (
--max-surge) 設定に基づいて新しいバッファー ノードを追加します。 - ノードのコーディングとドレイン: 実行中のアプリケーションへの影響を最小限に抑えるために、古いノードを一度に1つずつ コーディングおよびドレイン します。 最大サージを使用している場合は、指定されたバッファー ノードの数と同じ数のノードが切断され、ドレインされます。
- ソーク時間を待機 します (省略可能): アップグレードを続行する前に、構成された ソーク期間 を待ってから、新しいノードでワークロードを安定させます。
- 古いノードの再イメージ化: 古いノードがドレインされると、新しいバージョンを受け取るために再イメージ化されます。 再イメージ化されたノードは、アップグレードする次のノード セットのバッファー ノードになります。
- 繰り返し: プロセスは、ノード プール内のすべてのノードがアップグレードされるまで繰り返されます。
- サージ ノードの削除: すべてのノードがアップグレードされると、残りのバッファー ノードはすべて削除され、元のノード プールのサイズとバランスが維持されます。
ローリングアップグレードの設定を構成する
ノードサージをカスタマイズする
Important
- ノード サージには、アップグレード操作ごとに、要求された最大サージ カウントに対するサブスクリプション クォータが必要です。 たとえば、クラスターに 5 つのノード プールがあり、そのそれぞれに 4 つのノードが含まれる場合、合計で 20 個のノードがあります。 各ノード プールの最大サージ値が 50%の場合、アップグレードを完了するには、10 ノード (2 つの ノード× 5 つの プール) の追加のコンピューティングと IP クォータが必要です。
- ノード プールの最大サージ設定は永続的です。 以降の Kubernetes アップグレードまたはノード バージョンのアップグレードでは、この設定が使用されます。 ノード プールの最大サージ値はいつでも変更できます。 運用ノード プールの場合は、最大サージ設定として 33%をお勧めします。
- Azure CNI を使用している場合は、Azure CNI の IP 要件を満たすだけの使用可能な IP がサブネット内にあることを検証します。
AKS は、既定で、1 つの追加ノードを使ってサージするようにアップグレードを構成します。 最大サージ設定の既定値 1 を使用すると、AKS は、古いバージョン管理されたノードを置き換えるために、既存のアプリケーションのコードオン/ドレインの前に追加のノードを作成することで、ワークロードの中断を最小限に抑えることができます。 ノード プールあたりの最大サージ値をカスタマイズできます。 最大サージ値を増やすと、アップグレード プロセスは迅速に完了しますが、アップグレード プロセス中により多くの中断が発生する可能性があります。
たとえば、 100% の最大サージ値は、可能な限り最速のアップグレード プロセスを提供しますが、ノード プール内のすべてのノードが同時にドレインされます。 テスト環境では、次のようなより高い値を使用できます。 運用ノード プールの場合は、 33%の最大サージ設定をお勧めします。
AKS では、最大サージに対して整数値とパーセント値の両方を受け入れます。 例えば次が挙げられます。
| 値の型 | Example | Description |
|---|---|---|
| 整数 | 5 |
サージする 5 つの追加ノード |
| 百分率 | 50% |
プール内の現在のノード数の半分のサージ値 |
最大サージ率の値には、最小 1% と最大 100%を指定できます。 パーセント値は、最も近いノード数に切り上げられます。 最大サージ値が、アップグレードが必要なノードの数より大きい場合、アップグレードするノードの数が最大サージ値に使用されます。
最大サージ値を設定する
az aks nodepool addまたは az aks nodepool update コマンドと --max-surge パラメーターを使用して、新規または既存のノード プールの最大サージ値を設定します。 例えば次が挙げられます。
# Set max surge for a new node pool
az aks nodepool add \
--name <node-pool-name> \
--resource-group <resource-group-name> \
--cluster-name <cluster-name> \
--max-surge 33%
# Update max surge for an existing node pool
az aks nodepool update \
--name <node-pool-name> \
--resource-group <resource-group-name> \
--cluster-name <cluster-name> \
--max-surge 5
使用できないノードをカスタマイズする
Important
- 最大使用できない値を設定するには、最大サージを
0に設定する必要があります。 2 つの値を同時にアクティブにすることはできません。 - Max unavailable では、アップグレード プロセス中にサージ ノードは作成されません。 代わりに、AKS は n 個のノード (使用できない最大値) を一度にコードンし、エージェントプール内の他のノードにポッドを退避します。 ポッドをスケジュールできない場合は、ワークロードの中断が発生する可能性があります。
- ポッドをスケジュールするリソースが少ないため、ポッド中断予算 (PDB) が不満足であるため、最大利用不可の場合、エラーが増える可能性があります。 詳細については、「ポッド中断予算のトラブルシューティング」を参照してください。
- システム ノード プールで最大使用不可を設定することはできません。
AKS では、サージ ノードを使用しないようにアップグレードを構成し、そのノードを所定の場所にアップグレードすることもできます。 使用できない最大値は、既存のノード プール ノードから同時に切断およびドレインできるノードの数を決定します。
AKS は、整数値と最大使用不可のパーセンテージ値の両方を受け入れます。 例えば次が挙げられます。
| 値の型 | Example | Description |
|---|---|---|
| 整数 | 5 |
5 つのノードが既存のノードから切断されている |
| 百分率 | 50% |
プール内の現在のノード数の半分は使用できなくなります |
使用できない割合の最大値は、最小 1% と最大 100%にすることができます。 パーセント値は、最も近いノード数に切り上げられます。
使用できない最大値を設定する
az aks nodepool add パラメーターを指定して、az aks nodepool update、az aks nodepool upgrade、または --max-unavailable コマンドを使用して、新規または既存のノード プールで使用できない最大値を設定します。 例えば次が挙げられます。
# Set max unavailable for a new node pool
az aks nodepool add \
--name <node-pool-name> \
--resource-group <resource-group-name> \
--cluster-name <cluster-name> \
--max-surge 0 \
--max-unavailable 5
# Update max unavailable for an existing node pool
az aks nodepool update \
--name <node-pool-name> \
--resource-group <resource-group-name> \
--cluster-name <cluster-name> \
--max-surge 0 \
--max-unavailable 5
# Set max unavailable at upgrade time
az aks nodepool upgrade \
--name <node-pool-name> \
--resource-group <resource-group-name> \
--cluster-name <cluster-name> \
--max-surge 0 \
--max-unavailable 5
ノードドレインタイムアウトをカスタマイズする
特定のポッドで実行時間の長いワークロードがあり、実行時に別のノードに再スケジュールできない場合があります。 たとえば、実行を完了する必要があるメモリ集中型ステートフル ワークロードなどです。 このような場合は、AKS がアップグレード ワークフローで考慮するノード ドレイン タイムアウトを構成できます。
既定のノード ドレイン タイムアウト値は 30 分です。 ノードドレインタイムアウト値は、最低 5 分、最大 24 時間にすることができます。
ドレイン タイムアウト値が経過してもポッドが実行されている場合、アップグレード操作は中断します。 後続の PUT 操作では、停止したアップグレードが再開されます。
ヒント
実行時間の長いポッドの場合は、ポッド スペックで terminationGracePeriodSeconds も構成する必要があります。
ノード ドレイン タイムアウト値を設定する
az aks nodepool add パラメーターを指定した az aks nodepool update または --drain-time-out コマンドを使用して、新規または既存のノード プールのノード ドレイン タイムアウト (分単位) を設定します。
# Set drain timeout for a new node pool
az aks nodepool add \
--name <node-pool-name> \
--resource-group <resource-group-name> \
--cluster-name <cluster-name> \
--drain-time-out 100
# Update drain timeout for an existing node pool
az aks nodepool update \
--name <node-pool-name> \
--resource-group <resource-group-name> \
--cluster-name <cluster-name> \
--drain-time-out 45
ノードのソーク時間をカスタマイズする
ノードをドレインしてから再イメージ化して次のノードに進むまでの間、指定した期間待機を有効にするには、ソーク時間を設定します。 このソーク時間により、監視ダッシュボードからアプリケーションの正常性を確認するなど、アップグレード プロセス中に他のタスクを実行する機会が得られます。
既定のノード のソーク時間は 0 分です。 ノードのソーク時間の値は、最小 0 分、最大 30 分にすることができます。 できるだけ短い時間に浸けることをお勧めします。 ノードのソーク時間が長いほど、アップグレードの合計時間が長くなり、問題の検出が遅れます。
ノードのソーク時間の値を設定する
az aks nodepool add フラグを指定して、az aks nodepool update、az aks nodepool upgrade、または --node-soak-duration コマンドを使用して、新規または既存のノード プールのノード ソーク時間 (分単位) を設定します。
# Set node soak time for a new node pool
az aks nodepool add \
--name <node-pool-name> \
--resource-group <resource-group-name> \
--cluster-name <cluster-name> \
--node-soak-duration 10
# Update node soak time for an existing node pool
az aks nodepool update \
--name <node-pool-name> \
--resource-group <resource-group-name> \
--cluster-name <cluster-name> \
--max-surge 33% \
--node-soak-duration 5
# Set node soak time when upgrading an existing node pool
az aks nodepool upgrade \
--name <node-pool-name> \
--resource-group <resource-group-name> \
--cluster-name <cluster-name> \
--max-surge 33% \
--node-soak-duration 20
AKS ノードのアップグレード イベントを表示する
kubectl get events コマンドを使用してアップグレード イベントを表示し、ローリング アップグレードの進行状況を監視します。
kubectl get events --field-selector reason=Drain,reason=Surge,reason=Upgrade
アップグレード イベント中の出力例:
default 2m1s Normal Drain node/aks-nodepool1-12345678-vmss000001 Draining node: [aks-nodepool1-12345678-vmss000001]
default 9m22s Normal Surge node/aks-nodepool1-12345678-vmss000002 Created a surge node [aks-nodepool1-12345678-vmss000002 nodepool1] for agentpool nodepool1
default 1m45s Normal Upgrade node/aks-nodepool1-12345678-vmss000001 Soak duration 5m0s after draining node: aks-nodepool1-12345678-vmss000001
運用環境のワークロードに推奨される AKS ノード プールのアップグレード設定
次の表は、運用環境のワークロードに推奨されるノード プールのアップグレード設定の概要を示しています。
| Setting | 勧告 |
|---|---|
| 最大サージ | プロダクションノードプールは 33% に設定 |
| ドレイン タイムアウト | 実行時間が最も長いポッドの要件に基づいて構成する |
| ソーク時間 | 手動検証が必要な場合を除き、短い期間 (0 ~ 5 分) を使用する |
| ポッド中断予算 | ポッドの削除を制御する重要なワークロード用に PDB を構成する |
| アップグレード順序 | 非運用ノード プールを最初にアップグレードして新しいバージョンを検証する |