多云虛擬機(jī)統(tǒng)一監(jiān)控功能詳解
本文主要通過總體介紹、核心監(jiān)控Agent介紹、總結(jié)和演示三個部分為大家解析多云虛擬機(jī)統(tǒng)一監(jiān)控的功能。
1、多云虛擬機(jī)統(tǒng)一監(jiān)控
首先,作為一個多云管理平臺,統(tǒng)一監(jiān)控是一個非常必要且重要的功能。
1)架構(gòu)
云聯(lián)壹云一直都有統(tǒng)一監(jiān)控的功能,主要是搜集各個基礎(chǔ)設(shè)施的監(jiān)控信息,然后進(jìn)行統(tǒng)計。

2)過去的實現(xiàn)
之前,進(jìn)行監(jiān)控查詢、監(jiān)控報警、監(jiān)控運維的實現(xiàn)方式是調(diào)用各個云廠商的云API,獲取其監(jiān)控數(shù)據(jù),這樣的實現(xiàn)比較簡單自然。
但是缺點也很明顯:
第一,監(jiān)控數(shù)據(jù)的不統(tǒng)一。阿里云的監(jiān)控數(shù)據(jù)和騰訊云的監(jiān)控數(shù)據(jù)雖然大體上一致,但是也會有不同之處。
第二,調(diào)用云API時,會有調(diào)用次數(shù)限制。比如阿里云的API會限制每天的調(diào)用次數(shù),若調(diào)用次數(shù)超過限制值,則會導(dǎo)致無法獲取數(shù)據(jù),所以只能調(diào)高調(diào)用的間隔,這可能會造成一些數(shù)據(jù)的缺失。

第三,監(jiān)控數(shù)據(jù)的延遲比較高。一方面是因為次數(shù)的限制導(dǎo)致它的間隔要調(diào)大,我們要不斷拉下來,相當(dāng)于是二手?jǐn)?shù)據(jù),延遲較高,對于告警等會有阻礙作用,因為告警需要即時的數(shù)據(jù)。
3)現(xiàn)在的實現(xiàn)
現(xiàn)在的實現(xiàn)是給多云虛擬機(jī)安裝監(jiān)控Agent,監(jiān)控Agent會在虛擬機(jī)上收集監(jiān)控數(shù)據(jù),然后主動將數(shù)據(jù)push到云聯(lián)壹云的數(shù)據(jù)庫中,如此上述的三個缺點即可克服。
因為每個虛擬機(jī)都有統(tǒng)一的Agent,所以最終得到的數(shù)據(jù)也是統(tǒng)一的。
由于不通過云廠商的API,所以也沒有調(diào)用次數(shù)的限制。
是Agent主動push數(shù)據(jù),我們也可以控制延遲。

現(xiàn)在的實現(xiàn)是通過監(jiān)控Agent來做多云虛擬機(jī)的統(tǒng)一監(jiān)控,下面為大家重點介紹監(jiān)控Agent。
2、監(jiān)控Agent
監(jiān)控Agent是運行在虛擬機(jī)上的daemon,它的作用是采集監(jiān)控數(shù)據(jù),并把數(shù)據(jù)傳回到云聯(lián)壹云的influxdb中。
那么如何將Agent安裝到虛擬機(jī)中?如何讓它采集數(shù)據(jù)?如何把數(shù)據(jù)傳回來?
下面分三點為大家介紹一下整個實現(xiàn)。
1)為虛擬機(jī)安裝Agent
我們采用Ansible為虛擬機(jī)安裝Agent。

使用Ansible給這個云上的VPC內(nèi)部的虛擬機(jī)裝Agent,需要解決兩個比較重點的問題:
第一,怎樣確保云聯(lián)壹云中的這個Ansible組件能夠連接到云上的VPC內(nèi)部的虛擬機(jī),因為網(wǎng)絡(luò)可能是不通的,VPC內(nèi)部的網(wǎng)絡(luò)是一個隔離的網(wǎng)絡(luò),所以不一定能夠直接連接上。
第二,連接好之后,還需要登錄才能使用Ansible安裝,如何保證能夠登錄。
(1)如何登錄
關(guān)于登錄的問題,先假設(shè)云聯(lián)壹云已經(jīng)能夠連接到虛擬機(jī),比如通過NAT網(wǎng)關(guān)或者虛擬機(jī)已經(jīng)綁定了EIP等。

