監(jiān)控是保障系統(tǒng)穩(wěn)定性的重要組成部分,在Kubernetes開(kāi)源生態(tài)中,資源類的監(jiān)控工具與組件百花齊放。除了社區(qū)自己孵化的metrics-server ,還有從CNCF 畢業(yè)的Prometheus 等等,開(kāi)發(fā)者可選的方案有很多。但是,只有資源類的監(jiān)控是遠(yuǎn)遠(yuǎn)不夠的,因?yàn)橘Y源監(jiān)控存在如下兩個(gè)主要的缺欠:大部分資源監(jiān)控都是基于推或者拉的模式進(jìn)行數(shù)據(jù)離線,因此通常數(shù)據(jù)是每隔一段時(shí)間采集一次,如果在時(shí)間間隔內(nèi)出現(xiàn)一些毛刺或者異常,而在下一個(gè)采集點(diǎn)到達(dá)時(shí)恢復(fù),大部分的采集系統(tǒng)會(huì)吞掉這個(gè)異常。而針對(duì)毛刺的場(chǎng)景,階段的采集會(huì)自動(dòng)削峰,從而造成準(zhǔn)確性的降低。 部分監(jiān)控場(chǎng)景是無(wú)法通過(guò)資源表述的,比如Pod的啟動(dòng)停止,是無(wú)法簡(jiǎn)單的用資源的利用率來(lái)計(jì)量的,因?yàn)楫?dāng)資源為0的時(shí)候,我們是不能區(qū)分這個(gè)狀態(tài)產(chǎn)生的真實(shí)原因。 基于上述兩個(gè)問(wèn)題,Kubernetes是怎么解決的呢? 事件監(jiān)控-監(jiān)控的新維度Kubernetes作為云原生的平臺(tái)實(shí)現(xiàn),從架構(gòu)設(shè)計(jì)上將接口與實(shí)現(xiàn)做到了完整的解耦和插拔,以狀態(tài)機(jī)為整體的設(shè)計(jì)原則,通過(guò)設(shè)定期望狀態(tài)、執(zhí)行狀態(tài)轉(zhuǎn)換、檢查并補(bǔ)償狀態(tài)的方式將資源的生命周期進(jìn)行接管。 
狀態(tài)之間的轉(zhuǎn)換會(huì)產(chǎn)生相應(yīng)的轉(zhuǎn)換事件,在Kubernetes中,事件分為兩種,一種是Warning事件,表示產(chǎn)生這個(gè)事件的狀態(tài)轉(zhuǎn)換是在非預(yù)期的狀態(tài)之間產(chǎn)生的;另外一種是Normal事件,表示期望到達(dá)的狀態(tài),和目前達(dá)到的狀態(tài)是一致的。我們用一個(gè)Pod的生命周期進(jìn)行舉例,當(dāng)創(chuàng)建一個(gè)Pod的時(shí)候,首先Pod會(huì)進(jìn)入Pending的狀態(tài),等待鏡像的拉取,當(dāng)鏡像錄取完畢并通過(guò)健康檢查的時(shí)候,Pod的狀態(tài)就變?yōu)镽unning。此時(shí)會(huì)生成Normal的事件。而如果在運(yùn)行中,由于OOM或者其他原因造成Pod宕掉,進(jìn)入Failed的狀態(tài),而這種狀態(tài)是非預(yù)期的,那么此時(shí)會(huì)在Kubernetes中產(chǎn)生Warning的事件。那么針對(duì)這種場(chǎng)景而言,如果我們能夠通過(guò)監(jiān)控事件的產(chǎn)生就可以非常及時(shí)的查看到一些容易被資源監(jiān)控忽略的問(wèn)題。 一個(gè)標(biāo)準(zhǔn)的Kubernetes事件有如下幾個(gè)重要的屬性,通過(guò)這些屬性可以更好地診斷和告警問(wèn)題。 Namespace:產(chǎn)生事件的對(duì)象所在的命名空間。 Kind:綁定事件的對(duì)象的類型,例如:Node、Pod、Namespace、Componenet等等。 Timestamp:事件產(chǎn)生的時(shí)間等等。 Reason:產(chǎn)生這個(gè)事件的原因。 Message: 事件的具體描述。 其他信息
通過(guò)事件的機(jī)制,我們可以豐富Kuernetes在監(jiān)控方面的維度和準(zhǔn)確性,彌補(bǔ)其他監(jiān)控方案的缺欠。 kube-eventer v1.0.0的發(fā)布與開(kāi)源
針對(duì)Kubernetes的事件監(jiān)控場(chǎng)景,Kuernetes社區(qū)在Heapter中提供了簡(jiǎn)單的事件離線能力,后來(lái)隨著Heapster的廢棄,相關(guān)的能力也一起被歸檔了。為了彌補(bǔ)事件監(jiān)控場(chǎng)景的缺失,阿里云容器服務(wù)發(fā)布并開(kāi)源了kubernetes事件離線工具kube-eventer 。支持離線kubernetes事件到釘釘機(jī)器人、SLS日志服務(wù)、Kafka開(kāi)源消息隊(duì)列、InfluxDB時(shí)序數(shù)據(jù)庫(kù)等等。 在本次正式發(fā)布的v1.0.0的版本中,作了如下功能的增強(qiáng)。 釘釘插件支持Namespace、Kind的過(guò)濾 支持與NPD插件的集成與部署 優(yōu)化SLS插件的數(shù)據(jù)離線性能 修復(fù)InfluxDB插件啟動(dòng)參數(shù)失效的問(wèn)題 修復(fù)Dockerfile的安全漏洞 以及其他共11項(xiàng)功能修復(fù)
|