Deployment Strategies - Recreate Strategy and Rolling Update Strategy
在上一篇中,有多種 Deployment 的更新策略,其中兩個常見的方式為 Recreate Strategy 與 Rolling Update Strategy。 以下是這兩種的實作範例:
Recreate Strategy
Recreate Strategy 是 Kubernetes 的一種部署策略,會先停止所有舊版本的 Pod,確保它們完全移除後再啟動新版本的 Pod。 這種方式適合應用程式的舊版本與新版本之間不兼容的情境,或需要進行重大架構調整的場景。 雖然實現簡單,但會造成短暫停機,需謹慎使用。
實作 Recreate Strategy
- 首先我們先建立一個 deployment,他是部屬 v1 的 image,部屬 replicas 數量為 3,我們經部屬策略改成
Recreate,並且我們在 label 地方增加 version v1。
recreate/app-v1.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-deployment
labels:
app: demo
spec:
replicas: 3
strategy:
type: Recreate
selector:
matchLabels:
app: demo
template:
metadata:
labels:
app: demo
version: v1
spec:
containers:
- name: demo-container
image: hello-world:v1.0.0
ports:
- containerPort: 8080
- 接著我們撰寫 v2 版本的 deployment,我們將 image 改成 v2 版本的,並且將 label 中的 version 改成 v2。
recreate/app-v2.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-deployment
labels:
app: demo
spec:
replicas: 3
strategy:
type: Recreate
selector:
matchLabels:
app: demo
template:
metadata:
labels:
app: demo
version: v2
spec:
containers:
- name: demo-container
image: hello-world:v2.0.0
ports:
- containerPort: 8080
- 透過 kubectl 使令來將 app-v1 運行起來,也能查看他是否建立三個 pod,並且都達到 Running 狀態。
kubectl.exe apply -f recreate/app-v1.yaml
---
deployment.apps/demo-deployment created
kubectl.exe get pods
---
NAME READY STATUS RESTARTS AGE
demo-deployment-75b4bd45c5-85pth 1/1 Running 0 91s
demo-deployment-75b4bd45c5-w29q5 1/1 Running 0 91s
demo-deployment-75b4bd45c5-w7pg5 1/1 Running 0 91s
- 接著我們透過-w (--watch) 來觀察版本更新時他會如何變化。
kubectl.exe get pods -w
- 我們使用 kubectl 來更新到 v2 版本的 image。
kubectl.exe apply -f recreate/app-v2.yaml
---
deployment.apps/demo-deployment configured
- 從結果來看,我們可以發現他將 v1 的 3 個 pod 全部都 termiated 之後,才開始創立 v2 版本的 pod,這中間存在著停機時間。
kubectl.exe get pods -w
---
NAME READY STATUS RESTARTS AGE
demo-deployment-75b4bd45c5-85pth 1/1 Running 0 2m52s
demo-deployment-75b4bd45c5-w29q5 1/1 Running 0 2m52s
demo-deployment-75b4bd45c5-w7pg5 1/1 Running 0 2m52s
demo-deployment-75b4bd45c5-85pth 1/1 Terminating 0 4m22s
demo-deployment-75b4bd45c5-w29q5 1/1 Terminating 0 4m22s
demo-deployment-75b4bd45c5-w7pg5 1/1 Terminating 0 4m22s
demo-deployment-75b4bd45c5-w7pg5 0/1 Terminating 0 4m22s
demo-deployment-75b4bd45c5-85pth 0/1 Terminating 0 4m22s
demo-deployment-75b4bd45c5-w29q5 0/1 Terminating 0 4m22s
demo-deployment-75b4bd45c5-w29q5 0/1 Terminating 0 4m22s
demo-deployment-75b4bd45c5-85pth 0/1 Terminating 0 4m22s
demo-deployment-75b4bd45c5-w7pg5 0/1 Terminating 0 4m22s
demo-deployment-75b4bd45c5-85pth 0/1 Terminating 0 4m22s
demo-deployment-75b4bd45c5-85pth 0/1 Terminating 0 4m22s
demo-deployment-75b4bd45c5-w7pg5 0/1 Terminating 0 4m22s
demo-deployment-75b4bd45c5-w7pg5 0/1 Terminating 0 4m22s
demo-deployment-75b4bd45c5-w29q5 0/1 Terminating 0 4m22s
demo-deployment-75b4bd45c5-w29q5 0/1 Terminating 0 4m22s
demo-deployment-6c5d69f4dc-m2k56 0/1 Pending 0 0s
demo-deployment-6c5d69f4dc-hvfm4 0/1 Pending 0 0s
demo-deployment-6c5d69f4dc-b2lp4 0/1 Pending 0 0s
demo-deployment-6c5d69f4dc-m2k56 0/1 Pending 0 0s
demo-deployment-6c5d69f4dc-hvfm4 0/1 Pending 0 0s
demo-deployment-6c5d69f4dc-b2lp4 0/1 Pending 0 1s
demo-deployment-6c5d69f4dc-m2k56 0/1 ContainerCreating 0 1s
demo-deployment-6c5d69f4dc-b2lp4 0/1 ContainerCreating 0 1s
demo-deployment-6c5d69f4dc-hvfm4 0/1 ContainerCreating 0 1s
demo-deployment-6c5d69f4dc-m2k56 1/1 Running 0 1s
demo-deployment-6c5d69f4dc-hvfm4 1/1 Running 0 1s
demo-deployment-6c5d69f4dc-b2lp4 1/1 Running 0 1s
Rolling Update Strategy
Rolling Update Strategy 是 Kubernetes 中預設的部署策略,允許舊版本的 Pod 和新版本的 Pod 在部署過程中共存。 系統會逐步啟動新版本的 Pod,同時逐步關閉舊版本的 Pod,確保服務始終可用。 此策略能實現零停機時間,是更新需要穩定性和用戶體驗的最佳選擇,但需考量新舊版本的兼容性。