Kubernetes 入門:
Container 編排的下一步
Pod、Deployment、Service、Ingress — 從 Docker Compose 到 K8s 的思維轉換,以及為什麼大公司都在用
Section 1:Docker Compose 的限制
Docker Compose 解決了「一個指令啟動整個開發環境」的問題,但當你把它用在生產環境, 很快就會遇到它的天花板。
在開發環境很好用,但生產環境呢?
Docker Compose 的生產問題
- ✗容器崩潰需要人工介入重啟
- ✗無法根據流量自動擴展
- ✗更新時有服務中斷
- ✗只能運行在單台主機
Kubernetes 解決的問題
- ✓容器崩潰自動重啟,自我修復
- ✓HPA 根據 CPU/記憶體自動擴縮
- ✓滾動更新,零 downtime 部署
- ✓跨多台機器調度,高可用
一句話定位:Docker Compose 是「開發環境的工具」,Kubernetes 是「生產環境的 Docker Compose」—— 但多了自動重啟、自動擴展、滾動更新、跨機器排程,以及一套宣告式的期望狀態管理機制。
Section 2:Kubernetes 核心概念圖
K8s 由兩種節點組成:Control Plane(Master) 負責管理決策,Worker Nodes 負責實際跑程式。你的應用程式永遠跑在 Worker Node 上。
K8s Cluster 架構:
Control Plane 各元件職責
API Server
所有操作的門面,提供 REST API,kubectl 就是在呼叫它
Scheduler
根據資源需求、親和性規則決定 Pod 跑在哪個 Node
etcd
Cluster 的「真相來源」,所有狀態都存在這裡
Worker Node 各元件職責
kubelet
在每個 Node 上跑的 agent,確保 Pod 按照規格運行
kube-proxy
維護 iptables 規則,實現 Service 的 load balancing
Container Runtime
實際跑 container(通常是 containerd 或 Docker)
K8s 的核心設計哲學:宣告式(Declarative)而非命令式(Imperative)。你告訴 K8s「我要 3 個 Pod」,K8s 負責讓實際狀態達到期望狀態,並持續監控維護。 如果一個 Pod 掛了,Controller 會自動建立新的 Pod 來補齊。
Section 3:Pod 和 Deployment
Pod 是 K8s 最小的部署單位——1 到 N 個 container 的集合,共享網路和儲存空間。 但你通常不直接建立 Pod,而是透過 Deployment 來管理它。
Pod 定義(了解結構即可,通常不直接使用):
Deployment — 生產環境真正使用的資源:
replicas
指定副本數,K8s 自動維持這個數量
resources
requests 用於排程,limits 防止資源濫用
RollingUpdate
新版 Pod 一個個替換舊版,用戶無感
Section 4:Service — 讓 Pod 可以互相通訊
Pod 的 IP 是不固定的——Pod 每次重啟、重新排程,IP 就會變。 Service 提供一個穩定的 DNS 名稱和 Virtual IP, 讓其他服務可以用一致的方式找到你的 Pod,不論 Pod 實際 IP 是什麼。
Service 定義:
建立 Service 後,其他 Pod 可以用http://my-app-service或完整 DNShttp://my-app-service.production.svc.cluster.local來存取。
三種 Service 類型:
| Type | 可訪問範圍 | 典型用途 |
|---|---|---|
| ClusterIP | Cluster 內部 | 微服務間通訊(預設,最常用) |
| NodePort | 每個 Node 的固定 Port(30000-32767) | 開發測試、簡單暴露 |
| LoadBalancer | 外部網際網路 | 雲端 LB(AWS ELB、GCP LB、Azure LB) |
前後端服務各自的 Service 範例:
Section 5:Ingress — 統一的流量入口
如果每個 Service 都開一個 LoadBalancer,你會需要很多個 IP 和很多筆 DNS 記錄——費用也會很可觀。 Ingress 讓你用一個 Load Balancer 同時服務多個 Service,根據 domain 或 path 路由流量。
Ingress 設定(需先安裝 ingress-nginx controller):
節省費用
一個 Load Balancer 服務所有 Service,不需要每個 Service 各一個 LB
SSL 集中管理
TLS 終止在 Ingress 層,後端 Service 不需要各自管理憑證
靈活路由
根據 host 或 path 路由,/api/* → backend,/* → frontend
安裝 ingress-nginx:Ingress 資源只是定義路由規則,需要搭配 Ingress Controller 才能運作。 最常用的是 ingress-nginx, 可以用 Helm 安裝:helm install ingress-nginx ingress-nginx/ingress-nginx。
Section 6:常用 kubectl 指令速查
kubectl 是與 K8s API Server 溝通的 CLI 工具。 掌握以下指令,足以應付日常開發和 debug 的需求。
部署與更新:
查看資源狀態:
查看 logs / 進入 container:
常用操作:
Section 7:HPA — 自動水平擴展
Horizontal Pod Autoscaler(HPA)是 K8s 最能體現價值的功能之一: 根據 CPU、記憶體使用率,或自定義指標,自動增減 Pod 數量。 流量高峰時自動擴展,離峰時自動縮減,兼顧效能與成本。
HPA 設定:
HPA 運作前提
HPA 需要 Deployment 的 Pod 設定了 resources.requests, 才能計算使用率百分比。同時 cluster 需要安裝 metrics-server才能收集 Pod 的即時資源使用數據。
Docker Compose vs Kubernetes 功能完整對比:
| 功能 | Docker Compose | Kubernetes |
|---|---|---|
| 容器管理 | ✅ | ✅ |
| 自動重啟 | 需手動配置 restart policy | ✅ 內建,自動 |
| 跨機器部署 | ❌ 單台主機 | ✅ 多 Node 叢集 |
| 滾動更新 | ❌ 停機更新 | ✅ 零 downtime |
| 自動擴展 | ❌ | ✅ HPA 自動擴縮 |
| 負載均衡 | ❌ | ✅ Service + Ingress |
| 服務發現 / DNS | 限 docker-compose 網路 | ✅ CoreDNS 自動解析 |
| 機密管理 | 環境變數 / .env 檔 | ✅ Secret 資源 |
| 健康檢查 | 基本 healthcheck | ✅ Liveness + Readiness Probe |
| 學習曲線 | 低,1 天可上手 | 高,需要數週 |
| 適合環境 | 開發 / 小規模生產 | 中大型生產環境 |
什麼時候該從 Compose 遷移到 K8s?
Tags