作者丨Jeffrey Walker
翻譯丨Vincent
譯者注:微服務(wù)和容器很好地結(jié)合了,但是它們的結(jié)合讓日志記錄也變成了一個難題。作者在本文描述了一些因素,在設(shè)置監(jiān)控的時候是需要考慮的。以下為譯文
在過去的幾年中,容器已經(jīng)成為IT領(lǐng)域的一個重要話題,尤其是在DevOps領(lǐng)域。簡單地說,當(dāng)從一個環(huán)境遷移到另一個環(huán)境時,容器提供了一種簡單且可擴(kuò)展的方法可以運(yùn)行軟件。
容器是通過在一個包中提供完整的運(yùn)行環(huán)境實現(xiàn)的,其中就包括了應(yīng)用程序,所有的依賴項,庫,其它二進(jìn)制文件以及運(yùn)行時所需的配置文件。
與容器緊密結(jié)合的是微服務(wù),它代表了開發(fā)應(yīng)用程序的一種更靈活的方式。微服務(wù)體系結(jié)構(gòu)將應(yīng)用程序構(gòu)建為一組松耦合的服務(wù),這些服務(wù)通過處理離散業(yè)務(wù)功能的API連接起來。微服務(wù)主要為應(yīng)用程序開發(fā)提供了一種“分而治之”的方法,而不是一個大型的單一代碼庫。
Docker在容器的基礎(chǔ)架構(gòu)領(lǐng)域是處于世界領(lǐng)先地位的,它是一個部署容器級軟件應(yīng)用的平臺。容器的真正價值在于它們允許團(tuán)隊動態(tài)地啟動一個完整的運(yùn)行環(huán)境。Docker可以說是讓企業(yè)采用微服務(wù)的最具影響力的平臺。
類似于虛擬機(jī)通過向來自一個服務(wù)器的終端用戶提供一個操作系統(tǒng)的多個實例來簡化軟件開發(fā)和測試,容器在應(yīng)用程序和主機(jī)操作系統(tǒng)之間添加了一個額外的抽象層。最大的不同是,容器不需要管理程序,只運(yùn)行操作系統(tǒng)的一個實例;總的來說,這等同于內(nèi)存更少,運(yùn)行時間更快。
與開發(fā)任何應(yīng)用程序一樣,日志記錄是過程的中心部分,在出現(xiàn)問題時尤其有用。但是,在集裝箱化應(yīng)用程序的世界里,與傳統(tǒng)應(yīng)用程序相比,它是不同的。日志Docker實際上意味著不僅記錄應(yīng)用程序和應(yīng)用程序主機(jī)操作系統(tǒng),以及Docker服務(wù)。在處理多碼應(yīng)用程序時,有許多日志記錄技術(shù)和方法可以記住。我們將在下面詳細(xì)介紹前五種最佳實踐。
基于應(yīng)用程序的日志記錄
在基于應(yīng)用程序的方法中,容器內(nèi)的應(yīng)用程序使用日志框架來處理日志記錄過程。例如,某個Java應(yīng)用程序可能會使用Log4j 2來對日志文件格式化,然后發(fā)送到遠(yuǎn)程服務(wù)器,并完全繞過Docker環(huán)境和操作系統(tǒng)。
雖然基于應(yīng)用程序的日志記錄使開發(fā)人員對日志事件有了最大的控制權(quán),但是這種方法也會在應(yīng)用程序過程中產(chǎn)生大量的消耗。這種方法對于那些工作在傳統(tǒng)應(yīng)用程序環(huán)境中的人來說可能是有用的,因為它允許開發(fā)人員繼續(xù)使用應(yīng)用程序的日志框架(例如Log4j 2)而不需要向主機(jī)添加日志功能。
Logging Docker實際上意味著不僅需要記錄應(yīng)用程序和主機(jī)操作系統(tǒng),還包括了Docker服務(wù)。
使用數(shù)據(jù)卷
容器本質(zhì)上是臨時的,這意味著如果容器關(guān)閉了,那么容器內(nèi)的任何文件最終都會丟失。相反,容器必須將日志事件轉(zhuǎn)發(fā)到集中式日志記錄服務(wù)(比如Loggly),或者將日志事件存儲在數(shù)據(jù)卷中。數(shù)據(jù)卷的定義為“容器內(nèi)的一個標(biāo)記目錄,該目錄用來保存持久或共享的數(shù)據(jù)”。
使用數(shù)據(jù)卷來記錄事件的好處是,由于它們鏈接到主機(jī)上的一個目錄,所以日志數(shù)據(jù)仍然存在,并且可以與其它容器共享。這種方法的優(yōu)點是它減少了在容器失敗或關(guān)閉時丟失數(shù)據(jù)的可能性。在這里可以找到關(guān)于在Ubuntu中設(shè)置Docker數(shù)據(jù)卷的說明。
Docker日志驅(qū)動
在Docker中進(jìn)行日志記錄的第三種方法是使用平臺的日志驅(qū)動程序?qū)⑷罩臼录D(zhuǎn)發(fā)給在主機(jī)上運(yùn)行的syslog實例。Docker日志驅(qū)動程序直接從容器的stdout和stderr輸出里面讀取日志事件;這就消除了從日志文件中讀取和寫入的需要,最終也會稍微改善性能。
然而,使用Docker日志驅(qū)動程序也有一些缺點:
它不允許進(jìn)行日志解析,只允許進(jìn)行日志轉(zhuǎn)發(fā)。
Docker日志命令只與日志驅(qū)動程序JSON文件一起工作。
當(dāng)TCP服務(wù)器不可訪問時,容器就會終止。
這里可以找到為Docker配置默認(rèn)日志驅(qū)動程序的說明。
容器專用日志
這種方法的主要優(yōu)點是允許在Docker環(huán)境中完全地管理日志事件。由于專用的日志容器可以從其他容器收集日志事件,聚合它們,然后將事件存儲或轉(zhuǎn)發(fā)到第三方服務(wù),這種方法消除了對主機(jī)的依賴。
專用日志容器的其它優(yōu)點是:
自動收集、監(jiān)視和分析日志事件。
在沒有配置的情況下自動縮放日志事件。
通過多個日志事件、stats和Docker API數(shù)據(jù)流來檢索日志。
Sidecar方法
Sidecars已經(jīng)成為管理微服務(wù)架構(gòu)的流行方法。Sidecar的想法來自于類似摩托車的sidecar是如何附著在摩托車上的。引用一個消息源,“Sidecar作為第二個過程在你的服務(wù)旁邊運(yùn)行,并通過類似于HTTP上的REST-like API 這樣一個同類接口提供了’平臺基礎(chǔ)設(shè)施’的特性。”
從日志記錄的角度來看,Sidecar方法的優(yōu)點是每個容器都與它自己的日志容器有關(guān)(應(yīng)用程序容器保存日志事件和日志容器標(biāo)記,然后像Loggly那樣將它們轉(zhuǎn)發(fā)到日志管理系統(tǒng))。
Sidecar方法對于大型部署來說尤其有用,因為這些部署需要有更專門的日志信息和自定義標(biāo)記。不過,建立Sidecar非常復(fù)雜,而且難度也很大。