GKEクラスタの自動ノードアップグレード設定について

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

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

ポリシーの説明

GKEの自動ノードアップグレード機能は、クラスタのノードプールを自動的に最新の安定バージョンに更新する重要なセキュリティ機能です。この機能により、Googleが定期的にリリースするセキュリティパッチ、バグ修正、パフォーマンス改善が自動的に適用され、クラスタのセキュリティと安定性が継続的に維持されます。

なぜ危険なのか?

具体的なリスクと影響

1. コントロールプレーンとの互換性と強制アップグレードのリスク

  • Kubernetesはマスターとノード間で最大2マイナーバージョン差のみサポート
  • Googleはノードが3マイナーバージョン以上古い場合、強制アップグレードを実施

2. 運用負荷とコストの増大

  • 手動アップグレードにかかる工数がかかります

 

修復方法

コンソールでの修復手順

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

  1. Google Cloud Consoleにログインし、「Kubernetes Engine」→「クラスタ」ページに移動します
  2. 対象のクラスタ名をクリックして、クラスタの詳細ページを開きます
  3. 上部のタブから「ノード」タブをクリックします
  4. ノードプール」セクションで、修正したいノードプールの名前をクリックします
  5. ノードプールの詳細ページで、右上の「編集」ボタン(鉛筆アイコン)をクリックします
  6. 管理」セクションまでスクロールし、以下の設定を行います:
    • 自動アップグレードを有効にする」のチェックボックスをオンにします
    • サージアップグレードを有効にする」もオンにすることを推奨します(ダウンタイムを最小化)
  7. メンテナンスウィンドウ」セクションで、アップグレードを実行する時間帯を設定します:
    • メンテナンスウィンドウを設定」をクリック
    • 開始時刻(例:毎週土曜日 02:00)を選択
    • 期間(例:4時間)を設定
  8. 画面下部の「保存」ボタンをクリックして変更を適用します
  9. 変更が正常に適用されたことを確認するため、ノードプールの詳細ページで以下を確認:
    • 「自動アップグレード」が「有効」になっている
    • 「メンテナンスウィンドウ」が設定されている

Terraformでの修復手順

Terraformを使用してGKEノードプールで自動アップグレードを有効にする包括的な設定例:

# ------------------ ① リリースチャンネルを使用したクラスタ(推奨) ------------------
resource "google_container_cluster" "primary" {
  name     = "secure-gke-cluster"
  location = var.region

  # リリースチャンネルの設定(自動アップグレードの基盤)
  release_channel {
    channel = "REGULAR"  # RAPID, REGULAR, STABLE から選択
  }

  # メンテナンスポリシー
  maintenance_policy {
    daily_maintenance_window {
      start_time = "02:00"  # UTC時刻で設定
    }

    # より詳細な制御が必要な場合
    recurring_window {
      start_time = "2024-01-01T02:00:00Z"
      end_time   = "2024-01-01T06:00:00Z"
      recurrence = "FREQ=WEEKLY;BYDAY=SA"  # 毎週土曜日
    }
  }

  # デフォルトノードプールを削除
  remove_default_node_pool = true
  initial_node_count       = 1

  # セキュリティ強化設定
  workload_identity_config {
    workload_pool = "${var.project_id}.svc.id.goog"
  }

  # バイナリ認証
  binary_authorization {
    evaluation_mode = "PROJECT_SINGLETON_POLICY_ENFORCE"
  }

  # ネットワークポリシー
  network_policy {
    enabled  = true
    provider = "CALICO"
  }
}

# ------------------ ② 自動アップグレードを有効にしたノードプール ------------------
resource "google_container_node_pool" "primary_nodes" {
  name       = "secure-node-pool"
  location   = var.region
  cluster    = google_container_cluster.primary.name

  # 初期ノード数
  initial_node_count = var.initial_node_count

  # --- 管理設定:自動アップグレードと自動修復 ---
  management {
    auto_upgrade = true    # 自動アップグレードを有効化
    auto_repair  = true    # 自動修復も併せて有効化(推奨)
  }

  # --- アップグレード設定 ---
  upgrade_settings {
    max_surge       = 2    # アップグレード中に追加可能なノード数
    max_unavailable = 0    # アップグレード中に使用不可になるノード数(0推奨)

    # Blue/Greenアップグレード戦略(オプション)
    strategy        = "SURGE"  # SURGE(デフォルト)またはBLUE_GREEN

    # Blue/Green戦略を使用する場合の追加設定
    # blue_green_settings {
    #   standard_rollout_policy {
    #     batch_percentage    = 0.5
    #     batch_soak_duration = "300s"
    #   }
    #   node_pool_soak_duration = "600s"
    # }
  }

  # オートスケーリング設定
  autoscaling {
    min_node_count  = var.min_node_count
    max_node_count  = var.max_node_count
    location_policy = "BALANCED"
  }

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

    # Container-Optimized OSを使用(セキュリティ強化)
    image_type = "COS_CONTAINERD"

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

    # Shielded Instance設定
    shielded_instance_config {
      enable_secure_boot          = true
      enable_integrity_monitoring = true
    }

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

    # ノードのラベル
    labels = {
      environment = var.environment
      managed_by  = "terraform"
    }

    # Taints(必要に応じて)
    # taint {
    #   key    = "dedicated"
    #   value  = "special-workload"
    #   effect = "NO_SCHEDULE"
    # }
  }
}

