GKE Cluster Version

## はじめに
GKE の Version について、表記ルール、サポート方針、リリーススケジュール、適用方法(Release Channel) など調べた内容を記載する

一般的に Kubernetes の Version は運用に占める重要度が高く、GKE ではさまざまなサポートや方針がとられているため、
運用するには理解して使用することが重要になる

## GKE Version

### ざっくり概要

- version 表記 : X.Y.Z-gke.N で、 X.Y.Z は Kubernetes と同じ、-gke.N の N は Google Cloud パッチ
- Release Channel : アップグレードのベストプラクティスで3種類ある。適用すると自動アプグレードになってオフにできなくなる。Regular(デフォルト)がおすすめだが、本番環境で安定性取るなら Stable もあり
- サポート期間： version が Regular Channel になってから 14ヶ月。ただし後半 2ヶ月は限定的なメンテナンス期間

### Versioning scheme
Kubernetes, GKE ともに[セマンティック バージョニング](https://semver.org/)を参照しているが、
Kubernetes は現状セマンティックバージョニングと厳密には一致していない [[We haven't so far applied a rigorous interpretation of semantic versioning](https://github.com/kubernetes/sig-release/blob/master/release-engineering/versioning.md#major-version-timeline)]
GKE の X.Y.Z 表記箇所は Kubernetes バージョンを踏襲している

**X.Y.Z-gke.N** で表記され下記の意味を持つ

| X.Y.Z-gke.N | 該当 | リリース頻度 |  内容 |
|:-:|:-:|:-:|:-:|
| X | Kubernetes メジャー バージョン | 現状, 変更予定はない | 現状、**メジャーバージョン(x) は 1** であり、 2.0.0 をリリースする基準は設けられていない [[currently no criteria for shipping 2.0.0](https://github.com/kubernetes/sig-release/blob/master/release-engineering/versioning.md#major-version-timeline)] | 
| Y | Kubernetes のマイナー バージョン | 約 3 ヶ月ごと | マイナーバージョンについては様々な基準が設けられている ([詳細](https://github.com/kubernetes/sig-release/blob/master/release-engineering/versioning.md#minor-version-scheme-and-timeline)) |
| Z | Kubernetes パッチリリース | 毎週 | 最新のマイナーバージョンに対する重大なバグ修正を目的としており、同じマイナーバージョン内での互換性維持がされる ([詳細](https://github.com/kubernetes/sig-release/blob/master/release-engineering/versioning.md#patch-releases))|
| N | GKE のパッチリリース | 適宜 | Google Cloud 独自のパッチリリースで、オープンソース アップストリーム Kubernetes ソフトウェアに加えて GKE のセキュリティ アップデートやバグ修正が含まれている |


### Version Schedule
GKE の最新・今後の Version については [Release Schedule](https://cloud.google.com/kubernetes-engine/docs/release-schedule) で確認が可能

Version Schedule は次の Release Channel に応じて記載もされている

https://cloud.google.com/kubernetes-engine/docs/release-schedule


### Release Channel
GKE では [Release Channel](https://cloud.google.com/kubernetes-engine/docs/concepts/release-channels) という Version と Upgrade の管理に関するベストプラクティスを提供している

- Release Cannnel
    - クラスタへ適用すると、Google によりクラスタとノードプールのバージョンとアップグレードサイクルが自動的に管理される
    - `Rapid`, `Regular`(デフォルト), `Stable` の 3種類が用意されており、`Channel なし`も選択は可能
    - クラスタの新規作成時には Regular Release Cannel が登録されている
    - 自動アップグレードが有効化され無効化できなくなる

| チャンネル | 新しい Kubernetes リリース提供 | 特性 |
|:-:|:-:|:-:|
| Rapid | アップストリーム オープンソースの一般提供から数週間 | 新しい Kubernetes 機能を提供<br> [GKE SLA](https://cloud.google.com/kubernetes-engine/sla) から除外されている<br>本番環境前の環境で新しい Kubernetes バージョンと API のテストに使用するのに最適 |
| Regular<br>（デフォルト） | Rapid でのリリースから 2～3 か月後 | 機能の可用性とリリースの安定性のバランスが取れているため、**ほとんどのユーザーにおすすめ**<br>サポートはこのバージョンから開始される |
| Stable | Regular でのリリースから 2～3 か月後 |  新機能よりも安定性を優先 <br>高優先度のアップデートのみを提供 |

#### 本番環境への推奨 Channel
新しい機能より成熟度が重要となる本番環境のワークロードには、Regular（デフォルト）チャンネルまたは Stable チャンネルを使用することが推奨されている [[参照](https://cloud.google.com/kubernetes-engine/docs/concepts/release-channels#what_channel_should_i_use)]

- Regular
    - 新機能を詳しくトラッキングする必要がある場合
    - Kubernetes OSS バージョンの安定性と鮮度のバランスが保たれる
- Stable
    - 要件が成熟している場合

### Version Support

| Kubernetes/GKE | サポート開始時 | サポート期間 | サポート詳細 |
|:-:|:-:|:-:|:-:|
| Kubernetes | マイナーバージョン GA | 12 ヶ月 | リリースブランチ： 最新の 3 つのマイナーバージョンが維持 <br>パッチ： 12ヶ月 <br> [詳細: supported-versions](https://kubernetes.io/releases/version-skew-policy/#supported-versions)|
| GKE | Regular Channel リリース | 14 ヶ月 | クラスタ構築：リリースから6ヶ月<br>ノードプール構築: 12ヶ月<br>セキュリティパッチ：14ヶ月  <br> (メンテナンス期間: 12 ~ 14ヶ月) <br> [詳細： Kubernetes マイナー バージョンの GKE によるサポート期間を教えてください](https://cloud.google.com/kubernetes-engine/versioning#faq)|

現状の Version に対するサポート期間は[リリーススケジュール](https://cloud.google.com/kubernetes-engine/docs/release-schedule#schedule_for_static_no-channel_versions)に記載がある


### Release Note

リリースノートは下記から確認できる

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


## おわりに

GKE の Version についてまとめてみた

基本的には Kubernetes の Version を踏襲しているが、サポート期間やリリーススケジュール等は異なり、
Upgrade に対応する Release Channel も用意されているので、いろいろ理解して利用していきたい

## 参考・参照リンク

https://cloud.google.com/kubernetes-engine/versioning

https://github.com/kubernetes/sig-release/blob/master/release-engineering/versioning.md

https://cloud.google.com/kubernetes-engine/docs/release-schedule

https://cloud.google.com/kubernetes-engine/docs/concepts/release-channels

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