ノードの自動修復

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

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

異常なノードの状態

ノードの自動修復は、各ノードのヘルス ステータスを調べて修復が必要かどうかを判断します。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 aws node-pools create NODE_POOL_NAME \
   --cluster CLUSTER_NAME \
   --instance-type INSTANCE_TYPE \
   --root-volume-size ROOT_VOLUME_SIZE \
   --iam-instance-profile NODEPOOL_PROFILE \
   --node-version NODE_VERSION \
   --min-nodes MIN_NODES \
   --max-nodes MAX_NODES \
   --max-pods-per-node MAX_PODS_PER_NODE \
   --location GOOGLE_CLOUD_LOCATION \
   --subnet-id NODEPOOL_SUBNET \
   --ssh-ec2-key-pair SSH_KEY_PAIR_NAME \
   --config-encryption-kms-key-arn CONFIG_KMS_KEY_ARN \
   --tags "Name=CLUSTER_NAME-NODE_POOL_NAME" \
   --enable-autorepair

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

  • NODE_POOL_NAME: ノードプールに付ける名前。ノードプールの名前を取得するには、gcloud container aws node-pools list --cluster CLUSTER_NAME --location GOOGLE_CLOUD_LOCATION コマンドを実行します。
  • CLUSTER_NAME: ノードプールを接続するクラスタの名前。
  • INSTANCE_TYPE: このノードプールに必要な AWS マシン インスタンス タイプ。例: m5.large
  • ROOT_VOLUME_SIZE: 各ノードのルート ボリュームに必要なサイズ(GB)。
  • NODEPOOL_PROFILE: ノードプール VM の IAM インスタンス プロファイル
  • NODE_VERSION: ノードプールの各ノードにインストールする Kubernetes のバージョン。例: 1.29.4-gke.200
  • MIN_NODES: ノードプールに配置できるノードの最小数
  • MAX_NODES: ノードプールに配置できるノードの最大数
  • MAX_PODS_PER_NODE: プール内の任意の 1 つのノードで作成できる Pod の最大数
  • GOOGLE_CLOUD_LOCATION: このノードプールを管理する Google Cloud のロケーションの名前
  • NODEPOOL_SUBNET: ノードプールが実行されるサブネットの ID。
    • クラスタの Pod / Service IP 範囲とノードプール サブネット ネットワークとの間に重複がないようにしてください。クラスタの Pod と Service の IP 範囲の選択について詳しくは、クラスタの CIDR 範囲を選択するをご覧ください。
    • このサブネットが VPC プライマリ CIDR ブロックの外部にある場合は、追加の手順が必要です。詳細については、セキュリティ グループをご覧ください。
  • SSH_KEY_PAIR_NAME: SSH アクセス用に作成された AWS SSH 鍵ペアの名前(省略可)
  • CONFIG_KMS_KEY_ARN: ユーザーデータを暗号化する AWS KMS 鍵の Amazon リソース名(ARN)。

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

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

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

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

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

gcloud container aws 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 aws operations list \
   --location GOOGLE_CLOUD_LOCATION \
   --filter="metadata.verb=repair AND metadata.target=projects/PROJECT_ID/locations/GOOGLE_CLOUD_LOCATION/awsClusters/CLUSTER_NAME/awsNodePools/NODEPOOL_NAME

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

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

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

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

gcloud container aws 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 つのノードのいずれかが正常ではないことを示すエラー メッセージが含まれています。また、現在修復プロセスが行われているノードがないことも報告されます。