前幾天我們利用Docker完成了非同步 S3 微服務的容器化、架設了 Prometheus + Grafana 監控鏈路,並透過 JMeter 壓測驗證有無保護api的差異。
了解 Semaphore 控流、Resilience4j 斷路器、Double-Check 以及優雅停機的保護機制有多重要。不過我們的測試標準都只有局限在 1.5 核 CPU / 512MB RAM 的單一 Docker 容器限制下,接著我們就要來思考如果流量量度超越硬體極限,或是單一結點出問題了,要怎麼處理呢?
今天,我們不寫 Java 程式碼,而是要跳脫單機思維,深入剖析單機架構死穴、理解高可用(HA)的核心靈魂,並手把手教你建立本地端 Kubernetes (Minikube) 開發環境與黃金基礎指令!
或許大家會有疑問,都已經包成 Docker Image 了,可以適應各種環境,難道還不夠高可用嗎?其實是的,因為在生產環境(Production)中,單一容器架構面臨著三個無法逾越的障礙:
當所有流量都打在同一台宿主機上的單一 Docker 容器時,只要宿主機發生 kernel panic、機房斷電或實體網卡異常,你的服務就會當場崩潰。前面寫再多的 Java 斷路器與 Try-Catch,在物理斷電面前都只是徒勞。
面對突發海嘯流量時,單機的解決方式是升級硬體(增加 CPU 核心、擴充 RAM)。但單台伺服器的插槽與晶片極限是固定的,升級成本呈指數級暴增,且永遠趕不上極端流量的成長速度。
當單機容器因為不明原因崩潰(例如 OOM 被 OS 殺掉)時,必須依靠工程師在凌晨三點收到 Alert 警報,從床上爬起來手動敲 docker run 或 docker restart。這期間產生的停機時間(Downtime),會無情吞噬公司的商業 SLA。
要解決單機問題,我們必須釐清一個概念:高可用 (HA) 的核心不是保證單一節點永不崩潰,而是承認節點一定會崩潰,並建立自動化叢集機制,讓系統在節點崩潰時依然無感對外服務!
HTTP 429 或 503 把使用者拒之門外。在企業架構中,HA 通常以「Availability Percentage」來衡量:
要達到四個 9 的高可用性,自動化故障轉移(Failover)與自我修復(Auto-healing)是唯一的出路。
當系統面臨高流量時,有兩種截然不同的應對路線:

| 評比指標 | Scale-Up (垂直擴展) | Scale-Out (水平擴充) |
|---|---|---|
| 擴充方式 | 單機升級硬體 (CPU/RAM) | 增加機器數量 (Nodes/Pods) |
| 成本結構 | 指數級暴漲(頂規硬體極貴) | 平滑線性(一般標準機器) |
| 物理上限 | 有插槽與晶片極限 | 理論上無上限 |
| 高可用 (HA) | ❌ 仍是 SPOF 單點故障 | ✅ 節點故障自動轉移與自癒 |
| 架構複雜度 | 極低(程式碼不用改) | 需要負載均衡器與 K8s 叢集管理 |
為了管理由成百上千台伺服器組成的 Scale-Out 叢集,Kubernetes 採用了非常清晰的 控制面 (Control Plane)與工作節點 (Worker Nodes)雙層架構:

kube-apiserver:所有外部指令(如 kubectl)與內部組件交流的唯一 REST API 門閥。etcd:高可用的分散式 Key-Value 資料庫,儲存叢集權威的期望狀態 (Desired State)。kube-scheduler:評估機器剩餘算力與資源,進行 Pod 精準派工的調度員。kube-controller-manager:7x24 小時巡邏的 Reconciliation Loop(調和迴圈),發現有容器死亡立刻啟動自動補建!kubelet:駐紮在各台機器上的駐點班長,負責向 apiserver 匯報機器狀態,並督導容器啟動。kube-proxy:維護網路路由與流量轉發的網路警察。Container Runtime:底層容器執行引擎(如 containerd 或 Docker)。剛接觸 K8s 時,常搞不懂 Node、Pod 與 Container 的關係。先用簡單的飯店與房間比喻:

minikube 機器)。它負責提供實體的 CPU 與 RAM 算力。s3-service:v1)。在正式生產環境中,部署一個 K8s 叢集通常需要數台實體伺服器,或是在 AWS 租用託管的 EKS 叢集(太花錢啦)。
Minikube 是 K8s 官方推出的「極簡單節點 K8s 模擬器」!
它會把 K8s 的 Control Plane 大腦與 Worker 節點,通通打包封裝在本地端的一個 Docker 容器或虛擬機中。讓工程師不用花一毛錢,就能在自己電腦上體驗 100% 正統的 K8s API 與部署流程!
在進入正式部署之前,我們需要在本地開發環境拉起一個輕量級的單節點 K8s 叢集。
brew install kubectl
brew install minikube
choco install kubernetes-cli minikube
打開 Terminal,輸入以下指令啟動 Minikube(先執行它建立 K8s 伺服器,後續才能用 kubectl 建立 Pods 與 Deployments):
# 啟動 Minikube 叢集(預設使用 Docker 作為 Driver)
minikube start --cpus=2 --memory=2048mb
可能會在這個畫面下載停留很久這是正常的
💾 Downloading Kubernetes v1.37.0 preload ...
> gcr.io/k8s-minikube/kicbase: 470.53 MiB / 470.53 MiB 100.00% 6.15 MiB p
若啟動成功,你會看到類似以下的 Console 輸出:
當 Minikube 啟動後,我們可以透過 kubectl 開始與 K8s 叢集對話:
kubectl cluster-info
預期輸出: 印出 Kubernetes Control Plane 與 CoreDNS 的運作 URL。
kubectl get nodes
預期輸出:
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane 2m10s v1.28.3
kubectl run nginx-test --image=nginx:alpine
kubectl get pods
預期輸出:
NAME READY STATUS RESTARTS AGE
nginx-test 1/1 Running 0 15s
# 查看 Pod Log
kubectl logs nginx-test
# 刪除測試 Pod
kubectl delete pod nginx-test

今天我們完成了從單機 Docker 瓶頸跨越到K8s叢集高可用的學習:
kubectl 的基礎指令明天,我們將正式把前面幾天精心打包的非同步 S3 微服務,撰寫成正統的 K8s Deployment 與 Service YAML 檔,踏出邁向雲端原生部署的最實戰一步!