リリース チャネル

このトピックでは、GKE クラスタのバージョニングとアップグレードのための Google Kubernetes Engine(GKE)のベスト プラクティスを提供する、リリース チャネルについて説明します。

概要

Kubernetes は、アップデートを頻繁にリリースして、セキュリティ アップデートの提供、既知の問題の修正、新機能の導入を行っています。リリース チャンネルは、クラスタにデプロイされたバージョンの安定性と機能セットのバランスを取る機能を提供します。

リリース チャンネルに新しいクラスタを登録すると、クラスタとノードプールのバージョンとアップグレード サイクルを Google が自動的に管理します。すべてのチャンネルがサポート対象の GKE のリリースであり、一般提供と見なされます(ただし、個々の機能は必ずしも一般提供とは限りません)。これらのチャンネルの Kubernetes リリースは正式な Kubernetes リリースであり、一般提供とベータ版の両方の Kubernetes API が含まれています。新しい Kubernetes バージョンは、まず Rapid チャンネルにリリースされ、その後 Regular、Stable チャンネルに昇格されます。これにより、ビジネス、安定性、機能のニーズを満たすチャンネルをクラスタにサブスクライブできます。

利用できるチャンネルとは

以下のリリース チャンネルが利用可能です。各チャンネルでは、機能の可用性と更新チャーンのトレードオフ関係が提供されます。チャンネルごとに認定基準は異なりますが、すべてのチャネルでテスト済みの一般提供バージョンの Kubernetes を提供しています。

チャンネル 新しい Kubernetes リリース提供 プロパティ
迅速 アップストリーム オープンソースの一般提供から数週間後 Kubernetes の最新リリースをできるだけ早く入手しておけば、新しい GKE 機能の一般提供が開始されたときにすぐに使用できます。クラスタは頻繁に更新され、最新のパッチ バージョンが使用され、新しい Kubernetes 機能を提供します。
Regular(デフォルト) Rapid でのリリースから 2~3 か月後 GKE と Kubernetes の機能にリリース後すぐに、ただし長期間にわたって認定されたバージョンでアクセスできます。 機能の可用性とリリースの安定性のバランスが取れているため、ほとんどのユーザーにおすすめです。
Stable 通常版でのリリースから 2~3 か月後。 新機能よりも安定性を優先します。このチャンネルの変更点と新バージョンは、Rapid チャンネルと Regular チャンネルで検証されてから、最後に公開されます。これによって、さらに時間をかけて検証できます。

クラスタをリリース チャンネルに登録すると、新しいバージョンがそのチャンネルで利用可能になった際にそのクラスタも自動的にアップグレードされます。

Rapid チャンネルでマイナー バージョンの累計使用が累積され、安定性が確認されると、Regular チャンネルに昇格されます。最終的に、マイナー バージョンは Stable チャンネルに昇格され、そこでは高優先度のアップデートのみが提供されます。昇格はそれぞれ、そのバージョンを実行しているクラスタで観測されたパフォーマンスに基づいて、段階的な安定性レベルと本番環境の対応状況を表します。

重要なセキュリティ パッチは、クラスタと Google のインフラストラクチャを保護するため、すべてのリリース チャンネルに配信されます。

正確なリリース スケジュールは、オープンソース リリースとパッチ スケジュールなど、複数の要因によって変わる可能性があり、変更されることがあります。最新情報を入手するには、GKE リリースノートを確認するか、チャンネルの RSS フィードに登録してください。

チャンネルで利用できるバージョン

各リリース チャネルには、デフォルト バージョンと、そのチャネルで利用可能なバージョンのセットが備わっているため、本番環境をアップグレードする前に、ワークロードの運用性を利用可能な新しいバージョンで確認できます。これらのバージョンは、その特定のチャンネルの認定資格を満たしています。

  • デフォルトになる 1 週間前に、新しいパッチリリースが利用可能になります。
  • 新しいマイナー リリースが、デフォルトになる 4 週間前に利用可能になります。

GKE では、アップグレード関連の中断を軽減するために、利用可能なバージョンをテストすることをおすすめします。プレ本番環境で利用できるよう登録すると、チャンネルで利用可能なすべてのバージョンを受信できます。テストや検証により長い時間が必要な場合は、GKE で除外ウィンドウを使用して自動アップグレードを延期することをおすすめします。

GKE は、クラスタをデフォルトのバージョンに段階的に自動的にアップグレードします。アップグレード プロセスをより細かく制御する必要がある場合は、前もって利用可能なバージョンにアップグレードすることをおすすめします。GKE の自動アップグレード プロセスは、クラスタ リソースのバージョンが自動アップグレード ターゲット以上の場合、それらのリソースを変更しません。クラスタやノードは、自動アップグレード プロセスをスキップするために、事前に手動でアップグレードできます。

リリース チャンネルのデフォルト バージョンと利用可能なバージョンを表示するには、compute-zoneコンピューティング ゾーンに置き換えて、次のコマンドを実行します。

gcloud container get-server-config --format "yaml(channels)" --zone compute-zone

チャンネルの最新情報の確認

リリース チャンネルの新機能については、リリースノートをご覧ください。全体を対象とするリリースノートだけではなく、各リリース チャンネルごとに個別のリリースノートも提供されています。

リリース チャンネル リリースノート
Rapid チャンネル HTML または Atom フィード
Regular チャンネル HTML または Atom フィード
Stable チャンネル HTML または Atom フィード

使用するチャンネル

チャンネルには一般提供版の Kubernetes のみが含まれ、各チャンネルは Kubernetes および GKE リリースのレベルと成熟度を表します。次の図は、リリース チャンネルの導入サイクルを示しています。

リリース チャンネルの導入サイクル

新しい Kubernetes API や機能を利用するワークロード向け、およびリリースが成熟して Regular や Stable チャネルに昇格する前に新しいリリースをテストして検証する早期アクセス向けに、Rapid チャネルの使用をおすすめします。

新機能に対する成熟度を必要とする本番環境のワークロードには、Regular(デフォルト)チャンネルまたは Stable チャンネルを使用することをおすすめします。

  • 新機能を厳密に追跡する必要がある場合は、Regular チャネルの使用を検討してください。このチャネルでは、Kubernetes OSS バージョンの安定性と鮮度のバランスが保たれています。
  • 要件が成熟度の場合(特に本番環境クラスタの場合)、Stable チャンネルを使用します。

GKE は、クラスタをチャネルの品質基準に適合する新しいバージョンにアップグレードします。ただし、次の目的のために、事前にクラスタをアップグレードしておくことをおすすめします。

  • アップグレードの管理と、業務時間との調整をしやすくする。
  • リリース ターゲットを満たすクラスタ(つまり、次のターゲット バージョンに手動でアップグレードされたクラスタ)の自動アップグレードが GKE ではスキップされるため、予測がしやすくなります。ノードは、コントロール プレーン(マスター)バージョンに合わせて、脆弱性やサポートされていないバージョン スキューから保護するために、選択したチャンネルの推奨バージョンに自動的にアップグレードされます。

リリース チャンネルへのクラスタの登録

新規または既存のクラスタをリリース チャンネルに登録できます。

新しいクラスタの登録

新しいクラスタを作成してリリース チャンネルに登録するには、gcloud または Google Cloud Console を使用します。

Console

  1. Cloud Console で Google Kubernetes Engine のメニューに移動します。

    Google Kubernetes Engine のメニューに移動

  2. [クラスタを作成] ボタンをクリックします。

  3. [マスターのバージョン] で [リリース チャンネル] を選択します。

  4. [リリース チャンネル] プルダウン リストで、クラスタを登録するリリース チャンネルを選択します。

  5. 必要に応じて、クラスタの作成を続行します。

  6. [作成] をクリックします。

gcloud

クラスタを作成してリリース チャンネルに登録するには、次のコマンドを実行します。

gcloud container clusters create cluster-name \
    --zone compute-zone \
    --release-channel channel \
    additional-flags

以下を置き換えます。

  • cluster-name: 新しいクラスタの名前。
  • compute-zone: クラスタのコンピューティング ゾーン
  • channel: リリース チャンネルのタイプ。rapidregularstable のいずれか。
  • additional-flags: クラスタの作成時に指定する必要があるその他のフラグ。任意指定のフラグの完全なリストについては、gcloud container clusters create のドキュメントをご覧ください。

既存のクラスタの登録

クラスタ コントロール プレーンのバージョンがリリース チャンネルのデフォルトにアップグレード可能であれば、既存のクラスタをリリース チャンネルに登録できます。つまり、リリース チャンネルのデフォルト バージョンは、既存のコントロール プレーン バージョンと同じかそれより 1 つだけ前のマイナー バージョンでなければなりません。

登録するには、目的の channelクラスタ リリース チャンネルを更新します。

クラスタのチャンネルの検索

gcloud または Google Cloud Console を使用して、クラスタのリリース チャンネルを特定できます。

Console

  1. Google Cloud Console で Google Kubernetes Engine のメニューに移動します。

    Google Kubernetes Engine のメニューに移動

  2. 目的のクラスタを選択します。

  3. [クラスタの詳細] で、[リリース チャンネル] フィールドの値(「Regular チャンネル」など)を確認します。

gcloud

gcloud container clusters describe cluster-name \
    --zone compute-zone --format="value(releaseChannel.channel)"

以下を置き換えます。

新しいリリース チャンネルの選択

リリース チャンネル間の移行がサポートされるシナリオには、制限があります。

Stable から Regular へのアップグレードなど、単一のマイナー バージョン アップグレードとなる移行がサポートされます。

Kubernetes のマイナー バージョン間でのダウングレードのリスクがあるため、Regular から Stable への移行などのダウングレードはできません。同様に、Stable から Rapid への移行など、複数のマイナー バージョンのアップグレードはサポートされていません。

新しいリリースチャンネルを選択するには、目的の channelクラスタ リリース チャンネルを更新します。

新しいリリース チャネルの選択がサポートされていない場合は、目的のチャネルに新しいクラスタを作成し、ワークロードを移行することをおすすめします。

リリース チャンネルの登録を解除する

