ブログ | XIMIX

Google Kubernetes Engine(GKE)クラスターのメンテナンス除外を設定するシェルスクリプトを作成してみた

作成者: XIMIX 山田|2024.12.08

はじめに

この記事では、GKEクラスターの詳細設定の1つであるメンテナンス除外について説明します。
メンテナンス除外の設定が必要である背景を説明したあとに、メンテナンス除外の内容について説明します
続いて、メンテナンス除外の設定をするためのシェルスクリプトについて詳しく解説します。
このシェルスクリプトを利用することで、メンテナンス除外の設定作業を効率化することが可能となります。

背景

なぜメンテナンス除外の設定を行うのか、その背景を説明します。
まず前提として、私たちはGKE Autopilotクラスタでアプリケーションを構築・運用しています。リリースチャネルをStableに設定して、GKEのバージョンアップはGoogle Cloudに任せています。
しかし、自動的なアップデートにより、動作仕様に変更が発生し、本番環境で動作するアプリケーションの挙動に影響が出ることがありました。現在の保守体制では、アップデートによる変更に迅速に対応し、アプリケーションを修正する余裕がない状況です。
そのため、本番環境と同じようにGKEを構成しているテスト環境で、まずアップデートと動作確認を行い、その後本番環境でもアップデートを実施することが望ましいと判断しました。
本番環境での自動アップデートを停止するため、本番環境のGKEクラスタにメンテナンス除外設定を施しました。
当初は手動で設定を行い運用していましたが、運用の手間を減らすために自動化することにしました。

メンテナンス除外とは

GKEの自動メンテナンスの実行が禁止される、特定の時間枠のことです。
主に設定するパラメータは2つあります。
  • 除外の期間
    • 自動メンテナンスの実行が禁止される期間
  • 除外するアップグレードの範囲
    • アップグレードなし(デフォルト)
    • マイナーアップグレードなし
    • マイナー・ノードアップグレードなし
参考:メンテナンス除外公式ドキュメント

メンテナンス除外設定をシェルスクリプトで実行しよう

仕様

  • 除外期間:20日
    • 開始日:設定日
    • 終了日:設定日の20日後
  • 除外するアップグレードの範囲:アップグレードなし(デフォルト)
  • 既に除外設定が存在する場合は、新規で除外設定を作成したのちに既存の除外設定を削除する(除外設定が1つもない状態にしない)

 スクリプト

#!/bin/bash

#エラー検知でスクリプト停止
set -e

CLUSTER_NAME="gke-maintenance-ex" #クラスターの名前
ZONE="asia-northeast1" #ゾーン
NEW_EXCLUSION_NAME="exclusion-$(date '+%Y%m%d')" #除外の名前
PERIOD="20 days" #除外期間

#メンテナンス除外期間を新規作成
gcloud container clusters update $CLUSTER_NAME \
--zone $ZONE \
--add-maintenance-exclusion-name $NEW_EXCLUSION_NAME \
--add-maintenance-exclusion-start $(date +"%Y-%m-%dT%H:%M:%S%z") \
--add-maintenance-exclusion-end $(date -d "$PERIOD" +"%Y-%m-%dT%H:%M:%S%z")

echo "New maintenance exclusion created successfully."

# メンテナンス除外期間の名前を取得
EXCLUSION_NAMES=$(gcloud container clusters describe $CLUSTER_NAME \
    --zone $ZONE \
    --format="json" | jq -r '.maintenancePolicy.window.maintenanceExclusions | keys[]' )

# 新規以外のメンテナンス除外期間を削除
EXCLUSION_NAMES_ARRAY=($EXCLUSION_NAMES)
if [ "$