ノードの自動修復

ノードの自動修復機能は、ノードプール内の各ノードの状態を継続的にモニタリングします。異常な状態になったノードは、ノードの自動修復機能によって自動的に修復されます。この機能により、クラスタの停止やパフォーマンスの低下が発生する可能性が低くなり、クラスタの手動メンテナンスの必要性が最小限に抑えられます。

ノードの自動修復は、ノードプールの作成時または更新時に有効にできます。この機能は、個々のノードではなく、ノードプールで有効または無効にします。

異常なノードの状態

ノードの自動修復は、各ノードのヘルス ステータスを調べて修復が必要かどうかを判断します。Ready ステータスを報告したノードは正常とみなされます。特定の期間に異常ステータスが連続して報告されると、修復が開始されます。

異常ステータスは、約 15 分間連続して検出された NotReady 状態から発生することがあります。あるいは、約 30 分間に特定されたブートディスク容量の枯渇によって発生することもあります。

ノードのヘルスシグナルは、kubectl get nodes コマンドを使用して、いつでも手動で確認できます。

ノードの修復手法

ノードの自動修復では、修復プロセス中にクラスタの全体的な健全性とアプリケーションの可用性の両方を確保するために、特定の手法が採用されます。このセクションでは、ノードの自動修復機能が PodDisruptionBudget 構成を履行し、Pod Termination Grace Period を遵守し、ノードの修復時のクラスタの停止を最小限に抑えるその他の対策を取る仕組みについて説明します。

PodDisruptionBudget を 30 分間履行する

ノードの修復が必要な場合、そのノードがすぐにドレインされて再作成されるわけではありません。代わりに、ノードの自動修復機能は、PodDisruptionBudget(PDB)構成を最大 30 分間履行します。その後、ノード上のすべての Pod が削除されます(PDB 構成では、常に使用可能でなければならない特定の Pod のレプリカの最小数が定義されます)。

ノードの自動修復機能は、PodDisruptionBudget を約 30 分間履行することによって、クラスタ内の他の正常なノード間で Pod を安全に再スケジュールして再分配するための時間を確保します。これにより、修復プロセス中にアプリケーションの可用性を必要なレベルに維持できます。

30 分の制限時間が経過すると、PodDisruptionBudget 違反であっても、ノードの自動修復によって修復プロセスが進められます。修復に必要なエビクションが PodDisruptionBudget 構成によって妨げられると、修復プロセスは時間制限なしで無期限に停止する可能性があります。

Pod 終了の猶予期間を履行する

ノードの自動修復機能では、約 30 分間の Pod 終了猶予期間も履行されます。Pod 終了猶予期間により、終了時に Pod が正常にシャットダウンできる時間が確保されます。猶予期間中、ノードの kubelet がクリーンアップ タスクを実行し、そのノード上の Pod に関連付けられたリソースを解放します。ノードの自動修復機能により、kubelet がこのクリーンアップを完了するまでに最大 30 分与えられます。割り当てられた 30 分が経過すると、Pod が正常に終了したかどうかにかかわらず、ノードは強制的に終了します。

その他のノード修復手法

ノードの自動修復では、次の手法も実装されます。

  • 複数のノードで修復が必要な場合は、クラスタの停止を抑え、ワークロードを保護するために、ノードが 1 つずつ修復されます。
  • 修復プロセス中にノードの自動修復を無効にした場合は、修復オペレーションが成功または失敗するまで処理中の修復が続行されます。

ノードの自動修復を有効または無効にする方法

ノードプールの作成時または更新時に、ノード自動修復を有効または無効にできます。この機能は、個々のノードではなく、ノードプールで有効または無効にします。

新しいノードプールの自動修復を有効にする

gcloud container azure node-pools create NODE_POOL_NAME \
   --cluster CLUSTER_NAME \
   --location GOOGLE_CLOUD_LOCATION \
   --node-version 1.29.3-gke.600 \
   --vm-size VM_SIZE \
   --max-pods-per-node 110 \
   --min-nodes MIN_NODES \
   --max-nodes MAX_NODES \
   --azure-availability-zone AZURE_ZONE \
   --ssh-public-key SSH_PUBLIC_KEY" \
   --subnet-id SUBNET_ID \
   --enable-autorepair

