K8s version === ###### tags: `K8s` ###### tags: `Kubernetes`, `k8s`, `version`, `alpha`, `beta`, `主版本號`, `預覽階段`, `穩定度階段`, `修訂號`, `v0alpha1`, `v0alpha2`, `v0beta1`, `v0beta2`, `v1`, `v1alpha1`, `v1alpha2`, `v1beta1`, `v1beta2`, `v2` <br> [TOC] <br> ## 版本 | 項目 | 說明 | | |-----|-----|-----| | **意義** | 主版本號+穩定度階段+修訂號 | | | **格式** | `^v[0-9]+((alpha\|beta)[0-9]+)?$` | | **範例1** | `v1alpha1`<br>(v1,處於開發階段,但可能有破壞性變動,不保證穩定,第1次修訂)| | **範例2** | `v2beta1`<br>(v2,處於開發階段,較為穩定,第1次修訂) | <br> ## 討論 ### K8s 版本 v1alpha1,怎麼是 v1 又是 alpha1,到底是? - ### gpt-o4-mini-high (2025/06/19) 在 Kubernetes 的 API 版本字串裡,其實是「**主版本 + 穩定度階段 + 修訂號**」的組合,並非「v1」和「alpha1」兩個獨立的版本。具體來說: * **主版本 (Major Version):** 用 `vN` 表示整個 API 的主要版本,例如 `v1`。 * **穩定度階段 (Stability Stage):** * `alpha`:最初的開發階段,可能有破壞性變動,不保證穩定。 * `beta`:較為穩定,但仍可能有相容性調整。 * (略) * **修訂號 (Revision):** 同一階段內的第幾次修訂,用數字表示,如 `alpha1`、`beta2`。 因此,`v1alpha1` 就是── > **主版本為 v1,處於 alpha 階段的第 1 次修訂** --- ```yaml # 範例:一段 CRD 的 apiVersion apiVersion: apiextensions.k8s.io/v1alpha1 kind: CustomResourceDefinition ... ``` * `apiextensions.k8s.io`:API 群組 * `v1alpha1`:主版本 v1,(alpha)預覽階段,第 1 次修訂 > **注意**: > > * 這裡的「v1」並不是指 Kubernetes 核心程式的發行版本(如 v1.26.2),而是指該 API 群組的主要版本號。 > * 隨著功能穩定,`alpha` → `beta` → 最終可能晉升為 `v1`(GA),屆時就會變成 `v1`(無 alpha/beta 字樣)。 這樣就解釋了為何看起來「又是 v1、又是 alpha1」──它們其實是同一串字中的不同意義! <br> ### 如果是 v0,是省略,只變成 alpha1 ? - ### gpt-o4-mini-high (2025/06/19) 不會把「v0」給省略,API 版本字串裡始終要保留主版本號+穩定度階段+修訂號三部分。 * **語法規定** Kubernetes(以及大部分 CRD 定義)要求版本字串符合類似下面的正則: ``` ^v[0-9]+((alpha|beta)[0-9]+)?$ ``` 也就是說── 1. 一定要以 `v` + 一個或多個數字(主版本)開頭 2. 若是不穩定版本,後面接 `alpha` 或 `beta` 加上修訂號 * **如果主版本是 0** 就會寫成 `v0alpha1`、`v0beta2` 這樣,**不會**只剩下 `alpha1`。 * **實務慣例** 雖然 `v0alpha1` 是合法字串,但 Kubernetes 核心和大多數社群專案都從 `v1alpha1` 開始就用同樣的主版本號(v1),一路從 alpha → beta → GA(也就是純 `v1`)發展。 --- | 範例 | 含義 | | ---------- | --------------------- | | `v0alpha1` | 主版本 0,alpha 階段第 1 次修訂 | | `v1alpha3` | 主版本 1,alpha 階段第 3 次修訂 | | `v1beta1` | 主版本 1,beta 階段第 1 次修訂 | | `v1` | 主版本 1,正式(GA) | 因此,**不論你選擇哪個主版本**,都不能省略 `vX`,也不會只看到 `alpha1`。如果真的要用主版本 0,就得寫成 `v0alpha1`。 <br> ### 正式(GA), GA 是什麼意思? - ### gpt-o4-mini-high (2025/06/19) 在 Kubernetes 裡,GA 是 “General Availability” 的縮寫,中文通常翻作 **「正式版」** 或 **「一般可用性」**。它表示該 API(或功能)已經: 1. **完成所有必要測試** 包含功能測試、相容性測試與安全性測試。 2. **穩定且不可輕易破壞** 未來發布只會做向後兼容(non-breaking)的小修小補,不會有破壞性變動。 3. **可在生產環境放心使用** 不再屬於預覽階段(alpha/beta),具備企業等級的 SLA 承諾。 --- ### 與 Alpha/Beta 的比較 | 階段 | 中文名稱 | 版本字串範例 | 穩定度 | 適用情境 | | ----- | ------- | ---------- | ------------ | --------- | | Alpha | **試驗版** | `v1alpha1` | 可能有破壞性更新 | 嚴格測試或快速迭代 | | Beta | **測試版** | `v1beta2` | 趨於穩定,但仍可能有調整 | 測試環境、預演 | | GA | **正式版** | `v1` | 完全穩定,向後兼容 | 生產環境 | * **版本字串**:一旦晉升到 GA,就只剩下主版本號(例如 `v1`),不再附加 `alphaN` 或 `betaN`。 * **實例**: * 核心物件如 Pod、Service、ConfigMap、Secret 等,均在 `apiVersion: v1` 下屬於 GA。 * 應用程式控制器(Deployment、StatefulSet 等)在 `apps/v1` 也是 GA。 --- **小結**: GA(General Availability)代表該功能已經走過試驗(alpha)、測試(beta)階段,到了「正式對外提供、長期支援」的階段,適合用在任何生產系統中。 <br> {%hackmd vaaMgNRPS4KGJDSFG0ZE0w %}