Kubernetes Pod 與 Deployment 管理

前言

Kubernetes(簡稱 K8s)是目前最流行的容器編排平台,而 Pod 和 Deployment 是其中最基礎且最重要的兩個資源物件。本文將深入介紹 Pod 與 Deployment 的概念、建立方式、更新策略以及回滾操作。

Pod 詳解

什麼是 Pod?

Pod 是 Kubernetes 中最小的可部署單元,它代表了叢集中運行的一個或多個容器的組合。Pod 內的容器共享相同的網路命名空間(Network Namespace)和儲存卷(Volume),因此它們可以透過 localhost 互相通訊。

Pod 的特性

  • 共享網路:Pod 內的所有容器共享同一個 IP 位址和連接埠空間
  • 共享儲存:Pod 可以指定一組共享的儲存卷,讓所有容器都能存取
  • 生命週期:Pod 是短暫的,一旦終止就不會重新啟動,而是由控制器建立新的 Pod

Pod YAML 範例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.21
    ports:
    - containerPort: 80
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"

建立 Pod

使用 kubectl 命令建立 Pod:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 使用 YAML 檔案建立
kubectl apply -f nginx-pod.yaml

# 直接建立簡單的 Pod
kubectl run nginx-pod --image=nginx:1.21

# 查看 Pod 狀態
kubectl get pods

# 查看 Pod 詳細資訊
kubectl describe pod nginx-pod

Deployment 概念

什麼是 Deployment?

Deployment 是 Kubernetes 中用於管理 Pod 和 ReplicaSet 的高階控制器。它提供了宣告式更新(Declarative Updates)功能,讓您能夠描述應用程式的期望狀態,Deployment 控制器會自動將實際狀態調整為期望狀態。

Deployment 的優勢

  1. 副本管理:自動維護指定數量的 Pod 副本
  2. 滾動更新:無停機時間地更新應用程式
  3. 回滾機制:輕鬆回滾到先前的版本
  4. 擴縮容:方便地調整 Pod 副本數量
  5. 自我修復:自動重新建立失敗的 Pod

建立與更新 Deployment

Deployment YAML 範例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.21
        ports:
        - containerPort: 80
        resources:
          requests:
            memory: "64Mi"
            cpu: "250m"
          limits:
            memory: "128Mi"
            cpu: "500m"

建立 Deployment

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 使用 YAML 檔案建立
kubectl apply -f nginx-deployment.yaml

# 直接建立 Deployment
kubectl create deployment nginx-deployment --image=nginx:1.21 --replicas=3

# 查看 Deployment 狀態
kubectl get deployments

# 查看 Deployment 詳細資訊
kubectl describe deployment nginx-deployment

更新 Deployment

有多種方式可以更新 Deployment:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 方式一:編輯 YAML 檔案後重新套用
kubectl apply -f nginx-deployment.yaml

# 方式二:直接修改映像檔版本
kubectl set image deployment/nginx-deployment nginx=nginx:1.22

# 方式三:使用 edit 命令
kubectl edit deployment nginx-deployment

# 方式四:使用 patch 命令
kubectl patch deployment nginx-deployment -p '{"spec":{"template":{"spec":{"containers":[{"name":"nginx","image":"nginx:1.22"}]}}}}'

擴縮容

1
2
3
4
5
# 調整副本數量
kubectl scale deployment nginx-deployment --replicas=5

# 自動擴縮容(需要安裝 Metrics Server)
kubectl autoscale deployment nginx-deployment --min=3 --max=10 --cpu-percent=80

滾動更新策略

什麼是滾動更新?

滾動更新(Rolling Update)是 Deployment 的預設更新策略,它會逐步將舊版本的 Pod 替換為新版本,確保在更新過程中始終有足夠的 Pod 在運行,從而實現零停機時間部署。

滾動更新配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1        # 更新過程中最多可以超出期望副本數的數量
      maxUnavailable: 1  # 更新過程中最多可以有多少個 Pod 不可用
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.21

策略參數說明

參數說明
maxSurge更新過程中可以建立的超出期望副本數的最大 Pod 數量,可以是絕對數字或百分比
maxUnavailable更新過程中可以不可用的最大 Pod 數量,可以是絕對數字或百分比

監控更新狀態

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 查看更新狀態
kubectl rollout status deployment/nginx-deployment

# 查看更新歷史
kubectl rollout history deployment/nginx-deployment

# 暫停更新
kubectl rollout pause deployment/nginx-deployment

# 繼續更新
kubectl rollout resume deployment/nginx-deployment

回滾操作

為什麼需要回滾?

當新版本的應用程式出現問題時,我們需要快速回滾到先前穩定的版本,以減少對用戶的影響。Kubernetes 會保留 Deployment 的修訂歷史,讓我們可以輕鬆回滾到任何先前的版本。

執行回滾

1
2
3
4
5
6
7
8
# 回滾到上一個版本
kubectl rollout undo deployment/nginx-deployment

# 回滾到指定版本
kubectl rollout undo deployment/nginx-deployment --to-revision=2

# 查看特定版本的詳細資訊
kubectl rollout history deployment/nginx-deployment --revision=2

設定修訂歷史限制

為了避免保留過多的修訂歷史,可以在 Deployment 中設定 revisionHistoryLimit

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  revisionHistoryLimit: 10  # 保留最近 10 個修訂版本
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.21

回滾最佳實踐

  1. 記錄變更原因:使用 --record 標記記錄更新命令
1
kubectl set image deployment/nginx-deployment nginx=nginx:1.22 --record
  1. 使用註解標記版本
1
kubectl annotate deployment/nginx-deployment kubernetes.io/change-cause="升級到 nginx 1.22 版本"
  1. 定期清理舊版本:設定合理的 revisionHistoryLimit

總結

Pod 和 Deployment 是 Kubernetes 中最基礎的資源物件:

  • Pod 是最小的部署單元,代表一個或多個容器的組合
  • Deployment 是管理 Pod 的控制器,提供了副本管理、滾動更新和回滾等功能
  • 滾動更新策略 確保了應用程式更新時的高可用性
  • 回滾機制 讓我們能夠快速恢復到穩定版本

掌握這些概念和操作,是使用 Kubernetes 進行容器編排的基礎。在實際應用中,建議搭配 Health Check(健康檢查)、Resource Limits(資源限制)和 PodDisruptionBudget(Pod 中斷預算)等機制,以確保應用程式的穩定性和可靠性。

參考資源

comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy