AKSコントロールプレーンのアップグレード手順と注意点|Azure Kubernetes Service公式情報を整理

Azure Kubernetes Service(AKS)のコントロールプレーンアップグレードは、ノードプール上のワークロードをすぐに変更せず、APIサーバーなどの管理面だけを先に新しいKubernetesバージョンへ進めるための手段です。結論として、本番AKSでは「いきなりクラスター全体をアップグレードする」のではなく、まずアップグレード可能なバージョン、廃止API、権限、クォータを確認し、--control-plane-onlyでコントロールプレーンを先に更新してからノードプールを段階的に進めるのが安全です。

Microsoft Learnの公式情報では、AKSクラスターを「Azureが管理するコントロールプレーン」と「ワークロードを実行するノードプール」に分けて整理し、コントロールプレーンだけを独立してアップグレードする手順を説明しています。これにより、ノードプールのアップグレードを別工程として管理しながら、新しいKubernetes APIや互換性を先に検証できます。(Microsoft Learn)

目次

AKSコントロールプレーンアップグレードで何が変わるのか

AKSのコントロールプレーンのみをアップグレードする場合、主な対象はAPIサーバー、etcd、controller manager、schedulerなどの管理コンポーネントです。一方、通常はノードプールのKubernetesバージョンはそのまま残るため、既存Podをすぐにドレインしたり、ノードを再イメージ化したりする作業とは分けて考えられます。(Microsoft Learn)

項目変わること注意点
コントロールプレーンAPIサーバー、etcd、controller manager、schedulerなどが対象バージョンに更新されるkubectl、Helm、CI/CD、Admission WebhookなどAPIサーバーと通信する仕組みの検証が必要
ノードプール原則としてコントロールプレーンのみの操作ではバージョンを維持するアップグレード後にaz aks nodepool listで実際のバージョン確認が必要
既存ワークロードノードプールを同時に更新しなければ、Podの即時再配置は基本的に発生しにくい新しいAPIサーバーで非推奨APIや古いマニフェストが問題になる可能性がある
運用プロセスコントロールプレーンとノードプールを別工程で管理できる「コントロールプレーンのみ」で終わらせず、最終的にはノードプール更新計画も必要

実務上のポイントは、「ワークロードを止めずに済む」と短絡的に捉えないことです。コントロールプレーンだけを更新しても、デプロイ操作、kubectl操作、カスタムコントローラー、GitOpsツール、監視エージェントなどはAPIサーバーに依存します。つまり、既存Podが動き続けていても、新規デプロイやスケール操作で問題が表面化する可能性があります。

アップグレード種別の違いを理解する

AKSのアップグレードは、大きく「コントロールプレーンのみ」「クラスター全体」「ノードプールのみ」に分けて考えると整理しやすくなります。公式情報でも、コントロールプレーンのみはワークロードに影響を与える前に新しいKubernetes APIを検証する用途、フルクラスターアップグレードは標準的な更新、ノードプールのみは段階的なロールアウトに使うものとして整理されています。(Microsoft Learn)

種別対象範囲向いている場面失敗しやすいポイント
コントロールプレーンのみAPIサーバー、etcd、controller manager、scheduler先にAPI互換性を確認したい、本番前に管理面だけ進めたい廃止APIや古いCRD、Admission Webhookの検証不足
クラスター全体コントロールプレーンと全ノードプール小規模環境、検証済み環境、運用負荷を減らしたい場合ノードドレイン、PDB、サージ容量、IP不足で止まりやすい
ノードプールのみ特定のノードプールシステム用、ユーザー用、GPU用などを段階的に更新したいノードごとのワークロード特性を考慮しないと停止リスクが高い

本番環境では、まずコントロールプレーンをアップグレードし、API互換性や運用ツールの動作を確認した後、ノードプールをローリングアップグレードする流れが現実的です。特に複数チームが同じAKSを利用している場合、アプリケーションチームが使うマニフェストやHelmチャートの確認時間を確保できます。

バージョンルールで必ず押さえるべきこと

AKSのアップグレードでは、Kubernetesのマイナーバージョンを飛ばせません。たとえば1.28.xから1.29.x、1.29.xから1.30.xのような順次アップグレードは可能ですが、1.28.xから1.30.xへ直接進めることはできません。また、コントロールプレーンはノードプールより最大2マイナーバージョン先行できます。(Microsoft Learn)

このルールは、移行計画に大きく影響します。長期間アップグレードしていないAKSクラスターでは、目的のバージョンまで複数回の作業が必要になるため、1回のメンテナンス枠で完了しないことがあります。

