Docker容器的自動化監控實現

本文由? 網易云 發布。

?

近年來容器技術不斷成熟并得到應用。Docker作為容器技術的一個代表,目前也在快速發展中,基于 Docker的各種應用也正在普及,與此同時 Docker對傳統的運維體系也帶來了沖擊。我們在建設運維平臺的過程中,也需要去面對和解決容器相關的問題。

Docker的運維是一個體系,而監控系統作為運維體系中重要組成部分,在 Docker運維過程中需要重點考慮。本文介紹了一種針對 Docker容器的自動化監控實現方法,旨在給 Docker運維體系的建立提供相關的解決方案。

容器


談到容器,有人首先會想到 LXC(Linux Container)。它是一種內核虛擬化技術,是一種操作系統層次上的資源的虛擬化。在 Docker出現之前,就已經有一些公司在使用 LXC技術。容器技術的使用,大大提升了資源利用率,降低了成本。

直接使用 LXC稍顯復雜,企業擁抱容器技術具有一定的門檻,可以說 Docker的出現改變了這一局面。Docker對容器底層的復雜技術做了一個封裝,大大降低了使用復雜性,從而降低了使用容器技術的門檻。Docker給出了一些基本的規范和接口,用戶只要熟悉 Docker的接口,就能夠輕松玩轉容器技術。可以說,Docker大大加快了容器技術的使用普及度,甚至被看做業界容器規范。

容器的監控


容器與通常的虛擬機在虛擬化程度上存在著差異,在監控手段上也有不同。一臺虛擬機,我們可以當做一個物理機對待,而容器雖然也可以當做虛擬機,但這不符合容器的使用理念。在監控的實現過程中,我們更傾向于把容器看做是宿主機上的一系列進程樹。

主流的監控系統實現過程中,一般需要在目標機器上部署 agent模塊,通過 agent模塊來做數據采集。而根據容器的使用理念,一般不建議在容器鏡像里面捆綁 agent。當然這并不意味著數據沒法采集,針對容器的虛擬化技術特點,在容器的宿主機上對容器進行數據采集是完全可行的,而且能夠做到更加高效。

當然,如果把容器當做虛擬機對待,上面部署上 agent模塊來采集監控數據,也是一種方法,但這不是推薦的做法。我們可以看到業界已經出現的一些 Docker監控方案,如 Docker Stats、CAdvisor、Scout等,也都是在宿主機上對容器進行監控的。本文提出的監控方案,也將會從宿主機上著手。

?

常見容器監控存在的問題


隨著 Docker的應用,業界也出現了很多的監控工具,這些工具實際上也都能對 Docker容器進行一些監控。利用這些工具搭建一套監控系統來使用,也是基本能夠解決一些需求的。但是分析這些監控工具,主要存在兩方面的問題。

1. 與運維體系的結合度


這些工具基本都是獨立的,很難與運維體系中其他系統整合打通。在運維自動化不斷發展的今天,往往更加注重的是整個體系的集成度。所以需要有一個更好的模型化的思路,便于系統間的數據打通。

2. 監控的層次


這些工具的監控一般都只停留在單個容器的層面,例如對容器的 CPU,磁盤 IO等的監控。而大多數應用設計架構都具備一定的節點容錯能力,單個節點的問題,往往不能夠反映出應用的真實問題。所以監控需要覆蓋到更多的層次。

模型化容器監控方案


這里我們從整體上提出一種模型化監控方案。這一方案有利于和運維基礎的 CMDB系統打通,同時能兼顧到更多層次上的監控。

監控系統一般會涉及:數據采集、數據存儲、數據分析和報警、數據展示等幾個部分。本文將講述一種模型化監控方法,主要提出了以下五種模型:

1 監控對象模型


這里我們將使用一種產品樹的結構來建模監控對象。把監控對象分為四類,分別是產品、應用、集群、節點。

○ 產品:一般是一個高層次的概念,一個產品一般可以獨立輸出,對外提供服務。
○ 應用:是產品下的模塊組成,多個應用共同形成一個產品。
○ 集群:是應用的存在形式。同一個應用,一般會根據環境,地域等,部署多個集群。
○ 節點:集群內承載服務的資源,包括前文提到的服務器,虛擬機,容器等。

?

這樣,我們的監控數據采集,和視圖展示,就可以基于產品樹這個層次化的監控對象來做。每種監控對象上都可以有自定義的監控項,也可以繼承上層的監控項。同時,分層次的監控對象,在很好地組織監控結構的時候,又可以從多種層次角度來反映出系統的運行狀態和問題。

