Kubernetes Deploy 完整教學:K8s 部署入門到進階【2025】

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 的第一步:

Kubernetes 架構總覽圖:Cluster、Node、Pod 的層級關係

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、Deployment 的關係圖

資源 角色 說明
Pod 最小單位 實際運行容器的地方
ReplicaSet 維持數量 確保有指定數量的 Pod 在運行
Deployment 管理更新 管理 ReplicaSet,處理版本更新和回滾

層級關係

Deployment
└── ReplicaSet(由 Deployment 自動建立)
    └── Pod(由 ReplicaSet 自動建立)
        └── Container

通常你只需要建立 Deployment,K8s 會自動建立 ReplicaSet 和 Pod。

Deployment 的優勢

為什麼不直接建立 Pod?

  1. 自動維持數量:Pod 掛了會自動補上
  2. 宣告式管理:修改 YAML 就能更新
  3. 滾動更新:零停機時間更新版本
  4. 版本回滾:出問題可以快速回到前一版
  5. 擴縮容易:改個數字就能擴展

💡 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

Deployment YAML 結構標註圖:各區塊功能說明

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 指令來部署。

kubectl apply 工作流程圖:從 YAML 到 Pod 運行

建立 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

Rolling Update 滾動更新視覺化:逐步替換 Pod 過程

回滾 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 的學習曲線確實比較陡,但一旦掌握,你就能管理大規模的容器化應用。

本文重點:

  1. 理解核心概念:Cluster → Node → Pod → Container
  2. Deployment 是關鍵:管理 Pod 的生命週期和更新
  3. YAML 是語言:學會讀寫 Deployment YAML
  4. 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 實戰經驗。

分享文章:
V

VibeFix

專門解決 AI Vibe Coding 後的疑難雜症,讓你的專案順利上線。

這篇文章有幫到你嗎?

如果還有問題,讓我們直接幫你解決!

聯繫我們