樊 雷
(連云港師范高等專科學(xué)校 數(shù)學(xué)與信息工程學(xué)院,江蘇 連云港 222006)
近年來云計(jì)算和虛擬化技術(shù)得到快速發(fā)展,互聯(lián)網(wǎng)IT基礎(chǔ)設(shè)施呈現(xiàn)快速更新迭代、業(yè)務(wù)場(chǎng)景不斷創(chuàng)新的趨勢(shì)。隨著IT基礎(chǔ)設(shè)施運(yùn)維成本逐步攀升,如何在生產(chǎn)環(huán)境下保持高可用、可擴(kuò)展、高性能等方面提高效率、降低運(yùn)維成本是云計(jì)算和虛擬化應(yīng)用面臨的新課題。
容器技術(shù)在資源占用、部署效率、快速交付等方面相對(duì)于虛擬機(jī)具備顯著的優(yōu)勢(shì),在提高軟件交付的效率、提升應(yīng)用系統(tǒng)的彈性和運(yùn)維效率、縮短業(yè)務(wù)上線的時(shí)間上都發(fā)揮著重要的作用。容器技術(shù)的核心是利用容器實(shí)現(xiàn)應(yīng)用程序的封裝,從而實(shí)現(xiàn)了應(yīng)用程序的便攜性和可移植性。在容器集群中,容器之間可以共享主機(jī)的操作系統(tǒng)內(nèi)核,從而節(jié)省了運(yùn)維成本,提升了應(yīng)用的系統(tǒng)利用率。因?yàn)槿萜骷夹g(shù)對(duì)硬件資源的占用較輕,所以在容器集群中可以運(yùn)行更多的應(yīng)用實(shí)例,進(jìn)一步提高系統(tǒng)的彈性和可擴(kuò)展性,滿足業(yè)務(wù)高可用和彈性需求。
目前,容器技術(shù)主要標(biāo)準(zhǔn)是Docker,同時(shí)Kubernetes是目前最流行的容器集群管理工具,這使得容器技術(shù)得到了更廣泛的應(yīng)用。但是在生產(chǎn)環(huán)境中,容器部署的復(fù)雜性、應(yīng)用的性能、容器的穩(wěn)定性等都是需要考慮的。在容器的彈性伸縮管理中,如何調(diào)整容器資源限制、調(diào)整集群的節(jié)點(diǎn)數(shù)量、配置負(fù)載均衡等方面會(huì)影響到容器集群的彈性伸縮能力和性能表現(xiàn),因此需要對(duì)應(yīng)用的負(fù)載特性進(jìn)行分析和調(diào)整,以更好地發(fā)揮容器技術(shù)的優(yōu)勢(shì),實(shí)現(xiàn)更高的系統(tǒng)性能和更好的用戶體驗(yàn)。
容器技術(shù)是一種輕量級(jí)虛擬化技術(shù),相比于傳統(tǒng)的虛擬機(jī)技術(shù),容器技術(shù)對(duì)硬件資源的需求相對(duì)較少,優(yōu)勢(shì)表現(xiàn)在以下幾個(gè)方面:
1) 容器技術(shù)支持快速部署和快速交付。容器技術(shù)有利于進(jìn)行多語言框架的封裝部署,通過鏡像的方式進(jìn)行快速部署和快速交付。
2) 容器技術(shù)支持隔離控制和資源限制。容器技術(shù)支持CPU、內(nèi)存、IO等資源限制,可以防止單個(gè)應(yīng)用程序獨(dú)占資源,造成系統(tǒng)崩潰。
3) 容器技術(shù)支持高可用和容錯(cuò)。容器技術(shù)可以進(jìn)行手動(dòng)或自動(dòng)的容器實(shí)例的監(jiān)控和重啟,保障應(yīng)用程序的持續(xù)可用性。
4) 容器技術(shù)支持彈性伸縮。容器技術(shù)支持通過調(diào)整容器的數(shù)量、資源限制的方法進(jìn)行動(dòng)態(tài)擴(kuò)容和縮減,根據(jù)負(fù)載情況快速適應(yīng)。
容器集群是由多個(gè)容器組成的一個(gè)集群,每個(gè)容器運(yùn)行一個(gè)應(yīng)用程序。容器集群的彈性伸縮問題是指在應(yīng)用程序負(fù)載增加時(shí),自動(dòng)地增加計(jì)算資源,以保證應(yīng)用程序的正常運(yùn)行。容器集群的彈性伸縮需要考慮多個(gè)因素,例如負(fù)載預(yù)測(cè)、資源分配和容器調(diào)度等。
負(fù)載預(yù)測(cè)是容器集群彈性伸縮的一個(gè)關(guān)鍵問題。負(fù)載預(yù)測(cè)是指預(yù)測(cè)未來一段時(shí)間內(nèi)應(yīng)用程序的負(fù)載情況,以便根據(jù)負(fù)載情況進(jìn)行資源分配和容器伸縮。負(fù)載預(yù)測(cè)需要考慮多個(gè)因素,例如歷史負(fù)載、節(jié)假日、活動(dòng)、天氣等。
負(fù)載預(yù)測(cè)的方法通常有以下幾種:
1) 基于時(shí)間序列的方法:將負(fù)載序列看作時(shí)間序列數(shù)據(jù),預(yù)測(cè)未來一段時(shí)間內(nèi)的負(fù)載情況。這種方法需要考慮數(shù)據(jù)的周期性和趨勢(shì)性。
2) 基于機(jī)器學(xué)習(xí)的方法:利用機(jī)器學(xué)習(xí)算法對(duì)歷史負(fù)載數(shù)據(jù)進(jìn)行分析和學(xué)習(xí),預(yù)測(cè)未來一段時(shí)間內(nèi)的負(fù)載情況。這種方法需要考慮特征選擇、訓(xùn)練數(shù)據(jù)和模型選擇等問題。
3) 基于統(tǒng)計(jì)方法的方法:利用統(tǒng)計(jì)學(xué)理論對(duì)歷史負(fù)載數(shù)據(jù)進(jìn)行分析和建模,預(yù)測(cè)未來一段時(shí)間內(nèi)的負(fù)載情況。這種方法需要考慮數(shù)據(jù)的分布、假設(shè)檢驗(yàn)和模型選擇等問題。
資源分配是容器集群彈性伸縮的另一個(gè)關(guān)鍵問題。資源分配是指根據(jù)負(fù)載情況,自動(dòng)地分配計(jì)算資源,以保證應(yīng)用程序的正常運(yùn)行。資源分配需要考慮容器的數(shù)量、容器所在的物理機(jī)和虛擬機(jī)的資源情況,以及容器之間的資源隔離等因素。
常見的資源分配方法包括:
1) 基于容器組的方法:將多個(gè)容器編組,按照組的負(fù)載情況進(jìn)行資源分配。
2) 基于服務(wù)的方法:將多個(gè)容器編組服務(wù),按照服務(wù)的負(fù)載情況進(jìn)行資源分配。
3) 基于節(jié)點(diǎn)的方法:將多個(gè)容器分散在不同的節(jié)點(diǎn)上,按照節(jié)點(diǎn)的負(fù)載情況進(jìn)行資源分配。
在彈性伸縮中選擇合適的容器編排工具,監(jiān)控容器集群負(fù)載情況,定義合適的策略,選擇合適的資源分配調(diào)度算法,充分考慮容器的隔離和相互影響,以及系統(tǒng)負(fù)載均衡都是其中的關(guān)鍵因素。
容器調(diào)度是容器集群彈性伸縮的另一個(gè)關(guān)鍵問題。容器調(diào)度是指找到合適的節(jié)點(diǎn),將容器調(diào)度到該節(jié)點(diǎn)上。容器調(diào)度需要考慮多個(gè)因素,例如節(jié)點(diǎn)的剩余資源、網(wǎng)絡(luò)延遲等。
目前比較流行的容器調(diào)度工具包括Kubernetes、Docker Swarm和Mesos等。
容器集群的管理和調(diào)度方面,目前比較成熟的是Kubernetes。Kubernetes 具備強(qiáng)大的功能特性。針對(duì)Kubernetes 的彈性伸縮特性,已經(jīng)有一些研究取得了關(guān)于性能優(yōu)化、負(fù)載均衡策略、彈性伸縮策略等方面的成果。
在性能優(yōu)化方面,文獻(xiàn)[1] 提出一種融合了基于Web 請(qǐng)求量的請(qǐng)求預(yù)測(cè)模型和基于排隊(duì)論的Web 應(yīng)用性能分析的Kubernetes 容器彈性伸縮方法[1]。在負(fù)載均衡策略方面,文獻(xiàn)[2]通過對(duì)Kubernetes 的架構(gòu)進(jìn)行分析后,設(shè)計(jì)一種基于負(fù)載預(yù)測(cè)的彈性伸縮方案,將所提出的預(yù)測(cè)模型DAPSO-GRU-LSTM 應(yīng)用到彈性伸縮方案中,在Kubernetes集群中設(shè)計(jì)監(jiān)控模塊、負(fù)載預(yù)測(cè)模塊以及彈性伸縮模塊,并對(duì)各個(gè)模塊進(jìn)行實(shí)現(xiàn)[2]。文獻(xiàn)[3] 提出了基于深度學(xué)習(xí)Transformer 模型的面向Kubernetes 容器云的微服務(wù)負(fù)載預(yù)測(cè)模型TSBT[3]。
本文的實(shí)驗(yàn)是基于Kubernetes集群平臺(tái)的容器部署環(huán)境,使用Docker 作為容器運(yùn)行引擎,使用Prometheus 等工具進(jìn)行數(shù)據(jù)統(tǒng)計(jì)和分析。在進(jìn)行實(shí)驗(yàn)前,需要準(zhǔn)備如下的環(huán)境和工具:
1) 硬件環(huán)境:服務(wù)器CPU Intel Xeon 2.4GHz 32核64線程,內(nèi)存128GB,硬盤8TB。
2) 軟件環(huán)境:CentOS 7.x,Kubernetes 集群環(huán)境,Docker 容器運(yùn)行引擎,Prometheus 數(shù)據(jù)庫(kù)和監(jiān)控操作工具。
3) 實(shí)驗(yàn)工具:IOPerf,Prometheus,Grafana。
在實(shí)驗(yàn)中,針對(duì)不同的容器資源限制、集群節(jié)點(diǎn)數(shù)量、負(fù)載均衡等因素實(shí)施了不同的負(fù)載均衡策略,對(duì)容器集群進(jìn)行了性能測(cè)試,對(duì)實(shí)驗(yàn)結(jié)果進(jìn)行了相關(guān)數(shù)據(jù)分析。
容器資源限制主要針對(duì)CPU、內(nèi)存、IO 等方面進(jìn)行限制,在實(shí)驗(yàn)中針對(duì)CPU和內(nèi)存資源進(jìn)行了限制設(shè)置,并對(duì)容器實(shí)例數(shù)量、CPU 資源限制、內(nèi)存資源限制、負(fù)載壓力等指標(biāo)進(jìn)行了測(cè)試和分析。
圖1展示了Kubernetes容器集群中不同容器實(shí)例數(shù)量在20分鐘內(nèi)的遞增情況。隨著容器實(shí)例數(shù)量的快速增加,CPU 和內(nèi)存資源占用也會(huì)隨之增加,并且在容器實(shí)例數(shù)量較大時(shí)呈現(xiàn)出指數(shù)級(jí)增長(zhǎng)。因此,在容器資源限制方面需要根據(jù)實(shí)際情況進(jìn)行調(diào)整,避免因?yàn)橘Y源限制不合理而導(dǎo)致CPU和內(nèi)存負(fù)載過重,從而影響容器集群的穩(wěn)定性。