例如我們一個基于 Docker的應用需要監控,應用名稱為 myDocker。我們可以建立如下監控模型:

○ 產品:my_Docker_product
○ 應用:my_Docker_app
○ 集群:my_Docker_cluster
○ 節點:my_Docker_container

2 采集器模型


主要用于采集數據的模塊,同時滿足數據輸出規范,為了便于解析,同時具備較好的數據結構展示,我們可以采用 Json格式作為數據規范。在數據的語義上需要匹配對應的數據模型。例如針對節點模型的采集器,可以是一個腳本,通過捕獲腳本執行輸出來獲取相應數據模型的數據。而上層節點的采集器,則一般是基于節點數據模型的一些計算,這些計算一般包括 sum,avg,max,min等,一般反映的是整個集群下節點的一些聚合數據。

例如,一個簡單的采集器模型如下:

?

3 數據模型


用來定義監控數據格式,模型包括數據項和指標項。一個數據項一般包含一個或者多個指標項。數據模型中的數據來自于對應的采集器。

?

例如,針對 CPU可以監控如下模型:
數據項:cpu
指標項:usr,sys,idle

4 報警規則模型


在數據模型的基礎上,針對每個數據指標項目,可以設置報警模型。例如,空閑 CPU少于 50%的時候觸發報警,則可以建立如下規則:cpu.idle < 50?

5 視圖模型


這個模型將數據模型和視圖關聯起來了。包含數據展示方式定義,例如可以是趨勢圖,表格等。可以結合數據模型中的數據項與指標項,描述具體數據指標的視圖展示方式。不同監控對象上的視圖,一般都能從不同層次體現出監控。

用 XML格式描述視圖模型如下:

這個模型表示 CPU趨勢圖,且根據 usr,sys兩個指標項畫圖。示例如下:

?

6 監控項模型


監控項模型,包含了采集器模型,數據模型,報警規則模型,視圖模型等的組合。通過將監控項運用于監控對象上。從而可以對監控對象進行自定義模型化的監控。

容器監控整體架構


在模型完備后,整個監控項需要解決監控項下發,數據采集,數據分析報警,存儲等問題。這里我們介紹一種分布式監控框架來將整個模型串通起來。

框架圖示如下:

各模塊的基本功能簡要描述如下:

○ agent:節點監控數據采集
○ master:agent的管控中心,負責將監控項配置下發給agent。
○ monitor:接收agent采集的監控數據,并統一存放到Kafka消息隊列中。
○ analyser:訂閱Kafka對列消息,進行數據的分析處理,存儲和報警。(實際實現過程中,可以視情況對該模塊進行適度的功能擴展和模塊拆分)
○ web: 監控模型的各種管理,視圖的展示。
○ kafka: 消息隊列,緩存采集數據,共其他模塊訂閱使用。
○ DB/HBase:存儲模型配置,監控數據等。

這個架構是一個常見的監控模型架構,而且比較容易和運維體系打通。在我們實現容器監控的過程中,就可以采用這個模型。

容器監控數據采集


數據采集是 Docker監控和一般監控系統實現過程中最有差異的地方。因為在 Docker容器內部,沒有數據采集的 agent模塊將不能直接依賴 agent來采集。

1. 節點數據


在容器宿主機上,我們可以獲取到容器的很多基礎數據。一般有以下幾種方法。

通過 Docker命令


docker stats 這一方法比較簡單,但是數據并不全面,我們可以看到如下效果。

?

基于 Linux文件系統


這個是比較推薦,且性能較好的數據采集方法。Linux的 /proc,/sys等系統目錄下,記錄了非常有用的監控數據。在這里,我們可以拿到大多數系統級,進程級別的運行數據,包括 CPU、磁盤 IO等。

例如我們要獲取某個進程的 CPU占用,則可以采用以下方式計算出來。

?

2. 數據采集


集群的數據,是根據每個節點上的原始數據計算得到。是一種聚合運算,一般會有 sum,avg等運算場景。

3. 應用和產品數據


同理,應用和產品的數據則可以通過子節點的數據來計算得到。

監控的自動化


由于容器的自身特性,容器的銷毀,創建等是一個很常見的場景。一個容器啟動后,監控系統怎么察覺,同時需要對其做哪些數據模型的采集,這些問題就是監控自動化過程需要解決的。

1. 容器的自發現


容器新創建,停止,或者銷毀,在宿主機上可以感知到。一般可以從如下目錄獲取。由于 Docker安裝配置不同,或者 Docker采用的文件系統的差異,可能部分目錄會有不一致,但實際獲取策略都類似。

