前言
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 的優勢
- 副本管理:自動維護指定數量的 Pod 副本
- 滾動更新:無停機時間地更新應用程式
- 回滾機制:輕鬆回滾到先前的版本
- 擴縮容:方便地調整 Pod 副本數量
- 自我修復:自動重新建立失敗的 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
|
回滾最佳實踐
- 記錄變更原因:使用
--record 標記記錄更新命令
1
| kubectl set image deployment/nginx-deployment nginx=nginx:1.22 --record
|
- 使用註解標記版本:
1
| kubectl annotate deployment/nginx-deployment kubernetes.io/change-cause="升級到 nginx 1.22 版本"
|
- 定期清理舊版本:設定合理的
revisionHistoryLimit 值
總結
Pod 和 Deployment 是 Kubernetes 中最基礎的資源物件:
- Pod 是最小的部署單元,代表一個或多個容器的組合
- Deployment 是管理 Pod 的控制器,提供了副本管理、滾動更新和回滾等功能
- 滾動更新策略 確保了應用程式更新時的高可用性
- 回滾機制 讓我們能夠快速恢復到穩定版本
掌握這些概念和操作,是使用 Kubernetes 進行容器編排的基礎。在實際應用中,建議搭配 Health Check(健康檢查)、Resource Limits(資源限制)和 PodDisruptionBudget(Pod 中斷預算)等機制,以確保應用程式的穩定性和可靠性。
參考資源