実務での判断例

現在の状態判断
コントロールプレーン1.28、ノードプール1.28まず1.29へアップグレードする。1.30へ直接進めない
コントロールプレーン1.30、ノードプール1.28バージョン差は許容範囲内だが、ノードプール更新計画を立てる
ノードプールを先に1.30へ上げたい不可。コントロールプレーンは常にノードプール以上のバージョンである必要がある
az aks get-upgradesで候補が出ない最新のサポートバージョン、またはサポート外バージョンで移行が必要な可能性がある

ノードプールを先にアップグレードすることはできません。公式FAQでも、コントロールプレーンのバージョンは常にノードプール以上である必要があり、先にコントロールプレーンをアップグレードする必要があると説明されています。(Microsoft Learn)

管理者が事前に確認すべき設定

AKSコントロールプレーンのアップグレードは、コマンドを実行するだけでは不十分です。実行前に、ツール、権限、アップグレードパス、API互換性、クォータを確認しておく必要があります。

確認項目確認内容具体的な確認方法
Azure CLIバージョン2.34.1以降が必要az --version
Azure PowerShellAz PowerShell 5.9.0以降が必要Get-InstalledModule -Name Az
RBAC権限アップグレード操作に必要な権限があるかMicrosoft.ContainerService/managedClusters/agentPools/writeを含むロールを確認
アップグレード候補現在のAKSで利用できるKubernetesバージョンaz aks get-upgrades
廃止API対象バージョンで使えなくなるAPIがないかAzure Portalの表示、kubentなどで確認
コンピュートクォータアップグレード時に必要な容量があるかサブスクリプション、リージョン、VM SKUのクォータを確認
ノードプール状態混在バージョンや過去の失敗がないかaz aks nodepool listで確認
IaC定義Terraform、Bicep、ARMテンプレートなどと実環境がずれないかKubernetesバージョン指定を確認

公式情報では、Azure CLI 2.34.1以降、Azure PowerShell 5.9.0以降、アップグレード操作に必要なRBAC権限、十分なコンピュートクォータが前提として挙げられています。また、Kubernetes 1.30および1.27 LTSへアップグレードする場合、Beta APIが既定で無効になる点にも注意が必要です。(Microsoft Learn)

Azure CLIでコントロールプレーンのみをアップグレードする手順

最も実務で使いやすいのはAzure CLIによる実行です。以下は、コントロールプレーンだけをアップグレードし、ノードプールのバージョンが変わっていないことまで確認する流れです。

現在利用できるアップグレード候補を確認する

az aks get-upgrades \
  --resource-group <resource-group-name> \
  --name <cluster-name> \
  --output table

この時点で、現在のコントロールプレーンバージョンとアップグレード可能なバージョンを確認します。候補が複数ある場合でも、マイナーバージョンを飛ばさず、順番に進める必要があります。

コントロールプレーンのみをアップグレードする

az aks upgrade \
  --resource-group <resource-group-name> \
  --name <cluster-name> \
  --kubernetes-version <target-version> \
  --control-plane-only

<target-version>には、az aks get-upgradesで表示された利用可能なバージョンを指定します。例として公式情報では1.29.4が使われていますが、実際には自社環境で利用できるバージョンを指定してください。(Microsoft Learn)

アップグレード完了を確認する

az aks show \
  --resource-group <resource-group-name> \
  --name <cluster-name> \
  --output table

KubernetesVersionとProvisioningStateを確認します。ProvisioningStateがSucceededになっているかを見ます。

ノードプールのバージョンを確認する

az aks nodepool list \
  --resource-group <resource-group-name> \
  --cluster-name <cluster-name> \
  --query "[].{Name:name,Version:orchestratorVersion}" \
  --output table

コントロールプレーンのみのアップグレードでは、ノードプールは以前のKubernetesバージョンのまま表示される想定です。ここを確認しないと、「本当にノードプールへ影響がなかったか」を判断できません。

PowerShellとAzure Portalで実行する場合

PowerShellを使う場合は、Set-AzAksClusterに-ControlPlaneOnlyを付けて実行します。

Set-AzAksCluster `
  -ResourceGroupName <resource-group-name> `
  -Name <cluster-name> `
  -KubernetesVersion <target-version> `
  -ControlPlaneOnly

確認にはGet-AzAksClusterを使います。

Get-AzAksCluster `
  -ResourceGroupName <resource-group-name> `
  -Name <cluster-name> |