?

2. 容器與監控對象的自動關聯


容器作為節點,是需要關聯到集群下面才能融入監控系統。這里我們可以采用鏡像名稱與集群名稱的映射匹配來自動關聯容器到集群。

通過如下容器目錄下的配置文件,我們可以獲取到容器的詳情,其中包含的 Image即為容器所采用的鏡像名稱。


當容器關聯到集群后,則可以自動監控項配置。通過 master將配置下發到容器宿主機上的 agent后,則可以開始對容器進行數據采集和上報,從而對容器進行自動監控。

總結


本文提出了一種模型化容器監控方案。通過對監控對象、監控過程進行建模,基于模型來驅動整個監控場景,同時描述了該方案的主要實現方法。

這套方案相比現有的容器監控實現,具有更好的靈活性和擴展性。通過模型的改進和擴展,能夠方便地將 Docker容器的監控融入到現有的監控和運維體系中去。

監控系統本身是一個非常復雜的體系。本文描述的方案很多地方細節上還沒有充分展開,模型的建立上可能也有一些局限和考慮不周的地方,需要后續逐步完善。希望本文思路能給讀者在開發監控系統、建設運維體系的過程中提供一些參考。

?

?

了解 網易云 :
網易云官網:https://www.163yun.com/
新用戶大禮包:https://www.163yun.com/gift
網易云社區:https://sq.163yun.com/

?

轉載于:https://www.cnblogs.com/163yun/p/8890981.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/251905.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/251905.shtml
英文地址,請注明出處:http://en.pswp.cn/news/251905.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

robotframework 常用關鍵字

標準庫 第三方庫 其他庫轉載于:https://www.cnblogs.com/Chamberlain/p/10729054.html

身份證的驗證

var Wi [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 ]; // 加權因子 var ValideCode [ 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ]; // 身份證驗證位值.10代表X function checkIdcard(idCard) { idCard trim(idCard);//去掉字符串頭尾空格 if (idCard.length 15…

人工智能實戰小程序之語音_前端開發

1. 人工智能實戰小程序之準備工作 2. 人工智能實戰小程序之語音_前端開發 今天這部分主要講小程序前端功能的開發由于我偏后端&#xff0c;css是我的弱項&#xff0c;可能很多人和我一樣開發小程序不知道如何下手&#xff0c;希望本篇文章對你有幫助我的學習路線是&#xff1a;…

當TFS/VSTS遇上Power BI

引言眾所周知&#xff0c;要對TFS進行深入的圖表分析&#xff0c;往往需要依賴于SQL Server Analysis Service和SQL Server Reporting Service。雖然隨著TFS對敏捷項目的支持&#xff0c;內置了諸如累積流圖、燃盡圖等快捷圖表&#xff1b;并且在最新的版本中還可以在儀表盤和查…

HashMap深度解析:一文讓你徹底了解HashMap

寫在前面HashMap是Map族中最為常用的一種&#xff0c;也是 Java Collection Framework 的重要成員。本文首先給出了 HashMap 的實質并概述了其與 Map、HashSet 的關系&#xff0c;緊接著給出了 HashMap 在 JDK 中的定義&#xff0c;并結合源碼分析了其四種構造方式。最后&#…

Bzoj3628: [JLOI2014]天天酷跑

3628: [JLOI2014]天天酷跑 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 121 Solved: 44[Submit][Status][Discuss]Description 在游戲天天酷跑中&#xff0c;最爽的應該是超級獎勵模式了吧&#xff0c;沒有一切障礙&#xff0c;可以盡情的吃金幣&#xff0c;現在請你控制…

python_線程、進程和協程

線程 Threading用于提供線程相關的操作&#xff0c;線程是應用程序中工作的最小單元。 1 #!/usr/bin/env python2 #codingutf-83 __author__ yinjia4 5 6 import threading,time7 8 def show(arg):9 time.sleep(2) 10 print(線程: str(arg)) 11 12 for i in range(…

AppDelegate瘦身之服務化

有沒有覺得你的AppDelegate雜亂無章&#xff1f;代碼幾百行上千行&#xff1f;集成了無數的功能&#xff0c;如推送、埋點、日志統計、Crash統計等等&#xff0c;感覺AppDelegate無所不能。 來一段一般的AppDelegate代碼&#xff0c;來自網上一篇文章&#xff1a; UIApplicatio…

第四章:手機平板要兼顧-探究碎片

