🎯 重點摘要: Kubernetes (k8s) 是容器編排的工業標準,用來自動管理容器化應用的部署、擴展與運維:
① 理解 k8s 核心概念 (Pod、Deployment、Service、Node、Cluster)
② 安裝本地集群 (minikube / k3s / Docker Desktop)
③ 掌握 kubectl 命令速查 (查詢、部署、擴展、更新、除錯)
④ 學會撰寫 YAML 宣告 (Pod、Deployment、Service)
⑤ 進階技巧 (ConfigMap、Secret、Ingress、Helm)
20 分鐘從零開始,讓你的容器化應用自動在集群中「生存、復活、進化」!
前言 — 什麼是 Kubernetes?
Kubernetes (縮寫為 k8s) 是一個開源的容器編排平台,原由 Google 開發並捐贈給 CNCF。你可以把它想像成「容器的大腦」 — 它負責在一群伺服器上,自動部署、擴展、管理和運維你的容器化應用。
為什麼需要 Kubernetes?
當你的應用從單台機器的 Docker 容器,成長到需要部署在多台伺服器上時,會遇到以下問題:
- 手動部署 — 每台機器都要手動下
docker run,很麻煩 - 負載不平衡 — 流量怎麼分給哪台機器?
- 擴展困難 — 流量突增,要怎麼快速加容器?
- 故障恢復 — 某台機器掛了,容器要怎麼自動遷移?
- 服務發現 — 容器之間怎麼互相找到?IP 會變來變去
Kubernetes 完美解決了這些問題 — 它確保你的應用永遠保持在預期的狀態 (desired state)。
💡 比喻: 如果 Docker 是讓應用「可以打包移動」的貨櫃,那 Kubernetes 就是管理整個港口的 集裝箱港口碼頭 — 指揮貨櫃船進出、分配碼頭位置、自動補貨與擴展。
核心概念
Cluster & Node
| 概念 | 說明 |
|---|---|
| Cluster | 整個 Kubernetes 集群,由多個 Node 組成 |
| Node | 叢集中的單台機器 (Master + Worker nodes) |
| Master/Node Control Plane | 集群主控面,負責調度、決策 (通常多機備份) |
| Worker Node | 執行實際容器的工作節點 (kubelet + kube-proxy) |
Pod — 最小部署單位
Pod 是 Kubernetes 中最小的部署單位。一個 Pod 可以包含一個或多個容器,這些容器共享網路命名空間與儲存卷。
# 查看所有 Pod
kubectl get pods
# 查看 Pod 詳細資訊
kubectl describe pod <pod-name>
# 進入 Pod 的容器
kubectl exec -it <pod-name> -- sh
Deployment — 宣告式部署
Deployment 管理 Pod 的生命週期,確保集群中始終有預期數量的 Pod 在運行。
如果 Pod 掛掉,Deployment 會自動重啟一個新的。
Service — 服務發現
Service 提供一個固定的 IP 和 DNS 名稱,將流量負載均衡到後端的 Pod。
| 類型 | 說明 | 使用場景 |
|---|---|---|
ClusterIP |
集群內部 IP | Pod 之間內部通信 |
NodePort |
在每個 Node 上開放一個端口 | 臨時外部訪問 |
LoadBalancer |
雲端 LoadBalancer 分配外部 IP | 正式對外服務 |
安裝教學
Step 1:安裝 kubectl
無論使用哪種本地集群工具,都需要先安裝 kubectl。
| 平台 | 指令 |
|---|---|
| macOS (Homebrew) | brew install kubectl |
| Linux (apt) | sudo apt-get install -y kubectl |
| Linux (下載二進位) | sudo curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" |
| Windows (winget) | winget install Kubernetes.kubectl |
Step 2:選擇本地集群工具
開發學習用,推薦 minikube;生產環境或 ARM 裝置推薦 k3s。
Option A:minikube (推薦新手)
系統需求:2 CPU+、2GB 記憶體、20GB 硬碟空間。
| 平台 | 指令 |
|---|---|
| macOS (Homebrew) | brew install minikube |
| Linux (下載二進位) | curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 && sudo install minikube-linux-amd64 /usr/local/bin/minikube |
| Windows (winget) | winget install Kubernetes.minikube |
# 啟動集群
minikube start
# 檢查節點
kubectl get nodes
# 打開儀表板 (選用)
minikube dashboard
Option B:k3s (輕量級,適合生產 / ARM)
# 安裝 k3s
curl -sfL https://get.k3s.io | sh -
# 設定 kubeconfig
sudo cp /etc/rancher/k3s/k3s.yaml ~/
sudo chown -R $USER:$USER k3s.yaml
export KUBECONFIG=~/k3s.yaml
# 驗證
kubectl get nodes
Option C:Docker Desktop (Windows / macOS)
- 打開 Docker Desktop → Settings
- 啟用「Enable the Kubernetes checkbox」
- 點擊「Install」下載映像
- 切換 context:
kubectl config use-context docker-desktop
💡 macOS 選擇建議: 如果已安裝 Docker Desktop,可以直接開啟內建的 Kubernetes;否則使用 minikube 或 k3s。
kubectl 命令速查
查詢資源
kubectl get pods # 列出所有 Pod
kubectl get pods -o wide # 顯示更多資訊 (Node、IP)
kubectl get pods,deploy,svc # 同時顯示 Pod、Deployment、Service
kubectl describe pod web # 顯示 Pod 詳細資訊
kubectl get deploy web -o yaml # 匯出為 YAML
kubectl cluster-info # 顯示集群資訊
部署資源
kubectl apply -f manifest.yaml # 創建或更新資源
kubectl delete -f manifest.yaml # 刪除資源
kubectl apply -f ./manifests/ # 批量部署資料夾
更新與擴展
# 更新映像版本
kubectl set image deploy/web nginx=nginx:1.25
# 調整副本數
kubectl scale deploy/web --replicas=5
# 應用 YAML 更改
kubectl apply -f deployment.yaml
# 預覽變更
kubectl diff -f deployment.yaml
除錯
# 進入容器
kubectl exec -it web-pod -- sh
# 查看日誌
kubectl logs web-pod
kubectl logs -f web-pod # 即時追蹤
kubectl logs web-pod --previous # 查看上一個容器日誌
# Port forwarding (本地端口轉發)
kubectl port-forward svc/web 8080:80
# YAML 驗證
kubectl apply --dry-run=client -f pod.yaml
YAML 範例
Pod
apiVersion: v1
kind: Pod
metadata:
name: web
spec:
containers:
- name: nginx
image: nginx:1.25
ports:
- containerPort: 80
Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: nginx
image: nginx:1.25
ports:
- containerPort: 80
Service
apiVersion: v1
kind: Service
metadata:
name: web
spec:
type: ClusterIP
selector:
app: web
ports:
- port: 80
targetPort: 80
ConfigMap & Secret
# ConfigMap: 普通配置
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
DATABASE_URL: "postgres://localhost:5432"
---
# Secret: 敏感資料 (Base64 編碼)
apiVersion: v1
kind: Secret
metadata:
name: app-secret
type: Opaque
data:
password: cGFzc3dvcmQ=
進階技巧
Ingress — 進站流量管理
Ingress 是 HTTP/HTTPS 路由的規則集合,需要 Ingress Controller (如 NGINX):
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web
port:
number: 80
Helm — 包管理工具
Helm 是 Kubernetes 的包管理器,用 Chart 部署應用:
# 安裝 Helm
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
# 添加 repository
helm repo add bitnami https://charts.bitnami.com/bitnami
# 部署 Redis
helm install my-redis bitnami/redis
# 列出部署
helm list
常見命令速查表
| 類別 | 命令 |
|---|---|
| 查詢 | kubectl get、kubectl describe、kubectl logs |
| 部署 | kubectl apply -f、kubectl delete -f |
| 管理 | kubectl scale、kubectl set image |
| 除錯 | kubectl exec -it、kubectl port-forward、kubectl describe |
| 其他 | kubectl config、kubectl explain、kubectl diff |
🎯 學習路徑建議:
① 安裝 minikube,跑 Hello World
② 學會 Deployment + Service,部署一個 Web 應用
③ 學會 kubectl 除錯 (logs、exec、port-forward)
④ 試試 Ingress + Helm,部署一個完整的應用
⑤ 學習 YAML,掌握 ConfigMap / Secret / Ingress
常見問題 (FAQ)
Q1: minikube 卡在啟動怎麼辦?
- 確保 Docker 或 VirtualBox 已啟動
- 嘗試指定驅動:
minikube start --driver=docker - 刪除並重建:
minikube delete --purge然後minikube start
Q2: Pod 一直重啟 (CrashLoopBackOff)?
檢查命令:
# 查看 Pod 詳細資訊
kubectl describe pod <pod-name>
# 查看容器日誌
kubectl logs <pod-name>
kubectl logs <pod-name> --previous # 上一個容器
常見原因:映像版本錯誤、環境變數未設定、ConfigMap/Secret 未綁定、資源不足。
Q3: 如何清理本地測試環境?
# minikube
minikube delete --purge
# k3s
sudo /usr/local/bin/k3s-killall.sh
# Docker Desktop
# 在設定中停用 Kubernetes
Q4: Pod Pending 狀態怎麼辦?
# 查看詳情
kubectl describe pod <pod-name>
常見原因:映像拉不下來、儲存卷未分配、資源不足。
Q5: 如何在本地存取 Service?
# 端口轉發
kubectl port-forward svc/web 8080:80
# 或改為 NodePort
kubectl patch svc web -p '{"spec":{"type":"NodePort"}}'