チャンネルの登録を解除する場合、クラスタのノードプールでは、リリース チャンネルを無効にした後でも、自動アップグレードと自動修復は引き続き有効になります。

登録解除するには、channelNone にして、クラスタ リリース チャンネルを更新します。

クラスタ リリース チャンネルの更新

既存のクラスタのリリース チャンネルのプロパティを編集するには、次のコマンドを実行します。

gcloud container clusters update cluster-name \
    --release-channel channel

以下を置き換えます。

  • cluster-name: クラスタの名前。
  • channel: 目的のリリース チャンネル。rapidregularstableNone のいずれか。

注意点

リリース チャンネルを使用するときは、次の注意事項に留意してください。

Rapid チャンネル クラスタとアルファ クラスタの違い

Rapid リリース チャンネルを使用して作成されたクラスタは、アルファ クラスタではありません。以下の点が異なります。

  • リリース チャンネルを使用するクラスタはアップグレード可能です。自動アップグレードが有効であり、無効にはできません。アルファ クラスタはアップグレードできません。
  • リリース チャンネルを使用するクラスタには有効期限がありません。アルファ クラスタは 30 日後に期限が切れます。
  • アルファ版 Kubernetes API は、リリース チャンネルを使用するクラスタでは有効化できません。

アップグレード ターゲットの取得(サンプル スクリプト)

次のサンプル スクリプトを使用すると、クラスタのアップグレード ターゲットを取得できます。このスクリプトは、次のタスクを実行します。

  • get-server-config API を使用して、各リリース チャンネルの最新で有効なバージョンを pull します。
  • クラスタのコントロール プレーンとノードプールの現在のバージョンを確認します。現在のバージョンが最新の有効なバージョンより古い場合、スクリプトはカスタム アップグレード オーケストレーション(最初にコントロール プレーン、次にノードプール)を開始します。クラスタがリリース チャンネルを使用していない場合、スクリプトは最新の安定したバージョンをチェックします。

サンプル スクリプト: クラスタ アップグレード ターゲットの取得

#!/bin/bash

# semver_lt checks whether the first semver is less than the second semver.
# It returns 1 if it is less than, and 0 otherwise.
semver_lt() {
    # Get the smaller version by sorting them in ascending semver
    # and grabbing the first line.
    smaller=$(printf "$1\n$2" | sort -V | head -n1)
    if [[ ${1} == "${smaller}" && ${1} != ${2} ]]; then
            return 1
    fi
    return 0
}

# get_latest_valid gets the latest valid version for a release channel.
get_latest_valid() {
        channel=$1
        echo $(gcloud container get-server-config \
        --format="table(channels:format='table(channel,validVersions)')" |\
        grep ${channel} | cut -d"'" -f 2)
}

upgrade_master() {
    echo "Cluster $1 needs to upgrade to $2."
    # Actuate master upgrade.
}

upgrade_np() {
    echo "Node pool $1/$2 needs to upgrade to $3."
    # Actuate node pool upgrade.
}

# Get the latest valid channel versions from server-config.
stable_target=$(get_latest_valid "STABLE")
regular_target=$(get_latest_valid "REGULAR")
rapid_target=$(get_latest_valid "RAPID")
echo "stable version from gcloud: ${stable_target}"
echo "regular version from gcloud: ${regular_target}"
echo "rapid version from gcloud: ${rapid_target}"

# List the clusters by name, master version, zone, and release channel.
clusters=$(gcloud container clusters list \
  --format="table[no-heading](name,master_version(),zone,release_channel.channel)")

IFS=$'\n'
for cluster in ${clusters}
do
    echo ""
    cname=$(printf "${cluster}" | awk '{print $1}')
    master_version=$(printf "${cluster}" | awk '{print $2}')
    zone=$(printf "${cluster}" | awk '{print $3}')
    channel=$(printf "${cluster}" | awk '{print $4}')

    # Determine the target version (default to latest valid stable version).
    target=${stable_target}
    case ${channel} in
        "RAPID")
            target=${rapid_target}
            ;;
        "REGULAR")
            target=${regular_target}
            ;;
        "STABLE")
            target=${stable_target}
            ;;
        esac

    # Check if the master needs to upgrade to the target version.
    semver_lt "${master_version}" "${target}"
    need_upgrade=$?
    if [[ ${need_upgrade} -eq 1 ]]; then
        upgrade_master ${cname} ${target}
    else
        echo "Cluster ${cname} does not need to upgrade."
    fi

    # Then check if the cluster's node pools need to upgrade too.
    nps=$(gcloud container node-pools list --cluster ${cname} --zone ${zone} \
            --format="table[no-heading](name,version)")
    for np in ${nps}
    do
        np_name=$(printf "${np}" | awk '{print $1}')
        np_version=$(printf "${np}" | awk '{print $2}')

        semver_lt "${np_version}" "${target}"
        need_upgrade=$?
        if [[ ${need_upgrade} -eq 1 ]]; then
            upgrade_np ${cname} ${np_name} ${target}
        else
            echo "Node pool ${np_name} does not need to upgrade."
        fi
    done
done

次のステップ