Skip to content

Kubernetes 編排

前言

Docker 解決了「打包」問題,Kubernetes 解決了「管理」問題。 當你有幾十上百個容器需要部署、擴縮容、故障恢復時,手動管理是不現實的。Kubernetes(K8s)就是容器的「作業系統」,它自動化了容器化應用的部署、擴展和維運。

這篇文章會帶你學什麼?

學完這章後,你將獲得:

  • 架構理解:掌握 K8s 控制平面和工作節點的組成
  • 核心資源:熟悉 Pod、Deployment、Service 等核心概念
  • 宣告式管理:理解「宣告期望狀態,系統自動收斂」的思想
  • 維運能力:了解滾動更新、自動擴縮容、健康檢查等機制
  • 實戰入門:能用 kubectl 和 YAML 部署一個完整應用
章節內容核心概念
第 1 章為什麼需要 K8s容器編排的挑戰
第 2 章K8s 架構控制平面、工作節點、etcd
第 3 章核心資源Pod、Deployment、Service、Ingress
第 4 章宣告式管理YAML、kubectl、控制迴圈
第 5 章維運實踐滾動更新、HPA、健康檢查

1. 為什麼需要 Kubernetes?

Docker 讓單個容器的打包和執行變得簡單,但當你面對以下場景時,手動管理就力不從心了:

挑戰描述K8s 的解決方案
多實例部署一個服務需要執行 10 個副本Deployment 自動管理副本數
故障恢復某個容器掛了需要自動重啟控制器自動偵測並重建 Pod
服務發現容器 IP 會變,怎麼找到對方?Service 提供穩定的 DNS 和 IP
滾動更新更新版本時不能停服逐步替換舊 Pod,零停機
彈性伸縮流量高峰自動擴容HPA 根據 CPU/記憶體自動調整副本數
資源調度把容器放到最合適的機器上Scheduler 智慧調度

K8s 的核心思想:宣告式

你不需要告訴 K8s「啟動 3 個容器」(命令式),而是告訴它「我要 3 個副本在執行」(宣告式)。K8s 會持續監控,確保實際狀態與你宣告的期望狀態一致。如果一個 Pod 掛了,它會自動建立新的來補上。


2. Kubernetes 架構

K8s 叢集由控制平面(Control Plane)和工作節點(Worker Node)組成。

Kubernetes Architecture
Click a component to inspect the details
Control Plane
API Server
etcd
Scheduler
Controller Manager
Worker Node x N
kubelet
kube-proxy
Container runtime
API Server
The front door of Kubernetes. All operations from kubectl, dashboards, and internal components go through the API Server. It handles authentication, authorization, admission control, and acts as the single entry point for the cluster.
Analogy:A company reception desk where every visitor and delivery is checked in

一次請求的完整路徑

使用者請求 → Ingress Controller → Service → kube-proxy → Pod(容器)

                                    Endpoint 清單(由 Service 維護)

3. 核心資源物件

K8s 透過各種「資源物件」來描述叢集的期望狀態。

K8s Core Resources
Click a resource type to inspect the explanation and YAML example
Pod
Smallest scheduling unit
A Pod is the smallest deployable unit in K8s. It contains one or more tightly related containers. Containers inside the same Pod share networking and storage, so they can communicate through localhost.
YAML example
apiVersion: v1
kind: Pod
metadata:
  name: my-app
spec:
  containers:
    - name: app
      image: my-app:1.0
      ports:
        - containerPort: 3000
Tip:Production workloads rarely create Pods directly; they are usually managed by Deployments.

資源物件分類

類別資源用途
工作負載Pod、Deployment、StatefulSet、DaemonSet、Job執行應用
網路Service、Ingress、NetworkPolicy服務發現和流量管理
設定ConfigMap、Secret設定和敏感資料管理
儲存PersistentVolume、PersistentVolumeClaim持久化儲存
調度Node、Namespace、ResourceQuota資源隔離和限制

4. 宣告式管理與 kubectl

控制迴圈(Reconciliation Loop)

K8s 的核心工作機制是控制迴圈:

觀察(Observe)→ 比較(Diff)→ 行動(Act)→ 觀察...
     ↓                ↓              ↓
  讀取實際狀態    與期望狀態對比    執行修正操作

你宣告 replicas: 3,控制器發現只有 2 個 Pod 在執行,就會建立 1 個新的。這個迴圈每隔幾秒執行一次,確保系統始終向期望狀態收斂。

kubectl 常用指令

指令作用範例
kubectl apply -f應用 YAML 設定kubectl apply -f deployment.yaml
kubectl get查看資源清單kubectl get pods -o wide
kubectl describe查看資源詳情kubectl describe pod my-app-xxx
kubectl logs查看 Pod 日誌kubectl logs -f my-app-xxx
kubectl exec進入 Pod 終端kubectl exec -it my-app-xxx -- sh
kubectl delete刪除資源kubectl delete -f deployment.yaml
kubectl scale手動擴縮容kubectl scale deploy my-app --replicas=5

apply vs create

kubectl create 是命令式的——「建立這個資源」,如果已存在會報錯。kubectl apply 是宣告式的——「確保資源是這個狀態」,不存在就建立,已存在就更新。正式環境中應該始終使用 apply


5. 維運實踐

5.1 滾動更新與回滾

Deployment 預設使用滾動更新策略:逐步建立新版本 Pod,同時逐步終止舊版本 Pod。

yaml
spec:
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1        # 最多多建立 1 個 Pod
      maxUnavailable: 0   # 不允許有 Pod 不可用
操作指令
更新映像kubectl set image deploy/my-app app=my-app:2.0
查看更新狀態kubectl rollout status deploy/my-app
查看歷史版本kubectl rollout history deploy/my-app
回滾到上一版本kubectl rollout undo deploy/my-app

5.2 自動擴縮容(HPA)

HPA(Horizontal Pod Autoscaler)根據 CPU、記憶體或自訂指標自動調整 Pod 副本數。

yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: my-app-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-app
  minReplicas: 2
  maxReplicas: 10
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 70

5.3 健康檢查(Probe)

K8s 透過三種探針監控 Pod 的健康狀態:

探針作用失敗後果
livenessProbe偵測容器是否存活重啟容器
readinessProbe偵測容器是否就緒從 Service 摘除,不接收流量
startupProbe偵測容器是否啟動完成啟動期間不執行其他探針

探針的重要性

沒有設定健康檢查的 Pod,K8s 只能透過程序是否存在來判斷健康狀態。但很多時候程序還在,服務已經不回應了(比如死鎖、OOM 邊緣)。設定 livenessProbe 可以讓 K8s 自動重啟這些「假死」的容器。


總結

Kubernetes 是容器編排的事實標準,理解它的核心概念是雲原生開發的基礎。

回顧本章的關鍵要點:

  1. 宣告式管理:告訴 K8s「我要什麼」,而不是「怎麼做」,控制迴圈自動收斂
  2. 架構分層:控制平面負責決策,工作節點負責執行,etcd 儲存狀態
  3. 核心資源:Pod(最小單元)、Deployment(副本管理)、Service(服務發現)、Ingress(外部入口)
  4. 維運自動化:滾動更新零停機、HPA 彈性伸縮、探針自動故障恢復
  5. 設定分離:ConfigMap 和 Secret 讓設定與映像解耦

延伸閱讀