🎯 重點摘要: 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)

  1. 打開 Docker Desktop → Settings
  2. 啟用「Enable the Kubernetes checkbox」
  3. 點擊「Install」下載映像
  4. 切換 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 getkubectl describekubectl logs
部署 kubectl apply -fkubectl delete -f
管理 kubectl scalekubectl set image
除錯 kubectl exec -itkubectl port-forwardkubectl describe
其他 kubectl configkubectl explainkubectl diff
🎯 學習路徑建議:
  ① 安裝 minikube,跑 Hello World
  ② 學會 Deployment + Service,部署一個 Web 應用
  ③ 學會 kubectl 除錯 (logs、exec、port-forward)
  ④ 試試 Ingress + Helm,部署一個完整的應用
  ⑤ 學習 YAML,掌握 ConfigMap / Secret / Ingress

常見問題 (FAQ)

Q1: minikube 卡在啟動怎麼辦?

  1. 確保 Docker 或 VirtualBox 已啟動
  2. 嘗試指定驅動:minikube start --driver=docker
  3. 刪除並重建: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"}}'