Kubernetes Deployment 設定詳解:YAML 範例與最佳實踐【2025】

Kubernetes Deployment 設定詳解:YAML 範例與最佳實踐

當你開始使用 Kubernetes 部署應用程式時,Deployment YAML 是你必須掌握的核心設定檔。如果你已經閱讀過 Kubernetes Deploy 完整教學,對 K8s 有了基本認識,現在是時候深入了解每個 YAML 欄位的意義與最佳配置方式。

這篇文章將帶你逐一拆解 Deployment YAML 的每個區塊,從 replicas、strategy 到 Health Checks,提供可直接複製使用的範例程式碼,讓你能夠根據實際需求打造最佳的部署設定。


Deployment YAML 結構總覽

deployment-yaml-structure

插圖:Kubernetes Deployment YAML 結構圖

場景描述:
Technical illustration showing Kubernetes Deployment YAML 結構圖. Clean, professional diagram style.

視覺重點:
- Clear presentation of the concept
- Professional technical diagram style
- Easy to understand visual elements

必須出現的元素:
- Relevant technical components
- Clear labels and annotations
- Logical flow or structure

需要顯示的中文字:

風格:
Clean flat design, technical illustration, modern infographic style

顏色調性:
Professional blues and grays, with accent colors for emphasis

避免元素:
Cluttered design, realistic photos, complex 3D rendering

一個完整的 Kubernetes Deployment YAML 檔案由四個主要區塊組成,每個區塊都有其特定的功能與設定項目。

apiVersion 與 kind

apiVersion: apps/v1
kind: Deployment

這兩行是所有 K8s 資源檔案的開頭,用來告訴 Kubernetes 這是什麼類型的資源。

欄位 說明 常見值
apiVersion API 版本,決定可用的功能 apps/v1(Deployment 專用)
kind 資源類型 DeploymentPodService

對於 Deployment,apiVersion 必須使用 apps/v1。如果你看到舊教學使用 extensions/v1beta1,那是已經棄用的版本,請務必更新。

metadata 區塊

metadata:
  name: my-app
  namespace: production
  labels:
    app: my-app
    environment: production
    version: v1.2.0
  annotations:
    description: "主要應用程式 Deployment"
    maintainer: "[email protected]"

metadata 區塊定義這個 Deployment 的識別資訊。

欄位 必填 說明
name Deployment 名稱,用於 kubectl 操作
namespace 命名空間,未設定則使用 default
labels 標籤,用於選擇器與分類(建議必填)
annotations 註解,用於存放描述性資訊

最佳實踐:至少加上 appenvironmentversion 三個 labels,方便後續管理與查詢。

spec 區塊

spec 區塊是 Deployment 的核心,包含了副本數、部署策略、Pod 模板等所有設定。結構如下:

spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: my-app
          image: my-app:1.2.0
          # ...更多 container 設定

特別注意 selector.matchLabels 必須與 template.metadata.labels 一致,否則 Deployment 會無法找到它管理的 Pod。

如果你對整體 程式部署 流程還不熟悉,建議先閱讀完整指南建立概念。


replicas 與擴展設定

replicas-hpa-comparison

插圖:手動擴展 vs HPA 自動擴展比較圖

場景描述:
Technical illustration showing 手動擴展 vs HPA 自動擴展比較圖. Clean, professional diagram style.

視覺重點:
- Clear presentation of the concept
- Professional technical diagram style
- Easy to understand visual elements

必須出現的元素:
- Relevant technical components
- Clear labels and annotations
- Logical flow or structure

需要顯示的中文字:

風格:
Clean flat design, technical illustration, modern infographic style

顏色調性:
Professional blues and grays, with accent colors for emphasis

避免元素:
Cluttered design, realistic photos, complex 3D rendering

replicas 決定了你的應用程式要運行幾個副本。這是影響可用性與成本的關鍵設定。

設定副本數量

spec:
  replicas: 3

這個簡單的設定會告訴 Kubernetes 維持 3 個 Pod 副本。當某個 Pod 故障時,K8s 會自動建立新的 Pod 來補足。

