溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

極簡(jiǎn)容器化交付 | 部署組件分析

發(fā)布時(shí)間:2020-07-31 13:39:44 來(lái)源:網(wǎng)絡(luò) 閱讀:329 作者:容器魔方 欄目:云計(jì)算

之前給大家講了構(gòu)建鏡像的原理,那么有了鏡像之后,我們?cè)趺礃幽軐⑺焖俚牟渴鸬絢uberentes集群上呢?

早期,大家都習(xí)慣于使用kubernetes接口,或者cli命令行來(lái)完成這些操作,但是yaml文件語(yǔ)法的復(fù)雜性、大量容器和kuernetes的概念,讓人難以理解,無(wú)疑成為容器化交付路上的又不障礙。

為了解決這些問(wèn)題,華為云容器服務(wù)推出了向?qū)界R像部署,通過(guò)一步步引導(dǎo)、對(duì)復(fù)雜概念的屏蔽或抽象,在一定程度上降低了用戶首次部署鏡像的難度,但是靈活度相對(duì)較差,對(duì)于經(jīng)常變更版本的場(chǎng)景,還是需要使用原生接口進(jìn)行操作,使得整體研發(fā)交付流程的復(fù)雜度并未降低太多。

鑒于此現(xiàn)狀華為云容器團(tuán)隊(duì)又推出了一款易用性更好、自動(dòng)化程度更高的服務(wù)產(chǎn)品——容器交付流水線,它以容器技術(shù)為基礎(chǔ),踐行DevOps的理念,圍繞容器業(yè)務(wù)端到端場(chǎng)景提供持續(xù)集成和持續(xù)交付能力,包括代碼編譯、鏡像構(gòu)建與交付、自動(dòng)化部署、升級(jí)回滾等能力,并提供全量能力接口,便于與企業(yè)已有流程相結(jié)合,同時(shí)接口屏蔽底層容器概念,對(duì)接口進(jìn)行了二次封裝,接口定義更貼近于CI/CD業(yè)務(wù)概念,使得熟悉CI/CD流程的用戶能快速切換。

發(fā)布組件作為該產(chǎn)品的一個(gè)重要組成部分,其直接影響了整個(gè)發(fā)布周期,我們今天就跟大家一起聊聊該部件的一些實(shí)現(xiàn)原理。

01

Kubernetes Deployment

Kubernetes Deployment提供了官方的用于更新Pod和ReplicaSet(下一代的Replication Controller)的方法,我們可以在Deployment對(duì)象中填寫我們需要用到的配置和版本信息,Deployment控制器將現(xiàn)在的實(shí)際狀態(tài)轉(zhuǎn)換成我們所期望的狀態(tài),例如,將nginx:v1.0升級(jí)成nginx:v2.0,我們只需創(chuàng)建一個(gè)Deployment,Kubernetes會(huì)按照Deployment自動(dòng)進(jìn)行升級(jí)。而隨著Kubernetes的迭代更新,目前云容器引擎服務(wù)提供了幾個(gè)版本的集群,那么如何使得部署組件支持不同的集群版本呢?由于我們的CI/CD的工具提供了deployment的yaml頁(yè)面編輯,部署組件會(huì)根據(jù)deployment中apiversion即:apps/v1, apps/v1beta1, extensions/v1beta1。提供不同版本的API接口。自行封裝接口使得發(fā)布組件自主能動(dòng)性強(qiáng),免于受制于第三方庫(kù)。

02

如何判斷發(fā)布成功?

解決了版本問(wèn)題,還有一個(gè)最重要的問(wèn)題,是如何判斷組件發(fā)布結(jié)果呢?對(duì)于一個(gè)CI/CD工具,我們判斷工作負(fù)載運(yùn)行成功的標(biāo)準(zhǔn)并不僅僅是Pod處于running狀態(tài)又或者工作負(fù)載處于可用狀態(tài)。我們需要保證的是工作負(fù)載運(yùn)行的鏡像或者配置是新版本的。因此我們判斷成功的標(biāo)志應(yīng)該是新起的pod處于running狀態(tài),那如何找到這些新起的pod呢?下圖展示了Deployment,ReplicaSet和Pod之間的關(guān)系,以無(wú)狀態(tài)工作負(fù)載為例,我們通過(guò)查詢deployment中Annotations的"deployment.kubernetes.io/revision",根據(jù)這個(gè)revision尋找Deployment控制的ReplicaSet。最后根據(jù)ReplicaSet的label去尋找這些新起的pod。我們已經(jīng)找到這些新起的Pod了,那么現(xiàn)在就需要對(duì)pod的狀態(tài)進(jìn)行分析了。

極簡(jiǎn)容器化交付 | 部署組件分析
在K8s源碼中PodPhase字段表示了pod的不同階段:

