在Kubernetes中,Deployment
提供了一種非常強大的方式來更新應用,同時保持應用的可用性。以下是使用 Deployment
進行應用升級的過程,包括滾動更新、回滾、暫停和恢復更新等操作。
1. 升級過程
-
準備工作:
- 確保你有一個現有的
Deployment
。 - 準備新的容器映象或者其他需要更改的配置。
- 確保你有一個現有的
-
修改
Deployment
規格:-
編輯
Deployment
的 YAML 檔案,更新容器映象的版本或其他配置。 -
例如,如果你要從
v1
升級到v2
,你可以更新image
欄位。 -
apiVersion: apps/v1 kind: Deployment metadata: name: my-app spec: replicas: 3 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: containers: - name: my-container image: my-registry/my-image:v2 # 更改映象版本 ports: - containerPort: 8080
-
-
應用更改:
-
使用
kubectl apply
命令應用新的Deployment
規格。 -
kubectl apply -f my-deployment.yaml
-
kubectl
將會傳送一個 PATCH 請求到 API Server,以更新Deployment
的規格。
-
-
滾動更新:
Deployment
控制器開始建立新的ReplicaSet
,這個ReplicaSet
使用新的容器映象。- 新的
ReplicaSet
會根據Deployment
規格建立新的 Pod。 - 舊的
ReplicaSet
會逐步減少其 Pod 的數量,直到達到replicas: 0
。 - 這個過程稱為“滾動更新”,因為它逐步替換 Pod,而不是一次性停止所有服務。
-
健康檢查:
- 在滾動更新過程中,Kubernetes 會對新建立的 Pod 執行健康檢查。
- 這通常透過配置 Liveness 和 Readiness 探針來實現。
- 只有當新 Pod 成功透過健康檢查後,舊 Pod 才會被終止。
-
暫停和恢復更新:
- 如果需要暫停更新過程,可以使用
kubectl rollout pause deployment my-app
。 - 這會阻止新的 Pod 建立,但不會影響現有 Pod 的執行。
- 當準備好繼續時,可以使用
kubectl rollout resume deployment my-app
繼續滾動更新。
- 如果需要暫停更新過程,可以使用
-
回滾:
- 如果更新過程中發現問題,可以回滾到之前的版本。
- 使用
kubectl rollout undo --to-revision=2 deployment my-app
回滾到特定版本。 - 這裡
--to-revision=2
表示回滾到修訂版本 2 的Deployment
。
-
驗證更新:
- 使用
kubectl rollout status deployment my-app
來檢查滾動更新的狀態。 - 檢視
kubectl get pods
輸出,確認所有的 Pod 都已經更新到了新版本。 - 測試應用的功能,確保一切正常。
- 使用
-
清理:
- 一旦確認新版本穩定執行,可以考慮清理舊的
ReplicaSet
。 - 不過通常這些舊的
ReplicaSet
會被保留一段時間,以備回滾之需。
- 一旦確認新版本穩定執行,可以考慮清理舊的
2. 注意事項
-
滾動更新策略:
-
預設情況下,滾動更新策略是
RollingUpdate
。 -
你也可以配置
maxUnavailable
和maxSurge
引數來控制更新過程中不可用的 Pod 數量和額外建立的 Pod 數量。 -
例如:
spec: strategy: rollingUpdate: maxUnavailable: 1 maxSurge: 25%
-
-
版本控制:
- 使用版本控制系統(如 Git)來管理
Deployment
的 YAML 檔案和版本歷史記錄。
- 使用版本控制系統(如 Git)來管理
綜上所述,你可以使用 Deployment
來平滑地更新應用,同時保持服務的連續性和可用性。