副本數量的建議:

環境 建議 replicas 理由
開發環境 1 節省資源
測試環境 2 測試負載平衡
生產環境 3+ 確保高可用性

生產環境至少設定 3 個副本,這樣即使一個 Pod 故障、一個正在更新,仍有一個副本可以處理請求。

手動擴展 vs 自動擴展(HPA)

除了在 YAML 中寫死 replicas 數量,你也可以使用 kubectl 手動調整:

# 將副本數調整為 5
kubectl scale deployment my-app --replicas=5

# 確認調整結果
kubectl get deployment my-app

但更推薦的做法是使用 HPA(Horizontal Pod Autoscaler)自動擴展:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: my-app-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-app
  minReplicas: 2
  maxReplicas: 10
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 70

這個 HPA 設定會:
- 最少維持 2 個副本
- 最多擴展到 10 個副本
- 當平均 CPU 使用率超過 70% 時自動擴展

💡 不確定 replicas 該設多少?

副本數量與資源配置需要根據實際流量與預算來評估。

預約免費諮詢,讓我們的工程師幫你評估最佳配置。


strategy 部署策略

rolling-update-vs-recreate

插圖:RollingUpdate 與 Recreate 策略比較圖

場景描述:
Technical illustration showing RollingUpdate 與 Recreate 策略比較圖. Clean, professional diagram style.

視覺重點:
- Clear presentation of the concept
- Professional technical diagram style
- Easy to understand visual elements

必須出現的元素:
- Relevant technical components
- Clear labels and annotations
- Logical flow or structure

需要顯示的中文字:

風格:
Clean flat design, technical illustration, modern infographic style

顏色調性:
Professional blues and grays, with accent colors for emphasis

避免元素:
Cluttered design, realistic photos, complex 3D rendering

部署策略決定了更新 Deployment 時,舊 Pod 與新 Pod 的替換方式。選擇正確的策略可以避免服務中斷。

RollingUpdate 滾動更新

RollingUpdate 是 Kubernetes 的預設策略,也是大多數情況下的最佳選擇。它會逐步用新版 Pod 取代舊版 Pod,確保服務不中斷。

spec:
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%

優點
- 零停機更新(Zero Downtime Deployment)
- 可以隨時暫停、恢復或回滾
- 流量會平滑地轉移到新版本

適用場景
- 一般的版本更新
- 需要保持服務可用的生產環境
- 無狀態應用程式

Recreate 重建部署

Recreate 策略會先刪除所有舊版 Pod,再建立新版 Pod。這意味著會有一段服務中斷時間。

spec:
  strategy:
    type: Recreate

優點
- 確保新舊版本不會同時運行
- 避免版本不一致的問題

適用場景
- 資料庫 Schema 變更(新舊版本無法並存)
- 有狀態應用程式(StatefulSet 可能更適合)
- 開發環境快速更新

maxSurge 與 maxUnavailable

這兩個參數是 RollingUpdate 策略的核心設定,控制更新過程中的 Pod 數量:

參數 說明 範例
maxSurge 更新期間可以超出 replicas 的最大 Pod 數量 25% 或 1
maxUnavailable 更新期間可以不可用的最大 Pod 數量 25% 或 1

假設 replicas: 4,以下是不同設定的效果:

# 保守策略:永遠有足夠的 Pod 處理請求
maxSurge: 1
maxUnavailable: 0
# 更新過程:4 → 5 → 5 → 5 → 4(最少維持 4 個)

# 平衡策略:兼顧速度與可用性(預設)
maxSurge: 25%
maxUnavailable: 25%
# 更新過程:4 → 4 → 4 → 4(維持 3~5 個)

# 積極策略:最快速度完成更新
maxSurge: 100%
maxUnavailable: 50%
# 更新過程:4 → 8 → 4(可能短暫只有 2 個)

建議:生產環境使用 maxUnavailable: 0 搭配 maxSurge: 25%,確保更新過程中服務不受影響。


container 設定詳解