次のように置き換えます。

  • NODE_POOL_NAME: ノードプールの一意の名前(node-pool-1 など)
  • CLUSTER_NAME: GKE on Azure クラスタの名前
  • GOOGLE_CLOUD_LOCATION: クラスタを管理する Google Cloud のロケーション
  • NODE_VERSION: ノードプールの各ノードにインストールする Kubernetes のバージョン(例: 「1.29.3-gke.600」)。
  • VM_SIZE: サポートされている Azure VM サイズ
  • MIN_NODES: ノードプール内の最小ノード数。詳細については、クラスタ オートスケーラーをご覧ください。
  • MAX_NODES: ノードプール内の最大ノード数
  • AZURE_ZONE: GKE on Azure がノードプールを起動する Azure アベイラビリティ ゾーン(例: 3
  • SSH_PUBLIC_KEY: SSH 公開鍵のテキスト。
  • SUBNET_ID: ノードプールのサブネットの ID。

既存のノードプールの自動修復を有効にする

既存のノードプールでノードの自動修復を有効にするには、次のコマンドを実行します。

gcloud container azure node-pools update NODE_POOL_NAME \
   --cluster CLUSTER_NAME \
   --location GOOGLE_CLOUD_LOCATION \
   --enable-autorepair

次のように置き換えます。

  • NODE_POOL_NAME: ノードプールの一意の名前(node-pool-1 など)
  • CLUSTER_NAME: クラスタの名前
  • GOOGLE_CLOUD_LOCATION: クラスタを管理する Google Cloud リージョン

既存のノードプールの自動修復を無効にする

gcloud container azure node-pools update NODE_POOL_NAME \
   --cluster CLUSTER_NAME \
   --location GOOGLE_CLOUD_LOCATION \
   --no-enable-autorepair

次のように置き換えます。

  • NODE_POOL_NAME: ノードプールの一意の名前(node-pool-1 など)
  • CLUSTER_NAME: クラスタの名前
  • GOOGLE_CLOUD_LOCATION: クラスタを管理する Google Cloud リージョン

GKE on Azure は、ノードの自動修復を正常に無効にします。既存のノードプールのノードの自動修復を無効にすると、GKE on Azure によってノードプールの更新オペレーションが開始されます。このオペレーションは、既存のノード修復が完了するまで待ってから続行します。

ノードの自動修復が有効になっているかどうかを確認する

ノード自動修復が有効になっているかどうかを確認するには、次のコマンドを実行します。

gcloud container azure node-pools describe NODE_POOL_NAME \
   --cluster CLUSTER_NAME \
   --location GOOGLE_CLOUD_LOCATION

次のように置き換えます。

  • NODE_POOL_NAME: ノードプールの一意の名前(node-pool-1 など)
  • CLUSTER_NAME: クラスタの名前
  • GOOGLE_CLOUD_LOCATION: クラスタを管理する Google Cloud リージョン

ノード修復履歴

ノードプールで実行された修復の履歴を表示するには、次のコマンドを実行します。

gcloud container azure operations list \
   --location GOOGLE_CLOUD_LOCATION \
   --filter="metadata.verb=repair AND metadata.target=projects/PROJECT_ID/locations/GOOGLE_CLOUD_LOCATION/azureClusters/CLUSTER_NAME/azureNodePools/NODEPOOL_NAME

次のように置き換えます。

  • GOOGLE_CLOUD_LOCATION: クラスタを管理するサポートされている Google Cloud リージョン(例: us-west1)。
  • PROJECT_ID: Google Cloud プロジェクト
  • CLUSTER_NAME: クラスタの名前
  • NODE_POOL_NAME: ノードプールの一意の名前(node-pool-1 など)

ノードプールの健全性の概要

ノードの自動修復を有効にしたら、次のコマンドを実行してノードプールの健全性の概要を生成できます。

gcloud container azure node-pools describe NODE_POOL_NAME \
   --cluster CLUSTER_NAME \
   --location GOOGLE_CLOUD_LOCATION

ノードプールの健全性の概要は、次のサンプルのようになります。

{
  "name": "some-np-name",
  "version": "some-version",
  "state": "RUNNING",

  ...

  "errors": [
    {
      "message": "1 node(s) is/are identified as unhealthy among 2 total node(s) in the node pool. No node is under repair."
    }
  ],
}

ノードプールの健全性の概要は、ノードプールの現在の状態を把握するのに役立ちます。この例では、概要に、ノードプール内の 2 つのノードのいずれかが正常ではないことを示すエラー メッセージが含まれています。また、現在修復プロセスが行われているノードがないことも報告されます。