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 %}