GKEクラスタで自動ノード修復機能の有効化について

このブログシリーズ 「クラウドセキュリティ 実践集」 では、一般的なセキュリティ課題を取り上げ、「なぜ危険なのか?」 というリスクの解説から、 「どうやって直すのか?」 という具体的な修復手順(コンソール、gcloud CLI、Terraformなど)まで、分かりやすく解説します。

この記事では、GKEクラスタで自動ノード修復機能が無効化されているリスクについて、リスクと対策を解説します。

ポリシーの説明

GKEの自動ノード修復機能は、クラスタ内のノードの健全性を自動的に監視し、問題が発生したノードを自動的に修復する重要な機能です。この機能が有効化されていると、GKEは約10分ごとに各ノードのヘルスチェックを実行し、以下の条件に該当する場合に自動的にノードを修復します:

  • ノードが「NotReady」状態が約10分間継続した場合
  • ノードがクラスタと通信できない状態が続いた場合
  • ノードのディスク使用率が100%に達した場合
  • ノードのプロセスがクラッシュした場合

修復プロセスでは、影響のあるノードを安全にドレイン(Pod を他のノードに退避)してから、ノードを再作成します。

なぜ危険なのか?

自動ノード修復機能が無効化されている場合、以下のリスクが発生します:

1. セキュリティリスクの増大

  • 異常な状態のノードが長期間放置される可能性があり、攻撃者に悪用される恐れがあります
  • 侵害されたノードや誤動作しているノードが自動的に置き換えられないため、未知の脆弱性が残存する可能性があります

2. 可用性の低下

  • 「NotReady」状態のノードが無期限に残り続け、クラスタのパフォーマンスに影響を与えます
  • サービスの中断や性能劣化が発生する可能性があります

3. 運用負荷の増大

  • 管理者が手動で異常なノードを特定し、修復する必要があり、運用コストが大幅に増加します
  • 24時間365日の監視体制が必要となり、人的エラーのリスクも高まります

修復方法

コンソールでの修復手順

Google Cloud コンソールを使用して、既存のノードプールで自動修復を有効にする手順:

  1. Google Cloud Consoleにログインし、「Kubernetes Engine」ページに移動します
  2. 対象のクラスタ名をクリックして、クラスタの詳細ページを開きます
  3. 上部のタブから「ノード」タブをクリックします
  4. ノードプール」セクションで、修正したいノードプールの名前をクリックします
  5. ノードプールの詳細ページで、右上の「編集」ボタン(鉛筆アイコン)をクリックします
  6. 管理」セクションまでスクロールし、「自動修復を有効にする」のチェックボックスをオンにします
  1. 画面下部の「保存」ボタンをクリックして変更を適用します
  2. 変更が正常に適用されたことを確認するため、ノードプールの詳細ページで「自動修復」が「有効」になっていることを確認します

注意事項:

  • 2020年5月28日以降に作成された新しいノードプールでは、自動修復がデフォルトで有効になっています
  • 修復中のノードは新しい外部IPアドレスを取得するため、IPホワイトリストを使用している場合は注意が必要です

Terraformでの修復手順

Terraformを使用してGKEノードプールで自動修復を有効にする設定例と、主要な修正ポイントを説明します。

# ------------------ ① GKEクラスタの定義 ------------------
resource "google_container_cluster" "primary" {
  name     = "secure-gke-cluster"
  location = var.region

  # デフォルトノードプールを削除し、個別管理のノードプールを使用
  remove_default_node_pool = true
  initial_node_count       = 1

  # クラスタレベルのセキュリティ設定
  workload_identity_config {
    workload_pool = "${var.project_id}.svc.id.goog"
  }
}

# ------------------ ② サービスアカウント ------------------
resource "google_service_account" "kubernetes" {
  account_id   = "gke-node-sa"
  display_name = "GKE Node Service Account"
  description  = "Service account for GKE nodes with minimal permissions"
}

