ASP.NET Core on K8S深入学习(5)Rolling Update
本篇已加入《.NET Core on K8S學(xué)習(xí)實(shí)踐系列文章索引》,可以點(diǎn)擊查看更多容器化技術(shù)相關(guān)系列文章。
01
—
What is Rolling Update?
為了服務(wù)升級(jí)過(guò)程中提供可持續(xù)的不中斷的服務(wù),K8S提供了Rolling Update機(jī)制,它可以使得服務(wù)近乎無(wú)縫地平滑升級(jí),即在不停止對(duì)外服務(wù)的前提下完成應(yīng)用的更新。滾動(dòng)更新采用漸進(jìn)的方式逐步替換舊版本Pod,如果更新不如預(yù)期,那么也可以通過(guò)回滾操作恢復(fù)到更新前的狀態(tài)。
滾動(dòng)更新的最大好處在于零停機(jī),整個(gè)更新過(guò)程始終有副本在運(yùn)行,從而保證了業(yè)務(wù)的連續(xù)性。
為了實(shí)踐滾動(dòng)更新,我們先做一些準(zhǔn)備工作:
(1)準(zhǔn)備一個(gè)ASP.NET Core WebAPI項(xiàng)目,具體項(xiàng)目代碼參見這里。
項(xiàng)目代碼里邊有三個(gè)版本,如下圖所示:
他們之間的差別在于一個(gè)接口的返回JSON數(shù)據(jù),比如V1.0版本中返回的是Version: 1.0,而V1.1版本中返回的是Version:1.1,那么V1.2版本則是返回Versioin:1.2。
????[Route("api/[controller]")] [ApiController] public class HomeController : ControllerBase { // GET api/home [HttpGet] public ActionResult<IEnumerable<string>> Get() { return new string[] { "Hello, welcome to EDC's demo. Version: 1.0" }; } }(2)將此項(xiàng)目各個(gè)版本根據(jù)Dockerfile打成鏡像,分別是k8s-demo:1.0,1.1,1.2
(3)將本地鏡像push到遠(yuǎn)程鏡像倉(cāng)庫(kù),這里我傳送到了docker hub的一個(gè)公共倉(cāng)庫(kù)里邊:
02
—
更新實(shí)踐
首先,我們先創(chuàng)建一個(gè)1.0版本到K8S中,準(zhǔn)備YAML配置文件(這次我們將Deployment和Service的資源定義寫在了一起):
然后,通過(guò)kubectl進(jìn)行創(chuàng)建:
kubectl apply -f k8s-demo.yaml通過(guò)kubectl進(jìn)行驗(yàn)證:
? 通過(guò)外部訪問(wèn)接口驗(yàn)證:
假設(shè)1.0版本運(yùn)行了一段時(shí)間,我們又做了一些優(yōu)化準(zhǔn)備發(fā)布1.1版本,那么這時(shí)我們可以借助Rolling Update進(jìn)行滾動(dòng)更新,只需要修改一下YAML配置文件:將鏡像版本的Tag更改為1.1即可。
kubectl apply -f k8s-demo.yaml再次驗(yàn)證一下:鏡像已經(jīng)變成了1.1
? 通過(guò)外部接口訪問(wèn),返回?cái)?shù)據(jù)也已經(jīng)更新:
按照上面的步驟,我們?cè)俅胃碌?.2,最后的效果如下:
03
—
回退實(shí)踐
當(dāng)我們通過(guò)kubectl每次更新應(yīng)用時(shí),K8S都會(huì)記錄下當(dāng)前的配置,保存為一個(gè)revision(版次),這樣就可以回滾到某個(gè)特定的revision。回想一下,我們?cè)诎姹竟芾砉ぞ哳愃朴赟VN,Git中,都可以方便的回滾到之前的某個(gè)revision中。
默認(rèn)配置下,K8S只會(huì)保留最近的幾個(gè)revision,可以在Deployment配置文件中通過(guò)revisionHistoryLimit屬性增加revision數(shù)量。例如下面的例子,將revision數(shù)量設(shè)置為10:
apiVersion: apps/v1 kind: Deployment metadata: name: edc-webapi-deployment namespace: aspnetcore spec: revisionHistoryLimit: 10 ......下面,以上面的示例為例,我們發(fā)現(xiàn)V1.2版本中存在某些bug,需要回退到上一個(gè)V1.1版本:
kubectl rollout undo deployment edc-webapi-deployment -n aspnetcore? 通過(guò)外部訪問(wèn)接口驗(yàn)證一下:已經(jīng)回退到了1.1了。
? 如果想要回退到更遠(yuǎn)的老版本呢?這時(shí),就需要借助--record命令了。怎么弄呢?下面慢慢道來(lái):
(1)準(zhǔn)備三個(gè)YAML配置文件,分別是:k8s-demo-v1.0.yaml,k8s-demo-v1.1.yaml及k8s-demo-v1.2.yaml。
(2)通過(guò)kubectl apply部署并更新應(yīng)用,需要注意的就是加上 --record。
加上--record的作用在于將當(dāng)前命令記錄到revision(版次)記錄中,這樣可以方便我們?cè)诤竺嫱ㄟ^(guò)kubectl rollback時(shí)去指定revision。我們也可以通過(guò)以下命令去查看各個(gè)revision的記錄:
這里可以通過(guò)CHANGE-CAUSE看到每個(gè)revision的具體含義,前提條件就是需要在kubectl apply時(shí)加上--record參數(shù)。
(3)這時(shí)我們?cè)龠M(jìn)行rollback時(shí),可以指定具體revision號(hào)了:
kubectl rollout undo deployment edc-webapi-deployment --to-revision=1 -n aspnetcore
? 驗(yàn)證一下是否回退到了1.0版本:
? 可以看到,已經(jīng)從1.2回退到了1.0版本,符合預(yù)期!
04
—
Rolling Update原理
K8S中對(duì)于更Rolling Update的操作主要是針對(duì)ReplicaSet的操作,可以通過(guò)如下命令查看驗(yàn)證:
kubectl get replicaset -n aspnetcore -o wide可以看到1.0的ReplicaSet edc-webapi-deployment-75977bbfdc創(chuàng)建之后然后被清理了,已經(jīng)沒(méi)有正在運(yùn)行的Pod了。轉(zhuǎn)而創(chuàng)建了新的ReplicaSet edc-webapi-deployment-797dd9b8f8,它有兩個(gè)正在運(yùn)行的Pod。
? 具體過(guò)程我們還可以通過(guò)以下命令查看:
? 通過(guò)日志可以看到,在進(jìn)行對(duì)ReplicaSet的伸縮過(guò)程中,ReplicaSet會(huì)隨之增加或減少一個(gè)Pod,從而完成Pod的替換以實(shí)現(xiàn)滾動(dòng)更新的結(jié)果。
05
—
小結(jié)
滾動(dòng)更新的最大好處在于零停機(jī),整個(gè)更新過(guò)程始終有副本在運(yùn)行,從而保證了業(yè)務(wù)的連續(xù)性。本文介紹了滾動(dòng)更新的概念,然后通過(guò)更新和回滾一個(gè)ASP.NET Core應(yīng)用演示了如何在K8S中進(jìn)行滾動(dòng)更新。
參考資料:
(1)CloudMan,《每天5分鐘玩轉(zhuǎn)Kubernetes》
(2)李振良,《一天入門Kubernets教程》
(3)馬哥(馬永亮),《Kubernetes快速入門》
(4)go4it,《使用kubernetes的deployment進(jìn)行RollingUpdate》
點(diǎn)個(gè)在看少個(gè)bug??
總結(jié)
以上是生活随笔為你收集整理的ASP.NET Core on K8S深入学习(5)Rolling Update的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
 
                            
                        - 上一篇: .NET Core玩转爬虫系列之借助正则
- 下一篇: 依赖注入在 dotnet core 中实
