Kubernetes Deployment升級與回退實現(xiàn)過程
在生產(chǎn)環(huán)境中,應(yīng)用持續(xù)交付要求能夠在不中斷服務(wù)的前提下平滑地升級,同時在出現(xiàn)問題時能迅速回退到穩(wěn)定版本。Kubernetes 的 Deployment 機制正是為此而設(shè)計的。
本篇文章將介紹如何使用 kubectl set image --record 命令進行版本更新,以及如何利用 kubectl rollout undo 快速回退,幫助你掌握升級和回退 Deployment 的核心技巧。
Kubernetes Deployment 基礎(chǔ)概念
Deployment 是 Kubernetes 中用于管理無狀態(tài)應(yīng)用的核心控制器。
它主要負責:
- 定義所需的 Pod 副本數(shù)
- 生成并維護 ReplicaSet 集合,確保當前運行狀態(tài)符合預(yù)期
- 實現(xiàn)滾動更新,逐步替換舊版本 Pod 為新版本 Pod,保證服務(wù)連續(xù)性
通過聲明式的方式,我們只需描述期望狀態(tài),Deployment 控制器便會自動完成版本更新、擴縮容以及故障回退等任務(wù)。
利用kubectl -n namespace set image --record 實現(xiàn)版本升級
在升級過程中,我們常常需要將容器鏡像更新為新版本。使用以下命令可以完成這一操作:
kubectl -n test set image deployment/my-deployment my-container=myimage:newtag --record
- -n test:指定命名空間
- deployment/my-deployment:指定要更新的 Deployment 名稱。
- my-container=myimage:newtag:將容器名稱
my-container對應(yīng)的鏡像更新為myimage:newtag。 - –record:該參數(shù)會將此次操作記錄在 Deployment 的 annotation 中(記錄在
kubernetes.io/change-cause字段中),方便后續(xù)查閱更新歷史和在出現(xiàn)問題時進行回退。
更新命令執(zhí)行后,Deployment 控制器會啟動滾動更新流程,逐步創(chuàng)建新版本的 Pod 并刪除舊版本的 Pod,從而實現(xiàn)零停機升級。
監(jiān)控滾動更新進程
升級過程中可以使用以下命令來監(jiān)控更新狀態(tài),確保新版本 Pod 已正常啟動并達到預(yù)期副本數(shù):
kubectl rollout status deployment/my-deployment
此外,還可以使用 kubectl get pods 和 kubectl get rs 分別查看 Pod 和 ReplicaSet 的狀態(tài),了解新舊版本 Pod 的數(shù)量變化情況。這樣可以及時發(fā)現(xiàn)鏡像拉取失敗或健康檢查不通過等問題。
Deployment 回退:快速恢復(fù)穩(wěn)定版本
在升級后發(fā)現(xiàn)問題時,可以使用回退命令將 Deployment 恢復(fù)到之前的穩(wěn)定版本。最簡單的方式是執(zhí)行:
kubectl rollout undo deployment/my-deployment
該命令會將 Deployment 回退到上一個版本。如果需要回退到特定版本,還可以加上 --to-revision 參數(shù),例如:
kubectl rollout undo deployment/my-deployment --to-revision=2
回退命令同樣會觸發(fā)滾動更新,將現(xiàn)有的 Pod 替換為之前版本的 Pod,確保應(yīng)用盡快恢復(fù)正常運行。
實戰(zhàn)演示:升級與回退操作流程
假設(shè)我們有一個簡單的 Deployment,其 YAML 文件如下:
apiVersion: apps/v1
kind: Deployment
namespace:test
metadata:
name: my-deployment
spec:
replicas: 3
selector:
matchLabels:
app: demo-app
template:
metadata:
labels:
app: demo-app
spec:
containers:
- name: my-container
image: nginx:1.14
ports:
- containerPort: 80
升級步驟
執(zhí)行升級命令
將鏡像更新為新版本,例如 nginx:1.16:
kubectl -n test set image deployment/my-deployment my-container=nginx:1.16 --record
監(jiān)控滾動更新
使用以下命令查看更新進度:
kubectl -n test rollout status deployment/my-deployment
同時,通過 kubectl -n test get pods 查看新舊 Pod 狀態(tài)。
回退步驟
假設(shè)升級后出現(xiàn)異常,決定回退:
執(zhí)行回退命令
將 Deployment 恢復(fù)到上一個版本:
kubectl -n test rollout undo deployment/my-deployment
驗證回退結(jié)果
再次使用 kubectl -n test rollout status 和 kubectl -n test describe deployment my-deployment 檢查當前鏡像是否已恢復(fù)為 nginx:1.14。
補充:最佳實踐與注意事項
記錄變更歷史
使用 --record 參數(shù)可以方便追蹤每次更新的命令。不過需要注意,部分文檔中提到該參數(shù)將來可能會被廢棄,因此在自動化流水線中可以考慮在更新后手動添加注解記錄變更信息:
kubectl annotate deployment/my-deployment kubernetes.io/change-cause="更新鏡像至 nginx:1.16"
使用滾動更新策略
默認情況下,Deployment 采用滾動更新策略(RollingUpdate),可以通過設(shè)置 maxSurge 和 maxUnavailable 參數(shù)來調(diào)整更新時的并發(fā)度與可用性。
例如:
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
這樣可以保證在更新過程中,始終保持所有副本可用,避免服務(wù)中斷。
版本標記與鏡像管理
在生產(chǎn)環(huán)境中,建議不要使用 latest 標簽。每次構(gòu)建后應(yīng)生成唯一的鏡像標簽(如基于構(gòu)建號或 Git commit SHA),這樣可以確保每次更新都能明確標識版本,并便于回退操作。
自動化 CI/CD 流水線
在 CI/CD 系統(tǒng)中,將鏡像構(gòu)建與 Kubernetes 部署流程自動化,將更新命令(如 kubectl set image 或直接應(yīng)用更新后的 Deployment YAML)集成到流水線中,能大幅提升更新效率和穩(wěn)定性。
結(jié)語
通過本文,你應(yīng)該已經(jīng)了解了如何利用 Kubernetes 的 Deployment 機制進行無停機的滾動更新,以及在出現(xiàn)問題時如何使用回退命令快速恢復(fù)穩(wěn)定版本。無論是在手動操作還是自動化流水線中,掌握這些命令和最佳實踐都能幫助你更好地管理集群中的應(yīng)用版本,確保服務(wù)的高可用性和持續(xù)交付。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
k8s集群調(diào)度詳解(kube-scheduler)
Kubernetes調(diào)度器負責將Pod分配至Node節(jié)點,采用預(yù)選(資源匹配)和優(yōu)選(資源利用率、鏡像緩存)策略,支持指定節(jié)點、標簽及親和性(軟/硬策略)調(diào)度,確保資源高效利用與靈活分配2025-09-09
云原生技術(shù)kubernetes之volumes容器的使用
這篇文章主要為大家介紹了云原生技術(shù)kubernetes之volumes容器使用方式,?有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-03-03
阿里云kubernetes查找鏡像中jar包的方法(docker查看鏡像中的jar)
這篇文章主要給大家介紹了關(guān)于阿里云kubernetes查找鏡像中jar包的方法,也就是在docker查看鏡像中的jar,文中通過圖文介紹的非常詳細,需要的朋友可以參考下2022-09-09
K8S?prometheus?operator監(jiān)控工作原理介紹
這篇文章主要為大家介紹了K8S?prometheus?operator監(jiān)控工作原理介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11