Format-Table -Property Name, Location, KubernetesVersion, ProvisioningState

Azure Portalの場合は、AKSクラスターリソースを開き、Cluster configurationからUpgrade versionを選び、Control plane onlyを選択します。Portalでは、現在のバージョンとアップグレード先の間にある廃止APIが表示されるため、CLI中心の運用でも一度確認しておく価値があります。(Microsoft Learn)

開発者が確認すべきAPI互換性

コントロールプレーンのアップグレードで最も見落とされやすいのは、アプリケーションの実行そのものではなく、デプロイや更新の失敗です。古いAPIバージョンを使ったマニフェスト、更新されていないHelmチャート、CRD、Operator、Admission Webhookがあると、新しいAPIサーバーでエラーになることがあります。

特に確認したい対象は次のとおりです。

  • Deployment、Ingress、HPA、PodDisruptionBudgetなどの標準マニフェスト
  • Helm chart内に残っている古いapiVersion
  • CRDを提供するOperatorやアドオン
  • Gatekeeper、Kyverno、Azure Policyなどのポリシー系コンポーネント
  • Argo CD、Flux、GitHub Actions、Azure DevOpsなどのデプロイ経路
  • Kubernetes APIを直接呼び出す社内ツール

公式情報では、廃止APIの確認ツールとしてkube-no-trouble(kubent)が紹介されており、問題がある場合はアップグレード前にマニフェストをサポート対象のAPIバージョンへ更新する必要があります。(Microsoft Learn)

kubent

あわせて、対象マニフェストを本番に適用する前にサーバー側ドライランで確認しておくと、API互換性の問題を早めに見つけやすくなります。

kubectl apply --server-side --dry-run=server -f ./manifests/

本番環境での展開計画の作り方

本番AKSでは、コントロールプレーンのアップグレードを単発作業として扱わないことが重要です。次のように、検証環境、本番コントロールプレーン、本番ノードプールの順に段階を分けると、影響を切り分けやすくなります。

フェーズ実施内容合格条件
検証環境本番に近い構成でコントロールプレーンをアップグレード主要マニフェスト、CI/CD、監視、ログ収集が正常
本番事前確認廃止API、クォータ、権限、バックアップ、メンテナンス時間を確認作業手順と切り戻し方針がレビュー済み
本番コントロールプレーン--control-plane-onlyでアップグレードProvisioningStateがSucceeded、ノードプールが想定通り
スモークテストデプロイ、スケール、ログ、監視、Ingressを確認通常運用と同じ操作が通る
ノードプール更新ノードプールを段階的にアップグレードPDB、レプリカ数、サージ容量、IP不足で停止しない

コントロールプレーンアップグレードは、公式FAQでは一般的に5〜15分程度で完了すると説明されています。ただし、クラスター構成やリージョン側の負荷に依存するため、必ず短時間で終わると決め打ちせず、デプロイ頻度の低い時間帯に実行するのが現実的です。(Microsoft Learn)

ノードプールが意図せずアップグレードされるケース

--control-plane-onlyを指定しても、必ずノードプールに一切の変化がないと考えるのは危険です。公式FAQでは、クラスターの準拠性や健全性を保つため、AKSがコントロールプレーンアップグレードと並行してローリングノードプールアップグレードを起動する場合があると説明されています。典型例は、過去のノードアップグレード失敗や、ノードが混在バージョンのまま残っているケースです。(Microsoft Learn)

そのため、作業前後で必ずノードプールの状態を比較してください。

az aks nodepool list \
  --resource-group <resource-group-name> \
  --cluster-name <cluster-name> \
  --query "[].{Name:name,Version:orchestratorVersion,ProvisioningState:provisioningState}" \
  --output table

もしノードプールにも変更が入る可能性がある環境なら、PDB、レプリカ数、サージ用の容量、サブネットIPの余裕も確認しておくべきです。AKSのアップグレード全般では、PDB設定、クォータ、サブネットIP、証明書やサービスプリンシパルなどの事前検証が失敗要因になり得ます。(Microsoft Learn)

よくある失敗と対処方法