登錄的問題分為兩種,第一種是機(jī)器本身就是通過云聯(lián)壹云平臺創(chuàng)建出來的,在這種情況下,登錄的問題便已經(jīng)解決。因為云聯(lián)壹云平臺的虛擬機(jī)本身是滿足的,云聯(lián)壹云會在虛擬機(jī)上自動創(chuàng)建一個cloudroot用戶,cloudroot用戶可以通過公鑰登錄,私鑰存儲在本地數(shù)據(jù)庫。
但是很多的情況與上述情況不同,比如阿里云的賬號剛納管進(jìn)來,這些虛擬機(jī)都是從阿里云上拉取的數(shù)據(jù),這種情況下,并不能滿足直接登錄的要求。
(2)用戶協(xié)助配置免密登錄
此種情況下需要用戶幫助云聯(lián)壹云配置免密登錄,用戶協(xié)助配置免密登錄有兩種方式:
第一,用戶先暫時告知虛擬機(jī)的用戶名、密碼,使云聯(lián)壹云能夠暫時登錄到虛擬機(jī)。

云聯(lián)壹云會使用ansible在目標(biāo)虛擬機(jī)上創(chuàng)建cloudroot用戶,設(shè)置公鑰登錄,這樣就能滿足直接登錄的需求。
第二,是直接將此腳本展示給用戶,用戶只需要把腳本拷貝到自己的虛擬機(jī)上去運行,也能達(dá)到上述效果,云聯(lián)壹云也能夠免密登錄到虛擬機(jī)上。

解決了登錄問題之后,Agent便可以安裝。
當(dāng)然問題解決的前提是我們之前的假設(shè)成立,即連接問題已經(jīng)解決,網(wǎng)絡(luò)是通的。
如果網(wǎng)絡(luò)不通,我們可以使用SSH代理,具體來說是Local Port Forwarding。
(3)Local Port Forwarding介紹
假設(shè)網(wǎng)絡(luò)A和網(wǎng)絡(luò)B是兩個隔離的網(wǎng)絡(luò),如果想讓VMA能夠訪問VMB上監(jiān)聽在80端口的web服務(wù)應(yīng)該怎么辦?

VMB沒有公網(wǎng)IP,只有一個內(nèi)網(wǎng)IP,我們需要建兩個代理。
可以在網(wǎng)絡(luò)A中建proxyA ,在網(wǎng)絡(luò)B中建proxyB,proxyB一定要有公網(wǎng),要使網(wǎng)絡(luò)A能夠訪問到proxyB,這時就可以用SSH Local Port Forwarding做一個SSH代理,需要在proxyA上執(zhí)行這個命令,這個命令就是要建立一個Local Port Forwarding,然后在后臺執(zhí)行。
其實可以分兩部分,在第二個冒號之前的部分,是本地有proxyA這里的IP加端口。
冒號之后是在遠(yuǎn)端實際要訪問的IP加端口。
后面的cloudroot是proxyB的登錄用戶和proxyB的IP。
執(zhí)行此命令要求proxyA能夠以cloudroot的用戶正常登錄到proxyB上,這可以通過上文講到的登錄方法來解決。
VMA只要訪問10.127.30.251:12345就能訪問VMB上的web服務(wù)。
下面簡單地了解一下過程,

在proxyA上執(zhí)行這個命令之后,首先會在proxyA和proxyB之間建立一個SSH隧道,并在proxyA上創(chuàng)建一個port forwarding,它將監(jiān)聽10.127.30.251:12345,一旦有請求發(fā)來,就會通過SSH隧道轉(zhuǎn)發(fā)到proxyB,proxyB會將請求轉(zhuǎn)發(fā)到172.31.25.194:80。
VMA只要訪問10.127.30.251:12345就能訪問VMB上的web服務(wù)。
(4)云聯(lián)壹云連接到VPC內(nèi)部虛擬機(jī)
下面將場景進(jìn)行帶入,首先云聯(lián)壹云內(nèi)部有一個Ansible組件,阿里云內(nèi)部有一個需要裝Agent的目標(biāo)虛擬機(jī)。

在云聯(lián)壹云內(nèi)部做proxy服務(wù),然后在阿里云的VPC內(nèi)部找一臺虛擬機(jī),稱之為proxyVM,它要滿足兩個條件,第一個條件是能夠被云聯(lián)壹云訪問,第二點是它能夠訪問到目標(biāo)虛擬機(jī),如此即可做Local Port Forwarding。
只需要在proxy上執(zhí)行剛才的命令,Ansible組件只要訪問proxy,就能通過代理訪問到目標(biāo)虛擬機(jī),如此一來即可連接到目標(biāo)虛擬機(jī)進(jìn)行安裝的工作。連接問題和登錄問題解決之后,Ansible組件即可正常地將監(jiān)控Agent安裝到虛擬機(jī)上。
2)監(jiān)控Agent如何收集數(shù)據(jù)
第一版的監(jiān)控Agent其實是Telegraf,定制配置文件,滿足采集數(shù)據(jù)的需求。
Telegraf是一個開源項目,它的目的是收集、處理、聚合和編寫指標(biāo)的Agent。Telegraf可以靈活地配置,采集什么樣的數(shù)據(jù),將數(shù)據(jù)送到哪里,數(shù)據(jù)添加等。
以下是為每臺虛擬機(jī)自動生成的配置大體的狀況,比如第一頁是[global_tags],通過添加標(biāo)簽,例如vm_name=”correhost”表明虛擬機(jī)的名稱,通過添加標(biāo)簽還可以了解到區(qū)域,項目、平臺等信息。