圖1 Kubernetes容器集群中Pod遞增情況
負(fù)載均衡在容器集群彈性伸縮管理中發(fā)揮著重要的作用。在實(shí)驗(yàn)中,通過設(shè)置負(fù)載均衡策略來實(shí)現(xiàn)容器實(shí)例的動(dòng)態(tài)負(fù)載均衡。在Kubernetes 中,自動(dòng)彈性伸縮主要有三種方式,Pod 水平自動(dòng)伸縮(HPA ,Horizontal Pod Autoscaler) 、Pod 垂直自動(dòng)伸縮(VPA,Vertical Pod Autoscaler) 和集群自動(dòng)伸縮(CA,Cluster Autoscaler) 。HPA用于自動(dòng)擴(kuò)展和縮減 Pod 數(shù)量,可以根據(jù) Pod 的負(fù)載和資源利用率的情況,自動(dòng)地增加或減少 Pod 的數(shù)量,解決的是業(yè)務(wù)負(fù)載波動(dòng)較大的問題。VPA負(fù)責(zé)調(diào)整單個(gè)Pod 的資源限額 request、limit 實(shí)現(xiàn),解決的是資源配額評(píng)估不準(zhǔn)的問題,依賴歷史負(fù)載指標(biāo),自動(dòng)計(jì)算或調(diào)整資源配額。CA 用于自動(dòng)擴(kuò)展和縮減節(jié)點(diǎn)上的容器數(shù)量。它可以根據(jù)節(jié)點(diǎn)的資源利用率和可用性,自動(dòng)地增加或減少節(jié)點(diǎn)的數(shù)量。
HPA 會(huì)計(jì)算同一組內(nèi)所有Pod 的平均CPU 使用率,并與預(yù)設(shè)的閾值進(jìn)行比較,如果低于閾值,則減少實(shí)例的數(shù)量,如果高于閾值,則增加實(shí)例的數(shù)量。另外為了保證資源不會(huì)被用戶耗盡,還需要設(shè)置實(shí)例數(shù)量的上限。由于自動(dòng)伸縮進(jìn)行的過程中,也會(huì)增加CPU的使用,為了減少在自動(dòng)伸縮過程中的這種抖動(dòng)現(xiàn)象,HPA 中同樣地也引入了一個(gè)冷卻時(shí)間,即在自動(dòng)伸縮發(fā)生后的3 分鐘內(nèi)不再進(jìn)行其他的資源伸縮[4],如圖2所示。

