🚀

GKE の Blue/Green アップグレードを試してみる

2023/10/07に公開

概要

GKE を用いてサービス運用を行っていく上で避けては通れないアップグレード戦略についてです。

GKE のノードプールのアップグレード戦略としては「サージアップグレード」と「Blue/Green アップグレード」の 2 つがあります。

今回は 2022 年 7 月 6 日に登場していた Blue/Green アップグレード戦略について実際に試しながら動作を確認していきます。

https://cloud.google.com/kubernetes-engine/docs/release-notes#July_06_2022

https://cloud.google.com/kubernetes-engine/docs/concepts/node-pool-upgrade-strategies#blue-green-upgrade-strategy

ゴール

GKE の Blue/Green アップグレード戦略についての基本的な動作と利用方法を確認することをこの記事のゴールとしています。

事前準備

まずは今回利用する GKE クラスタを作成していきます。

最初にいつも通り GKE に利用する VPC と Service Account を作成します。

locals {
  name         = "tetsuya28"
  pod_cidr     = "172.20.0.0/16"
  service_cidr = "172.21.0.0/16"
}

resource "google_compute_network" "default" {
  name                    = local.name
  auto_create_subnetworks = false
}

resource "google_compute_subnetwork" "default" {
  name          = local.name
  network       = google_compute_network.default.name
  ip_cidr_range = "10.0.0.0/8"
}

resource "google_service_account" "kubernetes" {
  account_id   = "${local.name}-kubernetes"
  display_name = "${local.name}-kubernetes"
}

次に今回利用する GKE を作成します。

resource "google_container_cluster" "default" {
  name                     = local.name
  location                 = "asia-northeast1"
  remove_default_node_pool = true
  initial_node_count       = 1
  network                  = google_compute_network.default.name
  subnetwork               = google_compute_subnetwork.default.name
  networking_mode          = "VPC_NATIVE"
  ip_allocation_policy {
    cluster_ipv4_cidr_block  = local.pod_cidr
    services_ipv4_cidr_block = local.service_cidr
  }
  workload_identity_config {
    workload_pool = "${local.project_id}.svc.id.goog"
  }
  min_master_version = "1.24.10-gke.2300"
  release_channel {
    channel = "UNSPECIFIED"
  }
}

そして最後に今回 Blue/Green を行いたいノードプールを作成します。

Blue/Green アップグレードは 2023 年 4 月 13 日現在 google-beta provider でサポートされているため provider = google-beta を指定しています。

resource "google_container_node_pool" "default" {
  provider   = google-beta
  name       = local.name
  location   = "asia-northeast1"
  cluster    = google_container_cluster.default.name
  node_count = 1
  # 今回利用する Blue/Green アップグレード戦略の設定
  upgrade_settings {
    strategy = "BLUE_GREEN"
    blue_green_settings {
      standard_rollout_policy {
        batch_percentage    = 0.5    # 0.0 ~ 1.0
        batch_soak_duration = "0s"
      }
      node_pool_soak_duration = "180s" # 3 minutes
    }
  }
  management {
    auto_repair  = true
    auto_upgrade = false
  }
  node_config {
    preemptible     = true
    machine_type    = "e2-medium"
    service_account = google_service_account.kubernetes.email
    oauth_scopes = [
      "https://www.googleapis.com/auth/cloud-platform",
    ]
  }
}

設定値の説明

上記の Terraform で設定している Blue/Green アップグレード戦略の値について説明していきます。

batch_percentage

https://cloud.google.com/kubernetes-engine/docs/concepts/node-pool-upgrade-strategies#bg-phase-drain-blue-pool

Blue ( 既存 ) のノードプールが drain される割合を設定します。

0.0 を設定すると drain フェーズはスキップされます。

batch_soak_duration

デフォルトでは 0s が設定されています。

node_pool_soak_duration

https://cloud.google.com/kubernetes-engine/docs/concepts/node-pool-upgrade-strategies#bg-phase-soak-node-pool

Blue のノードプールを削除するまでの様子見時間を設定することが出来ます。

デフォルトでは 1 時間が設定されています。

この期間の間でも以下の complete-upgrade コマンドを利用することで様子見フェーズを完了し、次のフェーズ ( Blue のノードプールの削除 ) に移ることが出来ます。

https://cloud.google.com/kubernetes-engine/docs/how-to/upgrading-a-cluster#complete

アップグレード手順

  1. コントロールプレーンをアップグレードする
    GUI や Terraform、CLI などでコントロールプレーンをアップグレードします。

  2. ノードプールに対してアップグレードを実行します
    コントロールプレーンのアップグレードが完了したらいよいよノードプールのアップグレードです。

同様に GUI や Terraform、CLI でアップグレードを実行します。

その他

GKE ではアップグレード戦略に対して推奨されるタスクが公式から提示されています。

クラスタ管理する必要があり、何から手をつけていいか分からない場合はまずはこのリストに書かれていることを確実に実行出来るようにしましょう。

https://cloud.google.com/kubernetes-engine/docs/best-practices/upgrading-clusters#checklist

Discussion