事象主な原因対処
az aks get-upgradesで候補が出ないすでに最新のサポートバージョン、またはサポート外バージョンサポート状況を確認。サポート外の場合は新規クラスター作成とワークロード移行を検討
アップグレードが廃止APIで失敗する古いapiVersionのマニフェストやCRDが残っているkubentやPortalで確認し、マニフェストを更新
権限不足で実行できない必要なAzure RBAC権限がない作業者またはマネージドIDのロールを確認
クォータ不足で失敗するリージョンやVM SKUのコンピュートクォータが不足事前にクォータを増やす、対象リージョンやノード構成を確認
コントロールプレーンだけのつもりがノードも動いた過去のアップグレード失敗や混在バージョン作業前後のaz aks nodepool listを保存し、差分を確認
ノードプール更新フェーズでPodが退避できないPDBが厳しすぎる、レプリカ不足、終了処理が長いPDBのmaxUnavailableやレプリカ数を見直し、事前にステージングで検証

公式情報では、az aks get-upgradesで候補がない場合、クラスターが最新のサポートバージョンであるか、サポート外バージョンで移行が必要な可能性があると説明されています。サポート外バージョンの場合は、サポート対象バージョンの新しいクラスターを作成し、ワークロードを移行する方針になります。(Microsoft Learn)

管理者・開発者別の確認チェックリスト

AKS管理者・プラットフォーム担当者

  • az aks get-upgradesでアップグレード候補を確認する
  • コントロールプレーンと各ノードプールの現在バージョンを記録する
  • Azure CLI、PowerShell、RBAC権限を確認する
  • コンピュートクォータ、サブネットIP、VM SKUの余裕を確認する
  • 自動アップグレード設定やメンテナンスウィンドウの有無を確認する
  • 過去に失敗したノードプールアップグレードや混在バージョンがないか確認する

アプリケーション開発者

  • KubernetesマニフェストのapiVersionを確認する
  • Helm chart、Kustomize、GitOpsリポジトリを更新する
  • CRD、Operator、Admission Webhookの対応バージョンを確認する
  • サーバー側ドライランでマニフェスト適用を検証する
  • デプロイ、ロールバック、スケール操作を検証環境で試す

SRE・運用担当者

  • アップグレード中の監視項目を決める
  • APIサーバー操作、デプロイ頻度、アラートの影響を確認する
  • 作業前後でイベント、Pod状態、Ingress、ログ収集を確認する
  • ノードプール更新に進む前に、PDBとレプリカ数を見直す
  • 失敗時の連絡先、判断基準、作業中止条件を決めておく

アップグレード後に必ず確認する項目

コントロールプレーンアップグレードが終わったら、Succeededだけで判断せず、実際の運用操作が通るかを確認します。

kubectl get nodes
kubectl get pods -A
kubectl get events -A --sort-by=.lastTimestamp
kubectl get deployments -A

次に、普段のデプロイ経路で小さな変更を流します。たとえば、検証用NamespaceにConfigMapを適用する、ステージング相当のDeploymentを再適用する、GitOpsの同期を手動実行するなどです。ここで失敗する場合、アプリケーション本体ではなく、API互換性、RBAC、Webhook、CRD、CI/CD側に問題がある可能性があります。

kubectl apply --server-side --dry-run=server -f ./manifests/

ノードプールを後続でアップグレードする場合は、コントロールプレーン更新後の検証結果を残してから進めます。フルクラスターアップグレードでは、AKSはコントロールプレーンを先に更新し、その後に各ノードプールを順番に更新します。ノードプール側はドレインや再イメージ化を伴うため、コントロールプレーンのみの作業よりも時間と影響範囲が大きくなります。(Microsoft Learn)

次に取るべき行動

AKSコントロールプレーンアップグレードで最初にやるべきことは、すぐにaz aks upgradeを実行することではありません。まず、現在のクラスターとノードプールのバージョンを棚卸しし、利用可能なアップグレード先、廃止API、RBAC権限、クォータ、IaC定義の差分を確認してください。

安全な進め方は、次の順番です。

  1. az aks get-upgradesでアップグレード候補を確認する
  2. kubentやAzure Portalで廃止APIを確認する
  3. 検証環境でコントロールプレーンのみをアップグレードする
  4. 本番で--control-plane-onlyを実行する
  5. ノードプールが想定通り維持されているか確認する
  6. CI/CD、GitOps、kubectl操作、監視、Ingressを確認する
  7. 問題がなければノードプールのローリングアップグレードを計画する

コントロールプレーンのみのアップグレードは、AKS運用のリスクを分割するための有効な手段です。ただし、API互換性やノードプール更新計画を後回しにすると、次のデプロイやノード更新で問題が出ます。管理者と開発者が同じチェックリストを見ながら、「APIサーバーを上げる作業」と「ワークロード実行基盤を上げる作業」を分けて進めることが、AKSアップグレードを安定させる近道です。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次