# ------------------ ③ 既存環境への適用(既存ノードプールの更新) ------------------
# 既存のノードプールがある場合の更新例
resource "google_container_node_pool" "existing_pool_update" {
  name       = "existing-node-pool"
  location   = var.region
  cluster    = google_container_cluster.primary.name

  # management ブロックを追加または更新
  management {
    auto_upgrade = true    # この行を追加
    auto_repair  = true    # 自動修復も有効化(推奨)
  }

  # アップグレード設定を追加
  upgrade_settings {
    max_surge       = 1
    max_unavailable = 0
    strategy        = "SURGE"
  }

  # 既存の他の設定は維持...
}

# ------------------ ④ 変数定義 ------------------
variable "project_id" {
  description = "GCP Project ID"
  type        = string
}

variable "region" {
  description = "GCP Region"
  type        = string
  default     = "asia-northeast1"
}

variable "initial_node_count" {
  description = "Initial number of nodes"
  type        = number
  default     = 3
}

variable "min_node_count" {
  description = "Minimum number of nodes for autoscaling"
  type        = number
  default     = 2
}

variable "max_node_count" {
  description = "Maximum number of nodes for autoscaling"
  type        = number
  default     = 10
}

variable "machine_type" {
  description = "Machine type for nodes"
  type        = string
  default     = "e2-standard-4"
}

variable "environment" {
  description = "Environment name"
  type        = string
  default     = "production"
}

 

gcloud CLIでの修復手順

gcloud CLIを使用して自動ノードアップグレードを有効化する詳細な手順を説明します。

1. 環境変数の設定

# プロジェクトとクラスタ情報の設定
export PROJECT_ID="your-project-id"
export CLUSTER_NAME="your-cluster-name"
export ZONE="asia-northeast1-a"  # またはリージョン
export NODE_POOL_NAME="default-pool"

# 認証とプロジェクト設定
gcloud auth login
gcloud config set project ${PROJECT_ID}

 

2. 現在の設定確認

# クラスタのリリースチャンネル確認
gcloud container clusters describe ${CLUSTER_NAME} \
  --zone=${ZONE} \
  --format="value(releaseChannel.channel)"

# ノードプールの自動アップグレード状態確認
gcloud container node-pools describe ${NODE_POOL_NAME} \
  --cluster=${CLUSTER_NAME} \
  --zone=${ZONE} \
  --format="value(management.autoUpgrade)"

# すべてのノードプールの状態を一覧表示
for pool in $(gcloud container node-pools list --cluster=${CLUSTER_NAME} --zone=${ZONE} --format="value(name)"); do
  echo -n "Node pool: $pool - Auto-upgrade: "
  gcloud container node-pools describe $pool \
    --cluster=${CLUSTER_NAME} \
    --zone=${ZONE} \
    --format="value(management.autoUpgrade)"
done

 

3. 自動アップグレードの有効化

# 既存ノードプールで自動アップグレードを有効化
gcloud container node-pools update ${NODE_POOL_NAME} \
  --cluster=${CLUSTER_NAME} \
  --zone=${ZONE} \
  --enable-autoupgrade

# 自動修復も同時に有効化(推奨)
gcloud container node-pools update ${NODE_POOL_NAME} \
  --cluster=${CLUSTER_NAME} \
  --zone=${ZONE} \
  --enable-autoupgrade \
  --enable-autorepair

 

4. メンテナンスウィンドウの設定

# 毎週土曜日の深夜2時から4時間のメンテナンスウィンドウを設定
gcloud container clusters update ${CLUSTER_NAME} \
  --zone=${ZONE} \
  --maintenance-window-start="2025-01-04T02:00:00Z" \
  --maintenance-window-end="2025-01-04T06:00:00Z" \
  --maintenance-window-recurrence="FREQ=WEEKLY;BYDAY=SA"

# より詳細なメンテナンスポリシーの設定
gcloud container clusters update ${CLUSTER_NAME} \
  --zone=${ZONE} \
  --maintenance-exclusion-name="year-end-freeze" \
  --maintenance-exclusion-start="2025-12-20T00:00:00Z" \
  --maintenance-exclusion-end="2026-01-10T00:00:00Z" \
  --maintenance-exclusion-scope="NO_UPGRADES"

 

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

# リリースチャンネルをREGULARに設定
gcloud container clusters update ${CLUSTER_NAME} \
  --zone=${ZONE} \
  --release-channel=regular

# リリースチャンネルのオプション:
# - rapid: 最新機能を早期に利用(開発環境向け)
# - regular: バランスの取れた更新頻度(本番環境推奨)
# - stable: 最も保守的な更新(重要な本番環境向け)

 

6. 設定の確認

# 詳細な設定確認
gcloud container clusters describe ${CLUSTER_NAME} \
  --zone=${ZONE} \
  --format=yaml | grep -A 10 -E "maintenancePolicy|releaseChannel"

# ノードプールの管理設定確認
gcloud container node-pools describe ${NODE_POOL_NAME} \
  --cluster=${CLUSTER_NAME} \
  --zone=${ZONE} \
  --format=yaml | grep -A 5 "management:"

 

まとめ

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

自動アップグレードを有効化することで、セキュリティパッチの適用を自動化し、既知の脆弱性から保護できます。メンテナンスウィンドウを適切に設定することで、ビジネスへの影響を最小限に抑えながら、継続的なセキュリティ強化を実現できます。

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

参考情報

Google Cloud公式ドキュメント

この記事をシェアする

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

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

料金プランを詳しく見る