碎片是什么&#xff1f; 碎片&#xff08;Fragment&#xff09;是一種可以嵌入在活動&#xff08;Activity&#xff09;中的 UI 片段&#xff0c;它能讓程序更加合理和充分的利用大屏幕的空間&#xff0c;因而在平板上應用的非常廣泛。 碎片的使用方式 靜態嵌入動態加載碎片和活…

Android Studio 3.4增可視化資源管理工具 可管理和預覽項目資源

經過6個月的開發時間&#xff0c;網絡大廠17日發布了最新版的App開發IDE Android Studio 3.4&#xff0c;現在就能夠下載使用&#xff0c;除了有超過300個錯誤修護和穩定度增強之外&#xff0c;在開發、建置和測試App階段&#xff0c;都推出了一些小的新功能和工具&#xff0c;…

Python安裝、使用MySQL數據庫

本機安裝的python版本為Python 2.7(win32 bit) 從http://www.codegood.com/archives/129下載MySQL-python-1.2.3.win32-py2.7.exe&#xff0c;點擊安裝 如果是win版還需要下載&#xff1a;libguide40.dll 和 libmmd.dll這兩個文件&#xff0c;下載后放入到到C:\WINDOWS/syste…

pytorch 安裝

安裝pytorch時&#xff0c;官網不能選擇版本。原以為是瀏覽器問題&#xff0c;換了幾個瀏覽器都不行。 后來FQ之后&#xff0c;就能選擇版本了。 sudo pip install torch torchvision轉載于:https://www.cnblogs.com/rabitvision/p/8908757.html

《JavaScript 高級程序設計》精讀筆記

本系列讀書筆記是我通過學習《Javascript 高級程序設計》第3版時結合自己的理解、概括、精煉然后加以一定的拓展&#xff0c;總結而來的&#xff0c;非常適合具有一定基礎&#xff0c;同時又想把 JS 基礎學更好的童鞋&#xff0c;當然更希望得到大家的反饋于建議&#xff0c;比…

struts2實現文件查看、下載

CreateTime--2017年9月7日10:25:33 Author:Marydon struts2實現文件查看、下載 1.界面展示 <a style"color: #199ED8;" target"_blank" href"<c:url value"/telemedicine/reseCons/viewFile.do?fileName201516529IO.jpg"/>"…

css文本設置

常用的應用文本的css樣式&#xff1a; color 設置文字的顏色&#xff0c;如&#xff1a; color:red; font-size 設置文字的大小&#xff0c;如&#xff1a;font-size:12px; font-family 設置文字的字體&#xff0c;如&#xff1a;font-family:微軟雅黑; font-style 設置字體…

關鍵字static

原文出處&#xff1a;http://cmsblogs.com/ 『chenssy』 一、 static代表著什么 在Java中并不存在全局變量的概念&#xff0c;但是我們可以通過static來實現一個“偽全局”的概念&#xff0c;在Java中static表示“全局”或者“靜態”的意思&#xff0c;用來修飾成員變量和成員方…

[IoC容器Unity]第三回:依賴注入

上節介紹了&#xff0c;Unity的Lifetime Managers生命周期&#xff0c;Unity具體實現依賴注入包含構造函數注入、屬性注入、方法注入&#xff0c;所謂注入相當賦值&#xff0c;下面一個一個來介紹。 2.構造函數注入 Unity利用Resolve方法解析一個對象&#xff0c;都是調用注冊類…

Apache CarbonData 1.5.0編譯及安裝

2019獨角獸企業重金招聘Python工程師標準>>> 一、編譯環境描述 OpenStack創建五個虛擬機&#xff0c;其中1個主節點&#xff08;hostname為bigdatamaster&#xff09;&#xff0c;4個從節點&#xff08;hostname分別為&#xff0c;bigdataslave1、bigdataslave2、bi…

JS控制網頁全屏

在谷歌&#xff0c;IE等瀏覽器中&#xff0c;點擊F11按鍵會進入網頁全屏模式&#xff0c;如同看電影的劇場模式&#xff0c;這個在代碼中可以通過JS來實現&#xff0c;簡單說下在實現這個需求后的個人總結&#xff1a; 底層網頁是已經加載完畢的&#xff0c;這時我們需要的全屏…

HDU 3966-Aragorn's Story 樹鏈剖分+樹狀數組

題目鏈接 題意&#xff1a;有一棵樹&#xff0c;每個節點有權值 有三種操作&#xff1a; I c1 c2 k 從節點c1到節點c2的路徑上每個節點權值增加kD c1 c2 k 從節點c1到節點c2的路徑上每個節點權值減少kQ i 查詢節點i的權值是多少思路&#xff1a; 樹鏈剖分處理出來的鏈放在數組中…