container 設定定義了 Pod 內運行的容器,這是應用程式實際執行的地方。

image 與 imagePullPolicy

containers:
  - name: my-app
    image: my-registry.com/my-app:1.2.0
    imagePullPolicy: IfNotPresent
imagePullPolicy 行為 適用場景
Always 每次都拉取最新的 image 使用 latest tag 時
IfNotPresent 本地沒有才拉取 使用明確版本 tag 時(建議)
Never 只使用本地 image 開發環境測試

最佳實踐
- 永遠使用明確的版本 tag(如 v1.2.0),避免使用 latest
- 生產環境使用 IfNotPresent,節省拉取時間
- 使用私有 Registry 時,需配置 imagePullSecrets

spec:
  imagePullSecrets:
    - name: my-registry-secret

ports 設定

containers:
  - name: my-app
    ports:
      - containerPort: 8080
        name: http
        protocol: TCP
      - containerPort: 9090
        name: metrics
        protocol: TCP

這裡設定的 ports 是「宣告」用途,讓其他人知道這個容器監聽哪些 port。實際的對外暴露需要透過 Service 設定。

env 環境變數

環境變數有三種設定方式:

containers:
  - name: my-app
    env:
      # 方式一:直接設定值
      - name: NODE_ENV
        value: "production"

      # 方式二:從 ConfigMap 取得
      - name: DATABASE_HOST
        valueFrom:
          configMapKeyRef:
            name: app-config
            key: database.host

      # 方式三:從 Secret 取得
      - name: DATABASE_PASSWORD
        valueFrom:
          secretKeyRef:
            name: app-secrets
            key: database.password

最佳實踐
- 敏感資訊(密碼、API Key)一定要用 Secret
- 可能變動的設定使用 ConfigMap
- 固定的設定可以直接寫在 YAML

resources(CPU/Memory)

resources 設定 Pod 的 CPU 和記憶體配額,這是 K8s 排程與資源管理的基礎。

containers:
  - name: my-app
    resources:
      requests:
        cpu: "250m"
        memory: "256Mi"
      limits:
        cpu: "500m"
        memory: "512Mi"
欄位 說明
requests 最低需求,K8s 排程時確保節點有這些資源
limits 最高上限,超過會被節流(CPU)或 OOMKilled(Memory)

CPU 單位:
- 1 = 1 個 vCPU
- 500m = 0.5 個 vCPU
- 250m = 0.25 個 vCPU

Memory 單位:
- Mi = MiB(二進制,1 Mi = 1024 Ki)
- M = MB(十進制,1 M = 1000 K)

常見的資源配置範例

應用類型 requests limits
輕量 API Server 100m CPU, 128Mi 200m CPU, 256Mi
標準 Web App 250m CPU, 256Mi 500m CPU, 512Mi
運算密集型服務 500m CPU, 512Mi 2000m CPU, 2Gi

如果你正在學習 Docker 容器化,可以參考 Docker Deploy 教學 了解基礎觀念。


Health Checks 健康檢查

health-probes-timeline

插圖:三種 Probe 的作用時間軸圖

場景描述:
Technical illustration showing 三種 Probe 的作用時間軸圖. Clean, professional diagram style.

視覺重點:
- Clear presentation of the concept
- Professional technical diagram style
- Easy to understand visual elements

必須出現的元素:
- Relevant technical components
- Clear labels and annotations
- Logical flow or structure

需要顯示的中文字:

風格:
Clean flat design, technical illustration, modern infographic style

顏色調性:
Professional blues and grays, with accent colors for emphasis

避免元素:
Cluttered design, realistic photos, complex 3D rendering

健康檢查是 Kubernetes 判斷 Pod 是否正常運作的機制。設定正確的 Health Checks 可以讓 K8s 自動處理故障的 Pod,維持服務穩定。

livenessProbe

livenessProbe 用於判斷容器是否「活著」。如果檢查失敗,K8s 會重啟容器。

containers:
  - name: my-app
    livenessProbe:
      httpGet:
        path: /healthz
        port: 8080
      initialDelaySeconds: 30
      periodSeconds: 10
      timeoutSeconds: 5
      failureThreshold: 3
