iT邦幫忙

2025 iThome 鐵人賽

DAY 7
0
DevOps

新創視角下的 DevOps × AI 探索系列 第 7

Day7: ReplicaSet 與 Deployment:自動擴展與滾動更新

  • 分享至 

  • xImage
  •  

前言

當我們在 Kubernetes 上部署應用時,最常見的需求就是:

  1. 服務不中斷 → 使用者不希望在更新版本時突然無法連線。
  2. 高可用性 → 系統能自動維持指定數量的 Pod,即便某些 Pod 掛掉了也能自動補上。
  3. 彈性擴展 → 在流量變大時能自動增加副本,流量變小時則自動縮減,避免浪費資源。

在 Kubernetes 中,這些需求主要透過 ReplicaSet 與 Deployment 來實現,而 自動擴展 (HPA) 與 滾動更新 (Rolling Update) 更是 DevOps 環境不可或缺的能力。今天就帶大家深入了解這兩個核心物件。

ReplicaSet:確保 Pod 數量穩定

ReplicaSet 是什麼?

  • 一個 Kubernetes 控制器 (Controller),負責確保指定數量的 Pod 實例持續運行。
  • 如果某個 Pod 因為節點異常被刪除,ReplicaSet 會自動再起一個新的 Pod。

ReplicaSet 的用途

  • 維持應用服務的穩定性
  • 提供水平擴展的能力(但通常我們不直接用 ReplicaSet,而是用 Deployment 來管理)

簡單範例

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx-rs
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.25
        ports:
        - containerPort: 80

Deployment:版本管理的利器

Deployment 是什麼?

Deployment 是比 ReplicaSet 更高層級的抽象。它不僅能建立並管理 ReplicaSet,還提供:

  • 滾動更新 (Rolling Update):在不中斷服務的情況下替換舊版本 Pod。
  • 回滾 (Rollback):若新版本有問題,可快速回到前一版本。
  • 策略化部署:可控制同時更新的 Pod 數量,確保穩定。

Deployment vs ReplicaSet

| 特性          | ReplicaSet        | Deployment            |
|---------------|-------------------|-----------------------|
| 維持 Pod 數量 | ✅                | ✅ (透過內部 ReplicaSet) |
| 滾動更新      | ❌                | ✅                     |
| 回滾          | ❌                | ✅                     |
| 推薦使用情境  | 測試或特殊需求    | 正式生產環境           |

自動擴展與滾動更新

自動擴展 (Horizontal Pod Autoscaler, HPA)

  • 可依據 CPU / Memory 使用率動態調整 Deployment 的副本數量。
  • 範例:設定最少 2 個 Pod,最多 10 個 Pod,CPU 超過 50% 就自動擴展。

滾動更新 (Rolling Update)

  • Deployment 預設的更新策略。
  • 新版本會逐步取代舊版本,確保應用不中斷。
  • 可用 maxUnavailable 與 maxSurge 控制更新節奏。

回滾 (Rollback)

  • 如果更新後的版本發生錯誤,可以快速回復:
kubectl rollout undo deployment nginx-deployment

實作範例:Nginx Deployment

我們來做一個完整流程:建立 Deployment → 滾動更新 → 自動擴展

Step 1. 建立 Deployment
建立一個 nginx-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.25
        ports:
        - containerPort: 80

部署並確認:

kubectl apply -f nginx-deployment.yaml
kubectl get pods

Step 2. 滾動更新

假設我們要將 nginx 升級到 1.27:

kubectl set image deployment/nginx-deployment nginx=nginx:1.27

檢查更新狀態:

kubectl rollout status deployment/nginx-deployment

如果出現問題,立刻回滾:

kubectl rollout undo deployment/nginx-deployment

Step 3. 自動擴展 (HPA)

建立 HPA:

kubectl autoscale deployment nginx-deployment --cpu-percent=50 --min=2 --max=10

觀察自動擴展:

kubectl get hpa

製造流量壓力:

kubectl run -it --rm load-generator --image=busybox /bin/sh

在容器內執行

while true; do wget -q -O- http://nginx-deployment; done

回到另一個終端機,觀察 Pod 數量變化:

kubectl get pods -w

最佳實務做法

  • 設定合理的 maxUnavailable 與 maxSurge,避免同時太多 Pod 被取代。
  • 搭配資源限制 (Requests / Limits),確保 HPA 有正確的擴展依據。
  • 盡量使用 Deployment 而不是直接操作 ReplicaSet,因為 Deployment 幫你處理了版本更新的繁瑣細節。

結語

  • ReplicaSet 解決了「Pod 數量維持」的問題。
  • Deployment 則在此基礎上,加入了版本更新、回滾與策略控制,成為日常生產環境的主力。
  • HPA 與 Rolling Update 讓系統具備彈性伸縮與零停機升級能力,是 DevOps 實踐中的關鍵。

上一篇
Day6: Pod 深入理解:生命週期、重啟策略
下一篇
Day8: Job 與 CronJob:批次任務與排程任務
系列文
新創視角下的 DevOps × AI 探索11
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言