查看時即可通過標(biāo)簽查看,查看某個平臺或項目都可以做到,另外兩個配置比較重要,分別是INPUTS和OUTPUTS。
INPUTS表示都需要什么樣的數(shù)據(jù),例如第一條inputs.cpu表示需要cpu相關(guān)的數(shù)據(jù)。

OUTPUTS表明數(shù)據(jù)要送往哪里,這里表示要送到influxdb中。
總之,我們使用telegraf,然后定制一下配置文件,這樣就可以達(dá)到作為監(jiān)控Agent的要求
3)監(jiān)控Agent如何將數(shù)據(jù)傳回來?
這個問題的本質(zhì)是如何使虛擬機(jī)上的Agent服務(wù)能夠訪問到云聯(lián)壹云中的InfluxDB,這也可以分為兩種情況,第一種情況比較簡單,能夠直接連接,否則,還是使用SSH代理,具體來說是Remote Port forwarding。
(1)SSH Remote Port forwarding 介紹

本次是要網(wǎng)絡(luò)B中的虛擬機(jī)訪問網(wǎng)絡(luò)A中的服務(wù),此時應(yīng)在 proxyA 上執(zhí)行:
ssh-NfR172.31.25.194:12345:10.127.40.251:30086 cloudroot@140.179.54.109
執(zhí)行上述命令要求 proxyA 能夠以 cloudroot 用戶正常登錄到 proxyB 上,這個可以通過之前講到的登錄方法來解決。
在執(zhí)行命令之后,proxyA和proxyB之間會建立一條SSH隧道。
port forwarding現(xiàn)在會建在proxyB上,會在 proxyA 和 proxyB 之間建立 SSH隧道,并在 proxyB 上創(chuàng)建一個 port forwarding,它將監(jiān)聽 172.31.25.194:12345,一旦有請求發(fā)來,就會通過 SSH 隧道轉(zhuǎn)發(fā)到 proxyA,proxyA 會把請求轉(zhuǎn)發(fā)到10.172.40.251:80
通過上面的方式,網(wǎng)絡(luò)B 內(nèi)部的 VMB 只要訪問172.31.25.194:12345 就可以訪問到 DB。
(2)通過代理傳輸數(shù)據(jù)
整個路線圖和剛才類似,SSH隧道仍然需要在兩者之間建立,虛擬機(jī)可以直接訪問proxyVM將數(shù)據(jù)回傳。

3、總結(jié)與演示
1)總結(jié)

只需要在VPC內(nèi)部的proxyVM和proxy之間建一個SSH隧道,訪問到VM并裝上Agent,Agent再通過SSH隧道將數(shù)據(jù)傳到數(shù)據(jù)庫中,這就是總體的解決方案。
Agent共執(zhí)行三件事,第一是如何將Agent進(jìn)行安裝,第二是怎樣采集,第三是數(shù)據(jù)如何回傳。
2)流程演示
(1)首先新建云上的VPC

(2)新建IP子網(wǎng)

(3)新建帶有EIP的VM以作為proxyVM

(4)通過云聯(lián)壹云平臺創(chuàng)建的虛擬機(jī)本身就是免密登錄

(5)轉(zhuǎn)化為proxy

(6)創(chuàng)建VPC內(nèi)的普通虛擬機(jī)

(7)監(jiān)控
監(jiān)控界面分為基礎(chǔ)監(jiān)控和Agent監(jiān)控,基礎(chǔ)監(jiān)控是通過調(diào)用云API拿到的監(jiān)控數(shù)據(jù)。
Agent監(jiān)控是運行在虛擬機(jī)上的監(jiān)控Agent傳回來的監(jiān)控數(shù)據(jù)。Agent監(jiān)控需要手動觸發(fā)安裝。

(8)Agent監(jiān)控需要用戶點擊一下安裝Agent

(9)安裝成功之后數(shù)據(jù)展示情況如下圖所示。