參數 說明 建議值
initialDelaySeconds 容器啟動後等待多久才開始檢查 應用程式啟動時間 + 緩衝
periodSeconds 每隔多久檢查一次 10-30 秒
timeoutSeconds 檢查超時時間 3-5 秒
failureThreshold 連續失敗幾次才算不健康 3 次

readinessProbe

readinessProbe 用於判斷容器是否「準備好」接收流量。如果檢查失敗,K8s 會將 Pod 從 Service 的 Endpoint 移除,不再接收新請求。

containers:
  - name: my-app
    readinessProbe:
      httpGet:
        path: /ready
        port: 8080
      initialDelaySeconds: 5
      periodSeconds: 5
      timeoutSeconds: 3
      successThreshold: 1
      failureThreshold: 3

livenessProbe vs readinessProbe

檢查類型 失敗後果 使用場景
livenessProbe 重啟容器 偵測 deadlock、無回應
readinessProbe 停止接收流量 暖機中、依賴服務暫時不可用

startupProbe

startupProbe 是 Kubernetes 1.16 新增的功能,專門用於啟動時間較長的應用程式。在 startupProbe 成功之前,livenessProbe 和 readinessProbe 都不會執行。

containers:
  - name: my-app
    startupProbe:
      httpGet:
        path: /healthz
        port: 8080
      initialDelaySeconds: 0
      periodSeconds: 10
      timeoutSeconds: 5
      failureThreshold: 30  # 30 * 10 = 300 秒容許啟動時間

適用場景
- 需要載入大量資料的應用程式
- 舊系統遷移(啟動時間難以預估)
- 避免 livenessProbe 在啟動階段誤判並重啟容器

三種 Probe 的組合建議

# 啟動慢的應用程式(如 Java)
startupProbe:
  httpGet:
    path: /healthz
    port: 8080
  failureThreshold: 30
  periodSeconds: 10

# 偵測 deadlock
livenessProbe:
  httpGet:
    path: /healthz
    port: 8080
  periodSeconds: 10
  failureThreshold: 3

# 偵測是否準備好接收流量
readinessProbe:
  httpGet:
    path: /ready
    port: 8080
  periodSeconds: 5
  failureThreshold: 3

完整 YAML 範例

complete-deployment-yaml

插圖:完整 Deployment YAML 範例圖

場景描述:
Technical illustration showing 完整 Deployment YAML 範例圖. Clean, professional diagram style.

視覺重點:
- Clear presentation of the concept
- Professional technical diagram style
- Easy to understand visual elements

必須出現的元素:
- Relevant technical components
- Clear labels and annotations
- Logical flow or structure

需要顯示的中文字:

風格:
Clean flat design, technical illustration, modern infographic style

顏色調性:
Professional blues and grays, with accent colors for emphasis

避免元素:
Cluttered design, realistic photos, complex 3D rendering

以下提供兩個可直接複製使用的 Deployment YAML 範例。

基礎版範例

適合開發環境或簡單的應用程式:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
  labels:
    app: my-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: my-app
          image: my-app:1.0.0
          ports:
            - containerPort: 8080
          env:
            - name: NODE_ENV
              value: "production"
          resources:
            requests:
              cpu: "100m"
              memory: "128Mi"
            limits:
              cpu: "200m"
              memory: "256Mi"

進階版範例(含所有最佳實踐)

適合生產環境,包含完整的健康檢查、部署策略與資源配置:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
  namespace: production
  labels:
    app: my-app
    environment: production
    version: v1.2.0
  annotations:
    description: "主要應用程式"
    kubernetes.io/change-cause: "更新至 v1.2.0,修復登入問題"