Pending: k8s已經(jīng)接受創(chuàng)建pod的請(qǐng)求,但是容器并沒(méi)有啟動(dòng)成功,這個(gè)階段包括調(diào)度之前的,下載鏡像等。

Running: pod已經(jīng)綁定到node節(jié)點(diǎn),并且所有的容器已經(jīng)啟動(dòng)成功,或者至少有一個(gè)容器在運(yùn)行,或者在重啟中。

Succeeded: pod中的所有的容器已經(jīng)正常的自行退出,并且k8s永遠(yuǎn)不會(huì)自動(dòng)重啟這些容器。

Failed: pod中的所有容器已經(jīng)終止,并且至少有一個(gè)容器已經(jīng)終止于失?。ㄍ顺龇橇阃顺龃a或被系統(tǒng)停止)。

Unknown: 由于一些未知的原因,無(wú)法獲得pod的狀態(tài),通常是因?yàn)閜od的主機(jī)通信錯(cuò)誤。

而以上四個(gè)階段只是一個(gè)粗略狀態(tài)階段。而對(duì)于每一個(gè)階段都有更詳細(xì)的pod conditions信息,podcondition數(shù)組的元素都包含了類型和狀態(tài)字段,這個(gè)類型分為以下四種:

"Ready":Pod能夠提供服務(wù)

"PodScheduled":pod正處于調(diào)度中

"Unschedulable":調(diào)度程序現(xiàn)在無(wú)法調(diào)度Pod,例如由于缺乏資源或其他限制;

"Initialized":所有pod的容器初始化已經(jīng)完成。

"ContainersReady":pod中的容器都已準(zhǔn)備好。

其中狀態(tài)字段用"true" 表示處于,"false"表示不處于,我們發(fā)現(xiàn)當(dāng)階段為Running, condition中Ready狀態(tài)為True時(shí), 即表示pod中的容器可以提供服務(wù)了。因此,我們現(xiàn)在就可以依次判斷新起的pod是否升級(jí)成功了。

03

如何判斷發(fā)布失?。?/p>

現(xiàn)在我們能夠判斷成功了,下一步就需要對(duì)失敗的狀態(tài)進(jìn)行一個(gè)判斷,其實(shí)理論上負(fù)載的成功或者失敗不是一個(gè)確定性的東西,k8s本身具有重試機(jī)制,也存在概率性調(diào)度失敗的情況。所以一開始我們考慮的是通過(guò)一個(gè)超時(shí)機(jī)制來(lái)判斷發(fā)布失敗的情況。但后面分析考慮到,發(fā)布作為一個(gè)重要的組件,需要第一時(shí)間知道問(wèn)題所在,以致可以快速進(jìn)行版本回退等操作。

對(duì)于容器的狀態(tài),pod中的containerstatus包含了更詳細(xì)的當(dāng)前容器的狀態(tài)。其state字段表示容器當(dāng)前的狀態(tài),state分為三種狀態(tài):等待中,運(yùn)行中和已終止,對(duì)應(yīng)三種不同類型的結(jié)構(gòu)體。等待中的結(jié)構(gòu)體包含了處于非運(yùn)行狀態(tài)的原因和信息。其他結(jié)構(gòu)體就不在此一一贅述。結(jié)合podphase、podcondition、以及containerstatus,我們總結(jié)了如下幾個(gè)升級(jí)異常狀態(tài)(如有不全,歡迎補(bǔ)充):

PodPhase == Failed

PodPhase == Succeeded

ContainerStatuses 中有一項(xiàng)為state.waiting 并且 waiting 的原因不是ContainerCreating 或者 PodInitializing(ContainerCreating表示容器創(chuàng)建中,PodInitializing表示pod初始化中)

ContainerStatuses 中有一項(xiàng)為state.running 并且 containerStatuses.ready == false

Conditions中存在一項(xiàng)的type為Ready且status為False且Containerstatues存在

Conditions中存在一項(xiàng)的type為PodScheduled且status為False:調(diào)度失敗

由于pod的狀態(tài)是動(dòng)態(tài)變化的,為了保證發(fā)布結(jié)果的準(zhǔn)確性,我們選擇pod超過(guò)3次時(shí)置為失敗狀態(tài),即發(fā)布失敗。

看完上面這些原理解析,您是不是有什么收獲,或者有什么想法與我們交流呢?請(qǐng)?jiān)谙路搅粝履鷮氋F意見(jiàn)和建議吧?說(shuō)不定下個(gè)版本,您的創(chuàng)意就會(huì)出現(xiàn)在我們的產(chǎn)品里。

相關(guān)服務(wù)請(qǐng)?jiān)L問(wèn)https://www.huaweicloud.com/product/swr.html?cce_helpcenter_2019

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI