在Kubernetes(K8s)中,Deployment的升級過程是一個受控且平滑的過程,用於將應用的新版本無縫地替換舊版本。以下是Deployment升級過程的詳細步驟:
1. 更新Deployment配置
- 準備新版本映象或配置:
- 確定新版本的應用程式映象或需要更改的配置。
- 更新Deployment的YAML配置檔案,例如更改映象標籤到新版本的應用程式映象,或修改應用配置(如環境變數、命令引數等)。
- 應用更改:
- 透過
kubectl apply
命令或API呼叫將新的配置應用到叢集中。例如,kubectl apply -f my-deployment.yaml
。
- 透過
2. Deployment控制器檢測到配置變化
- 開始執行滾動更新策略:
- Kubernetes Deployment控制器檢測到配置變化後,會開始執行滾動更新(Rolling Update)策略。這是Deployment的預設升級策略。
3. 滾動更新過程
- 建立新的ReplicaSet:
- Deployment控制器根據新的Pod模板建立一個新的ReplicaSet。
- 新的ReplicaSet開始建立並啟動指定數量的新Pod,同時確保任何時候叢集中至少有一部分舊Pod仍在提供服務。
- 逐步替換舊Pod:
- 滾動更新策略會按照ReplicaSet中的Pod副本數量和指定的
.spec.strategy.rollingUpdate.maxUnavailable
和.spec.strategy.rollingUpdate.maxSurge
引數來逐步建立新版本Pod,並同時刪除舊版本Pod。 maxUnavailable
定義了可以有多少個Pod不可用(未就緒)而不會影響服務的整體可用性。maxSurge
則指定了可以比期望副本數多建立多少個Pod,以加速升級過程。
- 滾動更新策略會按照ReplicaSet中的Pod副本數量和指定的
- 健康檢查:
- 在每個新Pod被建立之後,Kubernetes會根據定義的livenessProbe(存活探針)和readinessProbe(就緒探針)來檢查新Pod是否已經啟動並準備好接收流量。
- 當新Pod透過健康檢查並標記為“就緒”時,Service會逐漸將流量從舊Pod轉移到新Pod。
- 完成替換:
- 一旦所有舊Pod都被新Pod替換並且新版本的所有Pod都已準備就緒,則升級過程結束。
4. 監控與回滾
- 監控狀態:
- 在升級過程中,可以透過
kubectl
或Kubernetes Dashboard監控Deployment的狀態以及Pod的健康狀況。
- 在升級過程中,可以透過
- 回滾操作:
- 如果在升級過程中發現問題,可以立即執行回滾操作回到上一個已知穩定版本。
- Kubernetes自動維護著每個Deployment的歷史記錄,允許使用者輕鬆地基於修訂歷史(revision history)回滾到之前任何一個版本。
5. 清理與驗證
- 清理舊資源:
- 一旦驗證新版本的應用程式正常工作,可以考慮清理舊的ReplicaSet和Pod副本,以釋放資源。不過通常這些舊的ReplicaSet會被保留一段時間,以備回滾之需。
- 驗證新版本:
- 測試新版本應用程式的功能,確保一切正常。
6. 其他操作
- 暫停與恢復更新:
- 在滾動更新過程中,如果需要暫停更新過程,可以使用
kubectl rollout pause deployment
命令。這會阻止新的Pod建立,但不會影響現有Pod的執行。 - 當準備好繼續時,可以使用
kubectl rollout resume deployment
命令繼續滾動更新。
- 在滾動更新過程中,如果需要暫停更新過程,可以使用
- 檢查更新狀態:
- 使用
kubectl rollout status deployment
命令來檢查滾動更新的狀態。
- 使用
綜上所述,Kubernetes中的Deployment升級過程旨在實現最小的服務中斷和最大程度的可恢復性。透過滾動更新策略、健康檢查、監控與回滾機制等,可以確保應用程式在升級過程中的穩定性和可靠性。