圖2 HPA和CA通過配置yml實(shí)現(xiàn)工作負(fù)載和節(jié)點(diǎn)聯(lián)動(dòng)彈性伸縮
HPA每隔30秒輪詢一次目標(biāo)Pod的負(fù)載狀態(tài),當(dāng)目標(biāo)Pod的負(fù)載上升且負(fù)載高于指定的靜態(tài)擴(kuò)容閾值之后,會(huì)根據(jù)擴(kuò)容策略進(jìn)行擴(kuò)容生成新的Pod,當(dāng)目標(biāo)Pod的負(fù)載下降且負(fù)載低于指定的靜態(tài)縮容閾值一段時(shí)間之后,又會(huì)根據(jù)縮容策略進(jìn)行縮容回收集群中的Pod,其伸縮公式為:
其中,ER(Expect Replicas)為期待的Pod 副本數(shù)量,即通過算法計(jì)算后所得到的Pod 副本數(shù)量,cR(current Replicas)是在當(dāng)前狀態(tài)下檢測(cè)到的Pod 的副本數(shù)量,cM (current Metric value)是當(dāng)前所檢測(cè)到的指標(biāo)值,例如CPU 利用率、內(nèi)存使用情況等,dM (desired Metric value)為擴(kuò)縮容的閾值,也就是期望Pod的指標(biāo)值,ceil表示了期待的Pod副本數(shù)量的值是大于或者等于該數(shù)的最近一個(gè)整數(shù)[5]。
隨著容器實(shí)例數(shù)量增加,CPU 和內(nèi)存資源占用隨之增加,逐漸逼近預(yù)設(shè)閾值的60%。通過HPA和CA工作流程,實(shí)施表1的負(fù)載均衡策略,對(duì)容器集群的QPS/CPU/內(nèi)存/響應(yīng)時(shí)間等因素限定閾值。容器資源限制設(shè)置需要根據(jù)實(shí)際情況進(jìn)行調(diào)整,避免獨(dú)占資源過多,影響整個(gè)容器集群的性能和可用性。增加集群節(jié)點(diǎn)數(shù)量,容器實(shí)例數(shù)量也可以相應(yīng)地增加,從而提高容器集群的彈性和可擴(kuò)展性。不合理的集群節(jié)點(diǎn)數(shù)量也會(huì)導(dǎo)致系統(tǒng)負(fù)載過重或資源浪費(fèi)等問題。

