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

このブログシリーズ 「クラウドセキュリティ 実践集」 では、一般的なセキュリティ課題を取り上げ、「なぜ危険なのか?」 というリスクの解説から、 「どうやって直すのか?」 という具体的な修復手順(コンソール、gcloud CLI、Terraformなど)まで、分かりやすく解説します。
この記事では、GKEクラスタで自動ノードアップグレードが無効化されているリスクについて、リスクと対策を解説します。

ポリシーの説明
GKEの自動ノードアップグレード機能は、クラスタのノードプールを自動的に最新の安定バージョンに更新する重要なセキュリティ機能です。この機能により、Googleが定期的にリリースするセキュリティパッチ、バグ修正、パフォーマンス改善が自動的に適用され、クラスタのセキュリティと安定性が継続的に維持されます。
なぜ危険なのか?
具体的なリスクと影響
1. コントロールプレーンとの互換性と強制アップグレードのリスク
- Kubernetesはマスターとノード間で最大2マイナーバージョン差のみサポート
- Googleはノードが3マイナーバージョン以上古い場合、強制アップグレードを実施
2. 運用負荷とコストの増大
- 手動アップグレードにかかる工数がかかります
修復方法
コンソールでの修復手順
Google Cloud コンソールを使用して、既存のノードプールで自動アップグレードを有効にする手順:
- Google Cloud Consoleにログインし、「Kubernetes Engine」→「クラスタ」ページに移動します
- 対象のクラスタ名をクリックして、クラスタの詳細ページを開きます
- 上部のタブから「ノード」タブをクリックします
- 「ノードプール」セクションで、修正したいノードプールの名前をクリックします
- ノードプールの詳細ページで、右上の「編集」ボタン(鉛筆アイコン)をクリックします
- 「管理」セクションまでスクロールし、以下の設定を行います:
- 「自動アップグレードを有効にする」のチェックボックスをオンにします
- 「サージアップグレードを有効にする」もオンにすることを推奨します(ダウンタイムを最小化)
- 「メンテナンスウィンドウ」セクションで、アップグレードを実行する時間帯を設定します:
- 「メンテナンスウィンドウを設定」をクリック
- 開始時刻(例:毎週土曜日 02:00)を選択
- 期間(例:4時間)を設定
- 画面下部の「保存」ボタンをクリックして変更を適用します
- 変更が正常に適用されたことを確認するため、ノードプールの詳細ページで以下を確認:
- 「自動アップグレード」が「有効」になっている
- 「メンテナンスウィンドウ」が設定されている
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機能で簡単に検出及び管理する事が可能です。
運用が非常に楽に出来る製品になっていますので、ぜひ興味がある方はお問い合わせお待ちしております。
最後までお読みいただきありがとうございました。この記事が皆さんの役に立てば幸いです。