# ------------------ ③ 自動修復を有効にしたノードプール ------------------
resource "google_container_node_pool" "primary_nodes" {
  name       = "secure-node-pool"
  location   = var.region
  cluster    = google_container_cluster.primary.name
  node_count = var.node_count

  # ノード構成
  node_config {
    machine_type = var.machine_type
    disk_size_gb = 100
    disk_type    = "pd-standard"

    # 最小権限のサービスアカウントを使用
    service_account = google_service_account.kubernetes.email
    oauth_scopes = [
      "<https://www.googleapis.com/auth/cloud-platform>"
    ]

    # セキュリティ強化設定
    shielded_instance_config {
      enable_secure_boot          = true
      enable_integrity_monitoring = true
    }

    # メタデータ保護
    metadata = {
      disable-legacy-endpoints = "true"
    }
  }

  # --- 自動修復と自動アップグレードの有効化 ---
  management {
    auto_repair  = true    # 自動修復を有効化
    auto_upgrade = true    # 自動アップグレードも推奨
  }

  # オートスケーリング設定(オプション)
  autoscaling {
    min_node_count = 2
    max_node_count = 10
  }

  # アップグレード設定
  upgrade_settings {
    max_surge       = 1
    max_unavailable = 0
  }
}

# ------------------ ④ 既存ノードプールの更新(既存環境の場合) ------------------
# 既存のノードプールがある場合は、以下のように更新
resource "google_container_node_pool" "existing_pool" {
  name       = "existing-node-pool"
  location   = var.region
  cluster    = google_container_cluster.primary.name

  # 既存の設定を維持しつつ、management ブロックを追加または更新
  management {
    auto_repair  = true    # この行を追加して自動修復を有効化
    auto_upgrade = true    # 推奨:自動アップグレードも有効化
  }

  # その他の既存設定...
}

 

自動修復と関連する設定

リリースチャンネルの設定(推奨)

# クラスタをリリースチャンネルに登録
# rapid: 最新機能を早期に利用(開発環境向け)
# regular: バランスのとれた更新(一般的な本番環境向け)
# stable: 最も安定した更新(ミッションクリティカルな環境向け)
gcloud container clusters update [クラスタ名] \
  --location=[ゾーンまたはリージョン] \
  --release-channel=regular

 

gcloud CLIでの有効化(既存ノードプールの場合):

# 自動修復を有効化
gcloud container node-pools update [ノードプール名] \
  --cluster [クラスタ名] \
  --location=[ゾーンまたはリージョン] \
  --enable-autorepair

# 自動修復の状態を確認
gcloud container node-pools describe [ノードプール名] \
  --cluster [クラスタ名] \
  --location=[ゾーンまたはリージョン] \
  --format="value(management.autoRepair)"

# すべてのノードプールの自動修復状態を一括確認
gcloud container node-pools list \
  --cluster [クラスタ名] \
  --location=[ゾーンまたはリージョン] \
  --format="table(name,management.autoRepair:label='AUTO_REPAIR',management.autoUpgrade:label='AUTO_UPGRADE')"

 

最後に

この記事では、GKEクラスタで自動ノード修復機能が無効化されているリスクについて、リスクと対策を解説しました。

自動ノード修復を有効化することで、セキュリティリスクの低減、可用性の向上、運用負荷の軽減を実現できます。特に本番環境では、この機能を必ず有効化することを強く推奨します。

この問題の検出は弊社が提供するSecurifyのCSPM機能で簡単に検出及び管理する事が可能です。 運用が非常に楽に出来る製品になっていますので、ぜひ興味がある方はお問い合わせお待ちしております。 最後までお読みいただきありがとうございました。この記事が皆さんの役に立てば幸いです。

参考情報

この記事をシェアする

クラウドセキュリティ対策実践集一覧へ戻る

貴社の利用状況に合わせた見積もりを作成します。

料金プランを詳しく見る