Kubernetes Deploy 完整教學:K8s 部署入門到進階
「Docker 學會了,接下來要學 Kubernetes,但一打開文件就看到 Pod、Node、Cluster、Deployment... 這些到底是什麼?」
別擔心,Kubernetes(簡稱 K8s)確實概念比較多,但只要搞懂核心概念,其實沒那麼難。這篇文章會從基礎開始,一步步帶你理解 K8s 的部署方式,並實際動手寫一個 Deployment YAML。
Kubernetes 基礎概念
在開始部署前,先搞懂 Kubernetes 的核心概念。
什麼是 Kubernetes?
Kubernetes(K8s)是 Google 開源的容器編排平台,用來自動化部署、擴展和管理容器化應用程式。
簡單說,Kubernetes 幫你解決這個問題:
「我有很多 Docker 容器,要怎麼讓它們在多台機器上協調運作?」
沒有 Kubernetes 時,你需要手動:
- 決定容器要跑在哪台機器
- 監控容器是否正常運行
- 容器掛掉時手動重啟
- 流量變大時手動增加容器
有了 Kubernetes,這些都自動化了。
K8s 核心元件(Pod、Node、Cluster)
理解這三個概念是學習 K8s 的第一步:
Cluster(叢集)
Cluster 是整個 Kubernetes 環境,包含所有的 Node 和資源。你可以把它想成「一整個機房」。
Node(節點)
Node 是 Cluster 中的一台機器(實體機或虛擬機)。每個 Node 可以運行多個 Pod。分為兩種:
- Control Plane Node:管理整個 Cluster 的「大腦」
- Worker Node:實際運行應用程式的「工人」
Pod(豆莢)
Pod 是 K8s 最小的部署單位,通常包含一個或多個緊密相關的容器。你可以把它想成「容器的家」。
Cluster
└── Node (機器)
└── Pod (容器群組)
└── Container (Docker 容器)
為什麼需要 Kubernetes
問題一:單一機器容量有限
解決:K8s 可以跨多台機器分配容器。
問題二:容器掛掉怎麼辦
解決:K8s 自動偵測並重啟失敗的容器。
問題三:流量突然變大
解決:K8s 可以自動擴展容器數量。
問題四:如何更新不中斷服務
解決:K8s 支援滾動更新(Rolling Update)。
想了解更多部署基礎,可以參考 程式部署完整指南。
Kubernetes Deployment 是什麼
理解基礎概念後,來認識 K8s 中最常用的資源:Deployment。
Deployment 的角色
Deployment 是 K8s 中用來宣告式管理應用程式的資源。你告訴 K8s「我想要什麼狀態」,K8s 負責實現這個狀態。
例如:
- 「我想要 3 個 nginx Pod」
- 「我想更新到新版本的 image」
- 「如果 Pod 掛了,自動重新建立」
Deployment 就像是你和 K8s 之間的「合約」。
Deployment vs Pod vs ReplicaSet
這三個經常搞混,來釐清它們的關係:
| 資源 | 角色 | 說明 |
|---|---|---|
| Pod | 最小單位 | 實際運行容器的地方 |
| ReplicaSet | 維持數量 | 確保有指定數量的 Pod 在運行 |
| Deployment | 管理更新 | 管理 ReplicaSet,處理版本更新和回滾 |
層級關係
Deployment
└── ReplicaSet(由 Deployment 自動建立)
└── Pod(由 ReplicaSet 自動建立)
└── Container
通常你只需要建立 Deployment,K8s 會自動建立 ReplicaSet 和 Pod。
Deployment 的優勢
為什麼不直接建立 Pod?
- 自動維持數量:Pod 掛了會自動補上
- 宣告式管理:修改 YAML 就能更新
- 滾動更新:零停機時間更新版本
- 版本回滾:出問題可以快速回到前一版
- 擴縮容易:改個數字就能擴展
💡 K8s 概念太複雜? Kubernetes 的學習曲線確實比較陡峭。如果你覺得這些概念還是很抽象,讓 VibeFix 幫你解釋,我們可以用更直觀的方式幫你理解。
Deployment YAML 撰寫教學
Kubernetes 使用 YAML 檔案來定義資源。來學習如何撰寫 Deployment YAML。
YAML 基本結構
一個 Deployment YAML 的基本結構:
apiVersion: apps/v1 # API 版本
kind: Deployment # 資源類型
metadata: # 元資料
name: my-app
spec: # 規格定義
replicas: 3
selector:
matchLabels:
app: my-app
template: # Pod 模板
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: nginx:1.21
metadata 設定
metadata 區塊定義 Deployment 的識別資訊:
metadata:
name: my-app # 必填:Deployment 名稱
namespace: production # 可選:命名空間(預設 default)
labels: # 可選:標籤
app: my-app
version: v1
annotations: # 可選:註解
description: "My application deployment"
name 是必填的,用來識別這個 Deployment。
spec 設定
spec 區塊定義 Deployment 的規格:
spec:
replicas: 3 # Pod 副本數量
selector: # 選擇器:用來找到對應的 Pod
matchLabels:
app: my-app
template: # Pod 模板
metadata:
labels:
app: my-app # 必須與 selector 匹配
spec:
containers:
- name: my-app
image: nginx:1.21
ports:
- containerPort: 80
重要:selector.matchLabels 必須與 template.metadata.labels 匹配,否則會報錯。
完整範例與解說
這是一個生產環境可用的完整 Deployment:
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-api
labels:
app: web-api
environment: production
spec:
replicas: 3
selector:
matchLabels:
app: web-api
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
template:
metadata:
labels:
app: web-api
spec:
containers:
- name: web-api
image: myregistry/web-api:v1.2.0
ports:
- containerPort: 8080
env:
- name: NODE_ENV
value: "production"
- name: DATABASE_URL
valueFrom:
secretKeyRef:
name: db-secret
key: url
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "256Mi"
cpu: "200m"
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 10
periodSeconds: 5
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 3
欄位說明
| 欄位 | 說明 |
|---|---|
replicas: 3 |
維持 3 個 Pod |
strategy |
更新策略(滾動更新) |
resources |
CPU/記憶體限制 |
livenessProbe |
存活檢查 |
readinessProbe |
就緒檢查 |
💡 YAML 設定卡關? K8s 的 YAML 欄位很多,縮排稍微錯了就會報錯。如果你的 YAML 一直有問題,讓 VibeFix 的工程師幫你檢查。
部署實戰:kubectl apply
YAML 寫好了,接下來用 kubectl 指令來部署。
建立 Deployment
# 套用 YAML 檔案
kubectl apply -f deployment.yaml
# 輸出
deployment.apps/web-api created
kubectl apply 是宣告式的:
- 如果資源不存在 → 建立
- 如果資源存在 → 更新
查看部署狀態
# 查看 Deployment 列表
kubectl get deployments
# 輸出
NAME READY UP-TO-DATE AVAILABLE AGE
web-api 3/3 3 3 2m
# 查看詳細資訊
kubectl describe deployment web-api
# 查看 Pod 狀態
kubectl get pods
# 輸出
NAME READY STATUS RESTARTS AGE
web-api-6d8f9b7c5d-abc12 1/1 Running 0 2m
web-api-6d8f9b7c5d-def34 1/1 Running 0 2m
web-api-6d8f9b7c5d-ghi56 1/1 Running 0 2m
# 查看 Pod 日誌
kubectl logs web-api-6d8f9b7c5d-abc12
# 即時追蹤日誌
kubectl logs -f web-api-6d8f9b7c5d-abc12
更新 Deployment
方式一:修改 YAML 再 apply
# 修改 image 版本
# image: myregistry/web-api:v1.2.0 → v1.3.0
kubectl apply -f deployment.yaml
方式二:直接用指令更新
# 更新 image
kubectl set image deployment/web-api web-api=myregistry/web-api:v1.3.0
# 查看更新狀態
kubectl rollout status deployment/web-api
# 輸出
Waiting for deployment "web-api" rollout to finish: 1 out of 3 new replicas have been updated...
Waiting for deployment "web-api" rollout to finish: 2 out of 3 new replicas have been updated...
deployment "web-api" successfully rolled out
回滾 Deployment
如果新版本有問題,可以快速回滾:
# 查看部署歷史
kubectl rollout history deployment/web-api
# 輸出
REVISION CHANGE-CAUSE
1 <none>
2 <none>
3 <none>
# 回滾到前一個版本
kubectl rollout undo deployment/web-api
# 回滾到指定版本
kubectl rollout undo deployment/web-api --to-revision=1
# 確認回滾狀態
kubectl rollout status deployment/web-api
想了解更多 Deployment 設定細節,可以參考 K8s Deployment 設定詳解。
Kubernetes 部署最佳實踐
以下是生產環境建議的最佳實踐。
Resource Limits 設定
一定要設定資源限制,否則一個 Pod 可能吃光整台機器的資源:
resources:
requests: # 最小需求(排程用)
memory: "128Mi"
cpu: "100m" # 100 millicores = 0.1 CPU
limits: # 上限(不能超過)
memory: "256Mi"
cpu: "200m"
建議
- requests 設定為平均使用量
- limits 設定為最大可接受使用量
- 記憶體 limits 超過會被 OOM Kill
- CPU limits 超過會被節流(throttle)
Health Checks(Liveness/Readiness)
Liveness Probe:檢查容器是否還活著
如果失敗 → 重啟容器
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 10 # 啟動後等待 10 秒才開始檢查
periodSeconds: 5 # 每 5 秒檢查一次
failureThreshold: 3 # 連續失敗 3 次才判定失敗
Readiness Probe:檢查容器是否準備好接收流量
如果失敗 → 從 Service 移除(不會收到新請求)
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 3
差異
- Liveness 失敗 → 重啟容器
- Readiness 失敗 → 暫停接收流量(不重啟)
Rolling Update 策略
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1 # 更新時最多多出 1 個 Pod
maxUnavailable: 0 # 更新時不允許有 Pod 不可用
設定建議
| 情境 | maxSurge | maxUnavailable | 說明 |
|---|---|---|---|
| 零停機 | 1 | 0 | 最安全,但更新較慢 |
| 快速更新 | 25% | 25% | 平衡速度和穩定性 |
| 資源受限 | 0 | 1 | 不多開 Pod,但會有短暫不可用 |
想了解 Docker 基礎,可以參考 Docker Deploy 教學。
FAQ 常見問題
Kubernetes 和 Docker 有什麼關係?
Docker 是容器技術,負責打包和運行單一容器。Kubernetes 是容器編排平台,負責管理多個 Docker 容器的部署、擴展和運維。可以說 K8s 是 Docker 的「上司」。
一定要用 Deployment 嗎?
不一定,K8s 還有其他資源類型:
- StatefulSet:有狀態應用(如資料庫)
- DaemonSet:每個 Node 都要跑一份
- Job/CronJob:一次性或定時任務
但對於一般 Web 應用,Deployment 是最常用的。
本機怎麼練習 Kubernetes?
推薦使用:
- Docker Desktop:內建 K8s(最簡單)
- minikube:本機單節點 K8s
- kind:用 Docker 容器模擬 K8s
replicas 該設多少?
取決於:
- 預期流量
- 單個 Pod 的處理能力
- 資源成本
一般建議至少 2 個(避免單點故障),生產環境常見 3-5 個。
YAML 太複雜了,有沒有更簡單的方式?
可以考慮:
- Helm:K8s 的套件管理器,使用 Chart 模板
- Kustomize:K8s 原生的設定管理工具
- PaaS 平台:如 Railway、Render 幫你處理這些
Kubernetes 部署學習重點與下一步
Kubernetes 的學習曲線確實比較陡,但一旦掌握,你就能管理大規模的容器化應用。
本文重點:
- 理解核心概念:Cluster → Node → Pod → Container
- Deployment 是關鍵:管理 Pod 的生命週期和更新
- YAML 是語言:學會讀寫 Deployment YAML
- kubectl 是工具:apply、get、describe、rollout
建議學習路徑:
| 階段 | 內容 |
|---|---|
| 1 | Docker 基礎(容器、映像) |
| 2 | K8s 概念(Pod、Deployment) |
| 3 | YAML 撰寫(本文內容) |
| 4 | Service 和 Ingress(網路) |
| 5 | ConfigMap 和 Secret(設定) |
🔧 雲端部署搞不懂? Kubernetes 的設定確實很複雜,尤其是結合雲端平台(GKE、EKS、AKS)時。如果你需要協助規劃 K8s 架構或解決部署問題,讓 VibeFix 協助你諮詢雲端方案,我們有豐富的 Kubernetes 實戰經驗。