表1 基于HPA和CA的彈性負(fù)載均衡策略
從圖3 得到的實(shí)驗(yàn)結(jié)果分析可以看出,隨著Pod數(shù)量的增加逐漸逼近和超過CPU 預(yù)設(shè)的60%占比閾值,HPA+CA的彈性伸縮策略被激活,先進(jìn)行了擴(kuò)容,后隨著策略調(diào)整后又進(jìn)行了縮容,有效實(shí)現(xiàn)了容器集群的負(fù)載均衡。進(jìn)一步可以實(shí)現(xiàn)基于時(shí)間序列的負(fù)載預(yù)測(cè)和相應(yīng)的策略實(shí)施。

圖3 容器集群彈性伸縮測(cè)試結(jié)果
在應(yīng)對(duì)容器集群彈性伸縮管理的過程中,需要綜合考慮容器資源限制、集群節(jié)點(diǎn)數(shù)量、伸縮類型、觸發(fā)閾值等因素,因?yàn)檫@些因素之間是相互影響和重要相互作用的。在實(shí)際應(yīng)用中,需要根據(jù)實(shí)際情況進(jìn)行選擇和調(diào)整不同的算法,避免出現(xiàn)不合理的設(shè)置和影響整個(gè)容器集群的性能和可用性。
通過對(duì)容器資源限制、集群節(jié)點(diǎn)數(shù)量、負(fù)載均衡等方面的測(cè)試和數(shù)據(jù)分析,得出了以下結(jié)論:
1) 使用HPA+CA可以很容易做到彈性伸縮,且節(jié)點(diǎn)和Pod 的伸縮過程可以非常方便地觀察到,使用HPA+CA做彈性伸縮能夠滿足大部分業(yè)務(wù)場(chǎng)景需求。
2) 容器資源限制需要根據(jù)實(shí)際情況進(jìn)行調(diào)整,防止單個(gè)應(yīng)用獨(dú)占資源,避免因?yàn)橘Y源限制不合理而導(dǎo)致CPU 和內(nèi)存負(fù)載過重,從而影響容器集群的穩(wěn)定性。
3) 負(fù)載均衡策略可以更好地實(shí)現(xiàn)容器實(shí)例之間的負(fù)載均衡,提高容器集群的彈性能力。在實(shí)際應(yīng)用中,需要根據(jù)實(shí)際情況選擇合適的負(fù)載均衡算法和方法,在性能優(yōu)化方面不斷挖掘和實(shí)踐創(chuàng)新。
彈性伸縮技術(shù)主要?jiǎng)澐忠罁?jù)有:按伸縮時(shí)間劃分、按伸縮方向劃分。前者可分為響應(yīng)式和預(yù)測(cè)式伸縮,當(dāng)前容器云平臺(tái)大都采用的基于閾值的響應(yīng)式彈性伸縮技術(shù),預(yù)測(cè)式的彈性伸縮正由學(xué)術(shù)界廣泛研究[6]。
未來,容器技術(shù)將會(huì)在生產(chǎn)環(huán)境中得到更廣泛的應(yīng)用。如何利用容器技術(shù)實(shí)現(xiàn)高可用、高性能和高效率,是企業(yè)將必須面臨的挑戰(zhàn)和機(jī)遇。