摘 ?要:視頻分析系統(tǒng)隨著檢測類型、檢測視頻路數(shù)的不斷增加,既有系統(tǒng)后臺架構(gòu)的弊端日漸凸顯,主要體現(xiàn)在高可用、部署、自動化運維、橫向自動擴(kuò)縮容四個方面。為了解決這四個方面問題,提出了基于K3s的云原生應(yīng)用容器平臺的架構(gòu)設(shè)計。經(jīng)試用實踐證明,該平臺架構(gòu)既保證了視頻分析系統(tǒng)的高可用性,又有效地提高了部署效率,在基本實現(xiàn)了自動化運維的同時,也具有了橫向擴(kuò)縮容功能。
關(guān)鍵詞:K3s;容器;自動化運維
中圖分類號:TP393 ? ?文獻(xiàn)標(biāo)識碼:A 文章編號:2096-4706(2021)12-0022-04
Abstract: With the continuous increase of detection types and the number of detection video channels, the disadvantages of the background architecture of the existing video analysis system are becoming increasingly prominent, which are mainly reflected in four aspects: high availability, deployment, automatic operation and maintenance and horizontal automatic expansion and contraction. In order to solve these four problems, the architecture design of cloud native application container platform based on K3s is proposed. The trial practice shows that the platform architecture not only ensures the high availability of the video analysis system, but also effectively improves the deployment efficiency. It not only basically realizes automatic operation and maintenance, but also has the function of horizontal expansion and contraction.
Keywords: K3s; container; automatic operation and maintenance
0 ?引 ?言
隨著高速鐵路的快速發(fā)展,為了進(jìn)一步提高車站、站臺以及沿線的安全,對視頻分析系統(tǒng)(以下簡稱分析系統(tǒng))提出了更高的要求。在視頻檢測量不斷增多的同時,多樣化的檢測需求也在不斷地提出,而分析系統(tǒng)通過不斷地增加視頻檢測服務(wù)來滿足需求。
不斷增多的視頻檢測服務(wù)讓分析系統(tǒng)問題凸顯:
(1)由于檢測服務(wù)多,有些服務(wù)間彼此依賴,某一個服務(wù)的異常都可能導(dǎo)致某一類檢測服務(wù)的不可用。
(2)以人工為主的部署,可維護(hù)性差。
(3)以人工為主的運維錯誤率較高,導(dǎo)致穩(wěn)定性差。
(4)在檢測需求波動大時,無法做到橫向自動擴(kuò)縮容。因此,只有探索提高平臺的高可用、服務(wù)的易部署、運維的自動化、橫向的自動擴(kuò)縮容的解決方案,才能解決目前分析系統(tǒng)所遇到的瓶頸問題。
容器技術(shù)+容器編排調(diào)度工具是國內(nèi)外現(xiàn)階段平臺建設(shè)領(lǐng)域的主流。本文根據(jù)分析系統(tǒng)自身業(yè)務(wù)的需求和特點,結(jié)合K3S等開源項目搭建私有的云原生應(yīng)用容器平臺(以下簡稱容器云),并將原有系統(tǒng)的服務(wù)拆分改造并容器化后遷移到容器云上,以達(dá)到分析系統(tǒng)的高可用、易部署、自動化運維、橫向自動擴(kuò)縮容的目的。
1 ?開源項目概述
1.1 ?Docker
Docker是一個開源的應(yīng)用容器引擎,讓開發(fā)者可以打包應(yīng)用以及依賴到一個可移植的容器中,然后發(fā)布到任何流行的Linux設(shè)備或者Windows設(shè)備,也可以實現(xiàn)虛擬化,容器是完全使用沙箱機(jī)制,相互之間不會有任何接口[1]。結(jié)合Dockers鏡像私庫,可以方便地管理鏡像以及版本,達(dá)到了一次打包隨處部署的可能。同時,將應(yīng)用部署到容器使其具有了可移植性,成為一種必然的趨勢。因此,可以將Docker作為構(gòu)建容器云的基礎(chǔ)引擎。
1.2 ?Nvidia-device-plugin與Nvidia-docker
Nvidia-device-plugin是用于K3s的NVIDIA設(shè)備插件。通過將此插件部署為一個DaemonSet??梢詫崿F(xiàn):
(1)在集群的每個節(jié)點上公開GPU的數(shù)量。
(2)跟蹤GPU的運行狀況。
(3)在K8s集群中運行支持GPU的容器。
Nvidia-docker是NVIDIA容器工具包,允許用戶構(gòu)建和運行GPU加速的Docker容器,該工具包包括一個容器運行時庫和實用程序,用于自動配置容器以利用NVIDIA GPU。目前分析系統(tǒng)中使用的正是NVIDIA的GPU設(shè)備,所以需要在配備了GPU的主機(jī)上部署以上兩個插件,使Docker支持GPU的應(yīng)用。
1.3 ?K3s
對于大型企業(yè)而言,隨著系統(tǒng)規(guī)模的不斷擴(kuò)大,應(yīng)用服務(wù)的數(shù)量和節(jié)點主機(jī)的數(shù)量都在逐漸增加,單純靠Docker已無法滿足系統(tǒng)運維的需求[2]。K3s是Rancher開源的一個輕量級的Kubernetes[3](以下簡稱K8s)發(fā)行版,它針對邊緣計算、物聯(lián)網(wǎng)等場景進(jìn)行了高度優(yōu)化,最大程度減輕了外部依賴性。K3s保留了K8s的:
(1)集群管理。
(2)應(yīng)用健康檢測與自動修復(fù)能力。
(3)容器集群的自動化部署。
(4)支持服務(wù)的發(fā)現(xiàn)調(diào)度。
(5)彈性伸縮等特性[4]。
由于K8s背靠Google,且有眾多的成功案例。而K3s來源于K8s,因此基于K3s構(gòu)建容器云是一個不錯的選擇。
1.4 ?Prometheus
Prometheus是一個系統(tǒng)監(jiān)控和告警的開源項目,2016年加入CNCF(Cloud Native Computing Foundation),成為僅次于K8s之后的第二個托管項目。Prometheus的主要優(yōu)勢:
(1)由指標(biāo)名和鍵/值對標(biāo)簽標(biāo)識的時間序列數(shù)據(jù)組成的多維數(shù)據(jù)模型。
(2)強(qiáng)大的查詢語言PromQL。
(3)不依賴分布式存儲,單個服務(wù)節(jié)點具有自治能力。
(4)HTTP協(xié)議的數(shù)據(jù)服務(wù)接口。
(5)支持多種類型的圖表和儀表盤[5]。
目前已被廣泛地用于K8s集群的監(jiān)控系統(tǒng)中。因此,選擇Prometheus作為容器云的基礎(chǔ)監(jiān)控及告警的工具。
1.5 ?Docker-Registry
Registry是一個無狀態(tài)、高度可擴(kuò)展的服務(wù)端應(yīng)用程序,用于存儲和分發(fā)Docker鏡像。Registry是開源的[6]。此項目是Docker官方提供給用戶構(gòu)建私有本地鏡像倉庫的工具。因此,作為容器云的私有鏡像倉庫工具。
2 ?容器云的平臺設(shè)計
2.1 ?總統(tǒng)設(shè)計
容器云既可以部署在物理主機(jī)上,也可以部署在云主機(jī)上,總體架構(gòu)如圖1所示。
資源層屬于設(shè)備層,可以是物理主機(jī)設(shè)備,也可以是云主機(jī)設(shè)備,主要是為平臺層提供存儲和部署能支撐容器的操作系統(tǒng)。本次平臺設(shè)計與實踐是以物理主機(jī)為主,用于檢測服務(wù)的主機(jī)設(shè)備還需要配備NVIDIA的GPU硬件。
平臺層包括容器云的核心組件,如:集群監(jiān)控Prometheus、運行鏡像的容器引擎Docker、支持GPU設(shè)備的容器插件、統(tǒng)一編排與調(diào)度的K3s、鏡像私庫Docker-Registry、高可用的分布式存儲MinIO等。
應(yīng)用層是針對平臺層進(jìn)行對集群管理、應(yīng)用管理、部署管理、鏡像管理以及監(jiān)控管理等的一些平臺類的管理軟件。
2.2 ?系統(tǒng)總體功能設(shè)計
容器云,主要是對分析系統(tǒng)的可視化部署、自動化運維、服務(wù)高可用、橫向自動擴(kuò)縮容四方面的支持。自動化運維包括:平臺監(jiān)控、故障自動修復(fù)等,為分析系統(tǒng)的高可用運行提供保障。
2.2.1 ?可視化部署
容器云對部署提供可視化界面,簡化了通過編寫YAML或JSON文件等方式來部署的煩瑣操作,保證了部署的容器具有統(tǒng)一規(guī)范的命名、labels等,便于后期的運維管理;通過可視化界面可以很方便地對所部署的容器選擇所依賴的GPU廠商,并將此容器部署到配備了所依賴廠商GPU的節(jié)點上,避免了由于部署錯誤而導(dǎo)致容器不可用的問題。可視化部署界面如圖2所示。
2.2.2 ?自動化運維
容器云提供對平臺的監(jiān)控、故障的自修復(fù)等功能,為運維人員提供高效便捷的自動化運維工具:
(1)平臺監(jiān)控。容器云監(jiān)控工具采用開源項目Prometheus。提供的監(jiān)控項主要有:物理主機(jī)的狀態(tài)、平臺的運行狀態(tài)、應(yīng)用的狀態(tài)、服務(wù)負(fù)載等方面的監(jiān)控指標(biāo)。同時以圖表及儀表盤的方式進(jìn)行展示。對異常告警可以通過郵件、微信等通信方式推送到指定的運維人員,既降低了人工巡檢的成本,又縮短了故障發(fā)現(xiàn)的周期。集群主機(jī)節(jié)點及監(jiān)控如圖3所示。
(2)故障自動修復(fù)。當(dāng)K3s的健康檢查機(jī)制發(fā)現(xiàn)某個節(jié)點出現(xiàn)問題,它會自動將該節(jié)點上的資源轉(zhuǎn)移到其他節(jié)點上并完成自動恢復(fù);當(dāng)檢測發(fā)現(xiàn)某個容器出現(xiàn)問題時,會重啟容器。私有倉庫的搭建,為分析系統(tǒng)的服務(wù)出現(xiàn)異常時進(jìn)行自動修復(fù)提供了支持,為新版本部署失敗后回滾到其他歷史版本提供了支持,為應(yīng)用服務(wù)的不間斷運行提供了可能。
2.2.3 ?服務(wù)高可用
分析系統(tǒng)的服務(wù)高可用通過K3s的副本及探針等機(jī)制來實現(xiàn)。
2.2.4 ?橫向自動擴(kuò)縮容
K3s根據(jù)容器預(yù)定義的負(fù)載指標(biāo)(包括:CPU、GPU、內(nèi)存、磁盤等)的使用情況來確定是否進(jìn)行擴(kuò)容或縮容。在分析系統(tǒng)中,主要以GPU的監(jiān)控指標(biāo)來確定擴(kuò)縮容的情況。
2.3 ?容器云的高可用設(shè)計
分析系統(tǒng)在面向生產(chǎn)環(huán)境的實踐中,高可用部署是無法避免的問題。在這種情況下,通過容器云的高可用,來避免所造成的影響,或者將影響降到最低。
2.3.1 ?K3s的高可用部署
雖然單節(jié)點K3s集群可以滿足各種用例,但對于Kubernetes Control-plane的正常運行至關(guān)重要的環(huán)境,可以在高可用配置中運行K3s[7]。這種模式下,必須有奇數(shù)的服務(wù)器節(jié)點,建議從三個節(jié)點開始。K3s高可用架構(gòu)示意圖如圖4所示。
2.3.2 ?存儲的可靠性
容器云根據(jù)分析系統(tǒng)對存儲的安全性要求,對視頻檢測結(jié)果的圖片、視頻片段等文件都存儲到統(tǒng)一的分布式對象存儲MinIO中;對用戶數(shù)據(jù)則存儲到采用主從方式部署的高可用集群數(shù)據(jù)庫中。在K3s集群中采用ETCD作為數(shù)據(jù)存儲的媒介。
2.3.3 ?分析系統(tǒng)的高可用
分析系統(tǒng)的各類服務(wù)都以容器的形式部署到K3s中,K3s通過副本的冗余來提供服務(wù)的高可用。首先打包服務(wù)為鏡像并上傳到鏡像私庫,然后在容器云的可視化部署界面,根據(jù)業(yè)務(wù)的實際運行情況,以Deployment、StatefulSets或DaemonSets中的任一種方式部署服務(wù),通過配置合理的副本數(shù)和探針保證服務(wù)的高可用。當(dāng)主機(jī)節(jié)點出現(xiàn)故障或服務(wù)本身的BUG導(dǎo)致不可用時,K3s就會自動在其他主機(jī)上重新部署服務(wù)或重啟服務(wù),來保證與部署配置的一致性。
2.3.4 ?監(jiān)控的多樣化與自動告警
容器云分別從主機(jī)節(jié)點、容器云、容器三個方面對容器云的健康狀況進(jìn)行監(jiān)控。
在所有的主機(jī)節(jié)點上都部署了Prometheus的客戶端組件node-exporter(配備了NVIDIA GPU的主機(jī)需要部署dcgm-exporter[6],其他廠商的GPU需要根據(jù)廠商提供的插件安裝),實時采集宿主機(jī)的硬件、操作系統(tǒng)以及所部署的容器的關(guān)鍵指標(biāo)并上報。一旦出現(xiàn)告警,就會觸發(fā)Alert manager組件,并根據(jù)平臺配置進(jìn)行告警。
對于容器,利用K3s的探針機(jī)制,定期檢測健康狀態(tài),當(dāng)檢測到異常時,自動根據(jù)配置策略對容器進(jìn)行下一步的操作,同時發(fā)送告警信息。
以上三個方面的監(jiān)控都可以通過平臺配置,及時地通過即時通信軟件告知運維人員,以便及時排查問題。
2.4 ?技術(shù)要點分析
2.4.1 ?Docker支持GPU
K3s支持對節(jié)點上的GPU進(jìn)行管理。但是需要根據(jù)各GPU廠商的要求部署GPU容器插件。例如NVIDIA的GPU容器插件要求:
(1)必須預(yù)先安裝了NVIDIA驅(qū)動。
(2)必須預(yù)先安裝了Nvidia-Docker2.0。
(3)Docker的默認(rèn)運行時必須設(shè)置為Nvidia-Container-Runtime,而不是RunC。
(4)NVIDIA驅(qū)動版本~=384.81[8]。
2.4.2 ?如何將容器部署到指定主機(jī)節(jié)點
要將容器部署到指定的主機(jī)節(jié)點,需要進(jìn)行兩方面的設(shè)置。首先對加入容器云集群并配備了GPU的主機(jī)增加自定義labels:hardware-type(例如:hardware-type=NVIDIA GPU);然后分析系統(tǒng)檢測服務(wù)部署時需要指定nodeSelector的值,具體內(nèi)容為:spec.nodeSelector.hardware-type=NVIDIAGPU或spec.template.spec.nodeSelector.hardware-type=NVIDIAGPU。按以上內(nèi)容配置后,就能將檢測服務(wù)部署到配備有NVIDIA GPU的主機(jī)節(jié)點上了。
2.4.3 ?橫向自動擴(kuò)縮容
K3s提供了Pod水平自動伸縮(Horizontal Pod Autoscaler, HPA),根據(jù)資源利用率或自定義的指標(biāo)自動調(diào)整副本的數(shù)量,實現(xiàn)部署的自動擴(kuò)容與縮容。讓部署的規(guī)模接近于實際服務(wù)的負(fù)載。
2.4.4 ?服務(wù)的高可用
K3s提供了ReplicaSet(RS)/Replication Controller(RC)來保證部署的服務(wù)是多副本的;而提供的Probe(探針)是對容器執(zhí)行的定期診斷,每次診斷都會獲得三種結(jié)果(成功、失敗、未知)之一,針對運行中的容器,可以運行三種探針的一種或多種:
(1)livenessProbe,存活態(tài)探針,探測容器是否正常運行,如果失敗,則殺死容器,并將根據(jù)其重啟策略決定未來。
(2)readinessProbe,就緒態(tài)探針,探測容器是否準(zhǔn)備好為請求提供服務(wù),如果失敗,節(jié)點控制器從與容器組匹配的所有服務(wù)的節(jié)點列表中刪除該容器組的IP地址。
(3)startupProbe,啟動探針,探測容器中的應(yīng)用是否已經(jīng)啟動,如果失敗,那么其他探針都將被禁止。
3 ?容器云試用成效
在搭建完成的容器云上遷移并測試視頻分析系統(tǒng)的各個模塊后,得到以下試用效果:
(1)具備了高可用性:容器云的高可用架構(gòu)設(shè)計,通過冗余和故障的自動修復(fù)保證了分析系統(tǒng)各類服務(wù)的高可用性。
(2)提高了部署效率:在容器云的可視化部署界面只需要選擇鏡像、設(shè)置副本、需要GPU的選擇相應(yīng)的GPU廠商后,就可以部署一個應(yīng)用,相比之前依靠手動或Shell腳本的部署,既降低了難度又提高了成功率。
(3)提升了監(jiān)控能力:采用Prometheus對容器云的多級監(jiān)控,使得監(jiān)控指標(biāo)更豐富,監(jiān)控內(nèi)容更完善,運維自動化程度的加強(qiáng),提高了故障通知的及時性和故障響應(yīng)的效率。
(4)實現(xiàn)了自動擴(kuò)縮容:通過對檢測服務(wù)的容器預(yù)定義GPU的指標(biāo),可以自動的對檢測服務(wù)進(jìn)行擴(kuò)容/縮容,既增強(qiáng)了服務(wù)的響應(yīng)能力又提高了GPU資源的利用率。
4 ?結(jié) ?論
容器云基于K3s技術(shù)將分析系統(tǒng)的部署可視化、運維自動化、各類服務(wù)高可用化、橫向擴(kuò)縮容自動化。容器云在分析系統(tǒng)項目的遷移試用中達(dá)到了預(yù)期的效果,但對于原生云涉及的DevOps和持續(xù)交付兩部分本文暫未涉及,有待下一步進(jìn)行探索和實踐。
參考文獻(xiàn):
[1] 百度百科.Docker [EB/OL].[2021-04-19].https://baike. baidu.com/item/Docker/13344470?fr=aladdin.
[2] 翁涅元,單杏花,閻志遠(yuǎn),等.基于Kubernetes的容器云平臺設(shè)計與實踐 [J].鐵路計算機(jī)應(yīng)用,2019,28(12):49-53.
[3] Kubernetes. Kubernetes是什么? [EB/OL].[2021-04-19].https://kubernetes.io/zh/docs/concepts/overview/what-is-kubernetes/.
[4] Rancher. K3s介紹 [EB/OL].[2021-04-19].https://docs. rancher.cn/docs/K3s/_index.
[5] Prometheus. OVERVIEW [EB/OL]. [2021-04-19].https://prometheus.io/docs/introduction/overview/.
[6] Docker Docs. Docker Registry [EB/OL].[2021-04-15].https://docs.docker.com/registry/.
[7] Rancher.架構(gòu)介紹 [EB/OL].[2021-04-20].https://docs.rancher.cn/docs/K3s/architecture/_index.
[8] Kubernetes.調(diào)度GPU [EB/OL].[2021-04-18].https://kubernetes.io/zh/docs/tasks/manage-gpus/scheduling-gpus/.
作者簡介:劉忠(1976.12—),男,漢族,河北張家口人,工程師,研究方向:通信信息。