2014 - Kubernetes 編排:機房作業系統的誕生#
案件摘要#
2014 年 6 月,Google 開源 Kubernetes——以 Borg(Google 內部叢集管理系統)的血統, 把數百上千個容器編排(orchestration)成機房級的叢集。 Kubernetes 以宣告式 API描述期望狀態(desired state),控制器不斷把現實收斂到期望—— 容器管單機隔離,K8s 管整個機房。它被稱為「資料中心的作業系統」, 雲原生(cloud native)自此有了作業系統層。
前因 -- 為什麼會有這個案子#
- 容器的規模問題:Docker(2013)讓單機跑數百個容器,但跨主機的部署、擴容、故障恢復仍是手工活。
- Google 的內部經驗:Borg(2003)管理數十萬個 job——Google 深知「機房即電腦」的架構,且願意開源(見 1964-CDC6600 案的 PPU 異構分工傳統)。
- Mesos 的先驅:Twitter 的 Mesos(2011)證明叢集資源共享可行,但 API 太底層。
- 關鍵推理:管理機房不要命令式腳本,要宣告式:
\[ \text{期望狀態} \xrightarrow{\text{控制迴路}} \text{收斂},\qquad \text{現實} \ne \text{期望} \Rightarrow \text{控制器動手} \]
- Brendan Burns、Joe Beda、Craig McLuckie(Google):以 Go 語言寫出 Kubernetes(希臘語「舵手」,呼應 Docker 的貨櫃),2015 年捐給 CNCF。
線索與推理 -- 數學式、程式、理論#
1. 案件現場:宣告式 API 與控制迴路#
Kubernetes 的心臟是reconcile 控制迴路:
\[ \text{desired} \xrightarrow{\text{observe}} \text{actual} \xrightarrow{\text{diff}} \text{actions} \xrightarrow{} \text{收斂(循環至 } \text{diff} = 0\text{)} \]
- 使用者宣告期望(「要有 3 個副本」),控制器持續比對現實,不足就補、超額就刪。
- 自愈(self-healing)是宣告式的副作用:容器掛了,副本數不足,控制器自動重建——故障恢復不需要人。
2. 調度:bin packing 與資源分配#
Pod 是 K8s 的最小單位(一組共用網路與儲存的容器),排程器決定 Pod 落在哪台節點:
\[ \text{node} = \arg\min_{n \in N} \Big(\text{waste}(n)\Big)\ \text{s.t.}\ \text{resources}(pod) \le \text{capacity}(n) \]
- bin packing:把 Pod 裝進節點的資源箱(CPU/記憶體),最小化浪費——NP-hard,K8s 用啟發式(least-requested/balanced)。
- requests 與 limits:Pod 聲明資源需求(排程依據)與上限(執行約束),cgroups 落實——資源帳目清楚,超賣與飢餓可控。
3. 服務發現與擴容:彈性的數學#
- Service:一組 Pod 的虛擬 IP 與負載均衡——Pod 隨生隨滅,Service 位址穩定。
- HPA(Horizontal Pod Autoscaler):依負載自動擴縮副本數:
\[ \text{replicas}_{\text{new}} = \left\lceil \frac{\text{當前副本} \times \text{當前負載}}{\text{目標負載}} \right\rceil \]
- 彈性:尖峰時擴容、低谷時縮容——雲端計費按用量,成本與負載同步。
4. Kubernetes YAML:宣告式的心智模型#
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
spec:
replicas: 3 # 期望:永遠 3 個副本
selector:
matchLabels: {app: web}
template:
metadata:
labels: {app: web}
spec:
containers:
- name: web
image: myapp:1.2 # Docker 鏡像(見 2013-Docker容器.md)
resources:
requests: {cpu: "100m", memory: "128Mi"} # 排程依據
limits: {cpu: "500m", memory: "512Mi"} # cgroups 上限
- 使用者只寫「要什麼」(3 副本、這個鏡像、這些資源),不寫「怎麼做」——與命令式腳本的根本差異。
- 控制器看到 Pod 掛了就補、節點掛了就搬——故障恢復是系統行為,不是人的反應。
5. Python 實作:bin packing 與自愈模擬#
import math
nodes = [{'cpu': 4.0, 'mem': 8.0, 'used': 0.0, 'mem_used': 0.0, 'pods': []} for _ in range(3)]
pods = [{'cpu': 1.0, 'mem': 2.0} for _ in range(5)] # 5 個 Pod
def schedule(nodes, pod): # bin packing:選浪費最小的節點
best, waste_best = None, None
for n in nodes:
if n['cpu'] - n['used'] >= pod['cpu'] and n['mem'] - n['mem_used'] >= pod['mem']:
waste = (n['cpu'] - n['used'] - pod['cpu']) + (n['mem'] - n['mem_used'] - pod['mem'])
if waste_best is None or waste < waste_best:
best, waste_best = n, waste
if best:
best['used'] += pod['cpu']; best['mem_used'] += pod['mem']
best['pods'].append(pod)
return best
for p in pods:
n = schedule(nodes, p)
print(f"Pod({p['cpu']}cpu/{p['mem']}mem) → 節點 {nodes.index(n)}")
# Pod(1cpu/2mem) → 節點 0(連續裝箱,浪費最小)
def hpa(current, current_load, target_load):
return math.ceil(current * current_load / target_load)
print(f"3 副本、負載 120%、目標 80% → 擴容至 {hpa(3, 1.2, 0.8)} 副本")
print(f"3 副本、負載 40%、目標 80% → 縮容至 {hpa(3, 0.4, 0.8)} 副本")
# 3 副本、負載 120%、目標 80% → 擴容至 5 副本
# 3 副本、負載 40%、目標 80% → 縮容至 2 副本
# (宣告式 + 控制迴路:擴縮容是收斂行為,不是人工反應)
def self_heal(desired, alive):
return desired - alive # reconcile:差多少補多少
print(f"期望 5 副本、存活 3 → 控制器重建 {self_heal(5, 3)} 個")
# 期望 5 副本、存活 3 → 控制器重建 2 個
結案 -- 後果與影響#
- 雲原生作業系統:Kubernetes 成為機房與雲的標準調度層——CNCF(2015)生態(Helm、Istio、Prometheus)全部圍繞它。
- 部署革命完成:金絲雀發布、藍綠部署、滾動更新成為宣告式配置——DevOps(見 2009 案)的最後一哩被自動化。
- 微服務的載體:服務網格、分散式追蹤——微服務架構的基礎設施問題被 K8s 收編。
- 產業格局:AWS/GCP/Azure 全面提供 K8s 服務;Docker 引擎被收編為執行時之一(containerd/CRI-O)——編排層贏了,容器成為零件。
- 宣告式思想傳承:IaC、GitOps、serverless——「聲明期望、系統收斂」成為基礎設施的通用心智模型。
關鍵人物與文獻#
- Brendan Burns、Joe Beda、Craig McLuckie(Google, 2014):Kubernetes 的創造者;Kelsey Hightower 的佈道。
- Google Borg 團隊:B. Burns et al., "Borg, Omega, and Kubernetes", CACM, 2016——三代叢集管理的血統。
- Abhishek Verma 等(Google):Borg 系統論文, EuroSys 2015。
- CNCF(Cloud Native Computing Foundation, 2015):Kubernetes 的中立家園。
- 相關案件:
2013-Docker容器.md、2009-DevOps與持續部署.md、1964-CDC6600超級電腦.md。