spec:
  replicas: 3
  revisionHistoryLimit: 5
  selector:
    matchLabels:
      app: my-app
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  template:
    metadata:
      labels:
        app: my-app
        environment: production
        version: v1.2.0
    spec:
      terminationGracePeriodSeconds: 60
      containers:
        - name: my-app
          image: my-registry.com/my-app:1.2.0
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 8080
              name: http
              protocol: TCP
          env:
            - name: NODE_ENV
              value: "production"
            - name: DATABASE_URL
              valueFrom:
                secretKeyRef:
                  name: app-secrets
                  key: database-url
          resources:
            requests:
              cpu: "250m"
              memory: "256Mi"
            limits:
              cpu: "500m"
              memory: "512Mi"
          startupProbe:
            httpGet:
              path: /healthz
              port: 8080
            failureThreshold: 30
            periodSeconds: 10
          livenessProbe:
            httpGet:
              path: /healthz
              port: 8080
            initialDelaySeconds: 0
            periodSeconds: 10
            timeoutSeconds: 5
            failureThreshold: 3
          readinessProbe:
            httpGet:
              path: /ready
              port: 8080
            initialDelaySeconds: 0
            periodSeconds: 5
            timeoutSeconds: 3
            failureThreshold: 3
          securityContext:
            runAsNonRoot: true
            readOnlyRootFilesystem: true
            allowPrivilegeEscalation: false
      imagePullSecrets:
        - name: my-registry-secret
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 100
              podAffinityTerm:
                labelSelector:
                  matchLabels:
                    app: my-app
                topologyKey: kubernetes.io/hostname

這個進階版範例包含了:
- 完整的 labels 與 annotations
- RollingUpdate 策略(零停機更新)
- 三種 Health Checks
- 資源限制
- Security Context(安全設定)
- Pod Anti-Affinity(分散到不同節點)


FAQ 常見問題

Q1: replicas 設為 0 會怎樣?

設定 replicas: 0 是完全合法的,Deployment 會存在但沒有任何 Pod 運行。這常用於:
- 暫時停止應用程式而不刪除 Deployment
- 根據排程自動擴展到 0(省成本)

Q2: Deployment 和 StatefulSet 該選哪個?

選擇 適用場景
Deployment 無狀態應用程式、Web Server、API Server
StatefulSet 有狀態應用程式、資料庫、需要穩定網路身份

一般的 Web 應用程式使用 Deployment 即可。

Q3: maxSurge 和 maxUnavailable 可以都設為 0 嗎?

不行。如果兩者都是 0,代表更新時不能增加 Pod、也不能減少 Pod,更新就無法進行。至少一個必須大於 0。

Q4: 為什麼我的 Pod 一直 CrashLoopBackOff?

這通常是 livenessProbe 設定的問題:
- initialDelaySeconds 太短,應用程式還沒啟動完成就被檢查
- 檢查的端點回傳非 2xx 狀態碼
- 容器內的應用程式真的故障了

解決方案:使用 startupProbe,或增加 initialDelaySeconds

Q5: 如何回滾到上一個版本?

# 查看版本歷史
kubectl rollout history deployment/my-app

# 回滾到上一個版本
kubectl rollout undo deployment/my-app

# 回滾到特定版本
kubectl rollout undo deployment/my-app --to-revision=2

K8s Deployment YAML 設定重點整理

掌握 Kubernetes Deployment YAML 的各項設定,是成為 K8s 進階使用者的必經之路。這篇文章涵蓋了:

  • YAML 結構:apiVersion、kind、metadata、spec 四大區塊
  • 副本設定:replicas 與 HPA 自動擴展
  • 部署策略:RollingUpdate vs Recreate 的選擇
  • Container 設定:image、ports、env、resources 詳解
  • Health Checks:三種 Probe 的差異與最佳組合

建議你將進階版 YAML 範例存為模板,根據實際專案需求調整使用。

如果你想了解如何在 K8s 上部署完整的多層式架構,可以接著閱讀 K8s 三層式架構部署 教學。


🚀 Kubernetes 部署遇到問題?

從 YAML 設定到效能調校,K8s 有太多細節需要注意。

預約免費諮詢,讓 VibeFix 的工程師幫你診斷並優化 Kubernetes 部署配置。

分享文章:
V

VibeFix

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

這篇文章有幫到你嗎?

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

聯繫我們