基于kubernetes托管虛機有一些現(xiàn)成的方案,不過今天筆者要聊的是在虛機交付后,該如何實現(xiàn)后續(xù)的管理,包括如何實現(xiàn)環(huán)境和代碼的部署與更新,感興趣的可以一起看看,本篇是設(shè)計篇
1. 虛機應(yīng)用的托管
由于虛機應(yīng)用交付流程鏈路的復(fù)雜性,我們無法設(shè)計一套機制,能cover住100%的異常場景,所以我們專注正常流的交付,后期可以針對異常的案例來進行復(fù)盤,不斷提高交付成功率,本節(jié)主要介紹我們設(shè)計的自動化交付流程、以及用到的k8s相關(guān)的機制
1.1 面向終態(tài)的交付
虛機應(yīng)用典型的交付流程大概是這樣的:申請機器-》部署環(huán)境-》部署代碼-》綁定監(jiān)控-》健康檢查-》灰度上線,如果要對標(biāo)容器則創(chuàng)建機器、部署環(huán)境、部署代碼相當(dāng)于完成了一個“虛機鏡像”的交付,也是我們主要要自動化的流程
1.1.1 核心狀態(tài)機
在云原生中通常都是基于面向終態(tài)的交付方式, 基于目標(biāo)狀態(tài)和當(dāng)前狀態(tài)由系統(tǒng)自動進行決策,我們根據(jù)現(xiàn)狀定義了如下的狀態(tài)機:

這里重點說下就緒狀態(tài),就緒狀態(tài)表示應(yīng)用的當(dāng)前的部署環(huán)境、代碼完成,并且健康檢查都通過了即一個節(jié)點可以進行灰度引流了
同時如果一個應(yīng)用的環(huán)境變更則會按照對應(yīng)的安全頻率來進行節(jié)點環(huán)境的變更,只需要變更節(jié)點的環(huán)境列表,系統(tǒng)會自動發(fā)現(xiàn)當(dāng)前節(jié)點需要進行更新,進行狀態(tài)機的轉(zhuǎn)換;然后自動化系統(tǒng)會發(fā)現(xiàn)這個變更則就會進行檢查并且自動化的進行環(huán)境的安裝
1.1.2 故障轉(zhuǎn)移
如果發(fā)現(xiàn)某個節(jié)點宕機后,則會由系統(tǒng)首先將系統(tǒng)設(shè)置為下線狀態(tài)(IAAS平臺還不支持這個事情), 然后會根據(jù)策略來進行決策是否自動進行修復(fù),如果需要修復(fù)則系統(tǒng)會新創(chuàng)建一個節(jié)點然后執(zhí)行上述流程,否則則會修改對應(yīng)的副本數(shù)量
1.1.3 準(zhǔn)入機制

為了保障穩(wěn)定性我們在自動化的流程中加入準(zhǔn)入機制,即在對應(yīng)的階段允許引入人工節(jié)點來進行決策,將控制權(quán)交給應(yīng)用運維,并且提供相關(guān)的數(shù)據(jù)和策略輔助提高運維決策效率
1.1.4 任務(wù)列表
那如果如何確定一個節(jié)點處于某個狀態(tài)下該做哪些任務(wù)呢?這里其實取決于兩部分當(dāng)前狀態(tài)和目標(biāo)狀態(tài),首先我們這里通過系統(tǒng)內(nèi)部(k8s)里面當(dāng)前的狀態(tài)來進行計算以確定節(jié)點當(dāng)前該處于哪個狀態(tài),每當(dāng)進入到一個狀態(tài)就會同時追加一個任務(wù)列表,controller則根據(jù)外部狀態(tài)和任務(wù)列表進行自動化操作,并更新內(nèi)部狀態(tài),從而不斷的完成不同狀態(tài)的切換,最終達到目標(biāo)狀態(tài)
1.1.5 異常流程
異常流程的處理可能是所有自動化系統(tǒng)里面最頭痛的了,在我們的系統(tǒng)里面主要通過兩種方式來解決:人工和自動化(好像特么的是廢話),

首先來說自動化,當(dāng)節(jié)點某些自動化任務(wù)無法進行時系統(tǒng)會通知運維,當(dāng)前系統(tǒng)遇到無法處理的異常了,這時候運維會根據(jù)當(dāng)前問題來修復(fù)某些不滿足的條件,比如開通網(wǎng)絡(luò)策略、部署Agent等等,當(dāng)完成后只需要變更節(jié)點狀態(tài),后續(xù)就會自動化修復(fù)
當(dāng)遇到無法通過上述自動化短時間來解決的時候,運行運維進行手工修復(fù),并強制更新對應(yīng)的狀態(tài),則系統(tǒng)會根據(jù)當(dāng)前的狀態(tài)進行后續(xù)的操作,比如檢測到就緒之后就進行負(fù)載掛載等
1.2 kubernetes相關(guān)機制
那如何利用k8s的相關(guān)機制來實現(xiàn)上述交付流程呢,這里主要通道了webhook、finalizer、annotations幾個機制
1.2.1 webhook
首先我們通過webhook再server更新的時候通過admission.Mutation機制來根據(jù)當(dāng)前內(nèi)部狀態(tài)進行狀態(tài)的決策,以確定接下來的自動化任務(wù),在這環(huán)節(jié)我們實現(xiàn)了從部署環(huán)境-》部署代碼-》就緒狀態(tài)的轉(zhuǎn)換
1.2.2 finalizer
在主機進行刪除的時候,需要等待負(fù)載刪除、暫停監(jiān)控、刪除虛機等流程全部結(jié)束后才能進行節(jié)點對象的刪除,從而實現(xiàn)了節(jié)點信息的異步清理機制
2. 核心設(shè)計
2.1 核心對象設(shè)計

