cover

Docker Compose 是一台主機上的容器管理。但當你的服務需要跑在多台機器上、需要自動擴縮、需要零停機部署的時候,Compose 就不夠用了。Kubernetes 解決的就是這個問題。

先講結論

K8s 是容器編排系統,不是 Docker Compose 的升級版——它是一個完全不同等級的東西。核心概念由外到內:Cluster → Node → Namespace → Deployment → Pod → Container。如果你的團隊只有一兩個服務、流量不大、不需要自動擴縮,Compose 就夠了,不要為了「潮」而上 K8s。


Docker Compose 的天花板在哪

Compose 很好用,但它有幾個硬限制:

  • 容器掛了要人工介入重啟(或者靠 restart: unless-stopped,但這不是真正的 self-healing)
  • 無法跨多台機器分配容器
  • 更新版本要停機重建
  • 一台主機掛了,上面所有服務一起掛

K8s 把這些問題都解了:Pod 掛了自動重建、多 Node 容錯、Rolling Update 零停機、HPA 自動擴縮。代價是——你需要學一套全新的概念跟工具鏈。


核心概念:六個詞搞懂 K8s

Pod —— 最小部署單位。通常一個 Pod 跑一個 container。Pod 是短暫的,隨時可能被殺掉重建,不要把它當 VM 用。

Deployment —— 定義「我要幾個 Pod、用什麼 image、什麼配置」。K8s 會確保實際狀態永遠符合你定義的期望狀態。

Service —— Pod 的 IP 會變,Service 提供穩定的入口。其他服務透過 Service name 來呼叫,不需要知道 Pod IP。

Ingress —— HTTP 路由層。把外部流量根據 hostname 或 path 分配到不同的 Service。

Namespace —— 邏輯隔離。可以用 Namespace 區分 dev / staging / prod 環境。

Node —— 叢集裡的一台機器。K8s 的 scheduler 負責決定 Pod 放在哪個 Node 上。


最小可用的 YAML

一個 Deployment + 一個 Service,就能把服務跑起來:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo-api
spec:
  replicas: 2
  selector:
    matchLabels:
      app: demo-api
  template:
    metadata:
      labels:
        app: demo-api
    spec:
      containers:
        - name: api
          image: myrepo/demo-api:1.0.0
          ports:
            - containerPort: 8080
          env:
            - name: DATABASE_URL
              valueFrom:
                secretKeyRef:
                  name: db-secret
                  key: url
          resources:
            requests:
              cpu: "200m"
              memory: "256Mi"
            limits:
              cpu: "500m"
              memory: "512Mi"
---
apiVersion: v1
kind: Service
metadata:
  name: demo-api-svc
spec:
  selector:
    app: demo-api
  ports:
    - port: 80
      targetPort: 8080
  type: ClusterIP

Deployment 維持 2 個 Pod。其中一個掛了,K8s 會自動再建一個。Service 讓其他服務可以用 demo-api-svc 這個名字呼叫,不用管 Pod IP。

resources 一定要設。 沒有設 requests/limits 的 Pod 就像一個不設預算的部門——它會搶光 Node 上所有資源,把別人的 Pod 一起拖下水。


從 Compose 過渡的思維轉換

Compose 概念K8s 對應差異
serviceDeployment + PodK8s 會自動維持副本數
portsServiceK8s 用 Service 做服務發現
volumesPV / PVCK8s 的持久化儲存更複雜但更靈活
depends_onreadiness / liveness probeK8s 不用依賴順序,用健康檢查

最大的思維轉換是:Compose 管「啟動順序」,K8s 管「期望狀態」。你告訴 K8s 「我要 3 個 Pod 跑這個 image」,它會一直確保這個狀態成立,不管中間發生什麼。


什麼時候該上 K8s?

適合的情況:

  • 多個服務、多個環境、頻繁部署
  • 需要自動擴縮跟高可用
  • 團隊有人懂 K8s 或願意投資學習

不適合的情況:

  • 只有一兩個服務,流量很小
  • 團隊沒有 K8s 經驗,也沒時間學
  • 只有一台主機

先把 Compose 穩定化,再考慮 K8s。 如果你連 Compose 的 healthcheck、logging、network 都沒做好,上 K8s 只是把問題搬到一個更複雜的地方。


延伸閱讀


K8s 最大的陷阱不是學不會,而是學會之後想把所有東西都搬上去。你的個人 blog 不需要 K8s。但 resume 上寫有用過 K8s 確實有幫助就是了。