考慮到應(yīng)用的環(huán)境操作和部署操作兩個操作頻率的差異性,我們這里參考k8s聲明了兩個上層控制器,即通過VMReplicaSet來實現(xiàn)程序運行環(huán)境的交付,而將部署操作交由VMDeployment來控制,同時兩個控制在操作某個實例的時候都會先進行狀態(tài)檢測,然后在進行資源的鎖定才能進行相關(guān)的操作,從而保障執(zhí)行流程的穩(wěn)定性
2.2 狀態(tài)轉(zhuǎn)換機制
下面我們會按照幾個不同的場景來分別介紹下虛機狀態(tài)的轉(zhuǎn)換以及對應(yīng)控制器的控制,我們有兩個核心的設(shè)計理念:
1.人只負(fù)責(zé)環(huán)境配置的描述,由系統(tǒng)完成相關(guān)狀態(tài)和自動化操作
2.狀態(tài)的確定依賴于當(dāng)前現(xiàn)狀,同時人的決策高于一切
2.2.1 初始化
當(dāng)檢測副本數(shù)量發(fā)生變化VMReplicaSet首先會發(fā)送申請,確認(rèn)當(dāng)前是否要進行機器的創(chuàng)建,同時會創(chuàng)建對應(yīng)的Server的Package配置,通過計算Package狀態(tài)設(shè)置當(dāng)前狀態(tài)為Initializing,并同時創(chuàng)建部署環(huán)境的任務(wù),然后等待環(huán)境部署的結(jié)果,同時會掛載Server的負(fù)載信息

等待環(huán)境部署完成后,控制器會自動檢測狀態(tài)并設(shè)置為Deploying,同時通過部署系統(tǒng)進行代碼的部署,并將對象重新入隊,直到狀態(tài)部署完成
代碼部署完成后,會進行狀態(tài)檢測,如果系統(tǒng)節(jié)點健康檢查通過并且監(jiān)控狀態(tài)未發(fā)現(xiàn)異常,則會將節(jié)點設(shè)置為Ready狀態(tài),同時負(fù)載控制器和監(jiān)控控制器都會對應(yīng)的配置,至此完成虛機的初始化完成,后續(xù)如果環(huán)境不變,則代碼部署只需要重復(fù)當(dāng)前操作
2.2.2 有狀態(tài)的下線
虛機通常是有狀態(tài)的應(yīng)用,如果要下線通常都是選擇指定的節(jié)點,并標(biāo)記為下線狀態(tài),同時結(jié)合finalizer和控制器完成對應(yīng)負(fù)載和監(jiān)控的同步操作,當(dāng)所有的finalizer都釋放后,最后進行對應(yīng)節(jié)點的刪除
2.2.3 故障轉(zhuǎn)移機制
如果對應(yīng)的節(jié)點宕機,則只需要加一個處理轉(zhuǎn)換邏輯即可,如果是短時間可以恢復(fù)就只需要將對應(yīng)的節(jié)點標(biāo)記為UnKnown,同時監(jiān)控和負(fù)載控制器進行對應(yīng)的操作,然后等待重啟后接收到對應(yīng)的事件后將節(jié)點設(shè)置為Initializing, 然后系統(tǒng)會自動進行對應(yīng)的檢測邏輯,自動轉(zhuǎn)換為Ready,監(jiān)控和負(fù)載控制器監(jiān)控自動執(zhí)行相關(guān)邏輯,即可完成上線
如果節(jié)點不可修復(fù)只需要將狀態(tài)設(shè)置為下線狀態(tài),然后對應(yīng)的副本控制器檢測到節(jié)點不足,就會自動調(diào)用IAAS系統(tǒng)進行自動創(chuàng)建,然后執(zhí)行初始化流程即可
3. 未完待續(xù)
基于流程驅(qū)動的跟基于k8s的控制器在實現(xiàn)流程上其實并沒有本質(zhì)的差別,在云原生里面有很多種玩法,虛機應(yīng)用的管理本質(zhì)上就是復(fù)雜環(huán)境的管理。
如何管理復(fù)雜的環(huán)境,其實就是讓環(huán)境可描述,系統(tǒng)自治,盡可能減少人的參與,人只參與影響穩(wěn)定性的決策,而不參與任何關(guān)于流程驅(qū)動。
編輯:hfy
-
控制器
+關(guān)注
關(guān)注
114文章
17859瀏覽量
194975 -
狀態(tài)機
+關(guān)注
關(guān)注
2文章
501瀏覽量
29309 -
負(fù)載控制器
+關(guān)注
關(guān)注
0文章
4瀏覽量
6539 -
kubernetes
+關(guān)注
關(guān)注
0文章
273瀏覽量
9528
發(fā)布評論請先 登錄
Kubernetes Ingress Controller對比解析
Kubernetes Pod異常問題排查實戰(zhàn)
Kubernetes Pod調(diào)度策略原理與落地指南
Kubernetes存儲管理功能的落地實踐
KubePi:開源Kubernetes可視化管理面板,讓集群管理如此簡單
Kubernetes kubectl命令行工具詳解
香港服務(wù)器支持Docker和Kubernetes嗎?
跨阻放大器的虛短虛斷如何分析以及電流的流向?
Kubernetes安全加固的核心技術(shù)
高效管理Kubernetes集群的實用技巧
生產(chǎn)環(huán)境中Kubernetes容器安全的最佳實踐
樹莓派部署 Kubernetes:通過 UDM Pro 實現(xiàn) BGP 負(fù)載均衡!
詳解Kubernetes中的Pod調(diào)度親和性
什么是運放的虛短和虛斷
Kubernetes Helm入門指南
基于kubernetes托管虛機后續(xù)管理設(shè)計
評論