容器技術是目前非常火爆的一個技術,能夠大大提升工作效率。本文中,我們將描述容器本機監控的含義,其核心是對動態容器環境進行監控,并解決在此環境中完全堆棧可見性的具體挑戰。當然這個解釋很模糊,下文中我們會詳細討論。
單個容器并不重要
在云環境中,經常會有“寵物與家畜”的比喻,傳統服務器是你所關心的,被稱作“寵物”,而在云中,你處理的是動態的實例,這些實例很容易被替換,因此表現為“家畜”。容器則是這種比喻的擴展。它們來來去去(這是個好事),比如部署或更新服務、擴展等等。
但就像家畜一樣,重要的不是個體的動物,而是更多的群體和他們的服務目的。這個目的就是容器環境中的“服務”。因此,容器本機監控(聽起來可能很奇怪)不應該太關注于監視單個容器,但首先最重要的是它們提供的服務。當服務出現問題時,實現自動通知,此時,你會希望有能力在需要時深入到容器級別。
當然,你希望能夠快速識別有問題的容器。假設目前有10個支持服務的容器,其中一個容器處理請求的時間是服務中其他容器的延遲的兩倍。你希望得到關于此不同行為的通知,并詳細查看該容器及其周圍環境。例如,在同一個節點上可能會有另一個容器耗盡磁盤的I/O,并導致這種延遲的出現。
我們在CoScale中處理這個問題的方式是收集單個容器資源統計信息,并將其與我們從協調器平臺獲得的服務級別信息相關聯。然后,我們將提供特定的可視化視圖,以顯示單個服務的性能和該服務的容器,使用如下的拓撲指示板,你可以深入到各個容器中。我們還會高亮顯示有問題的容器,并自動通知異常行為。為此,我們在服務級別(考慮季節性因素)和容器級別(比較相同服務的容器) 使用異常檢測技術。
容器只顯示需要顯示的內容
容器的運作方式對收集來自它們的度量標準帶來了具體的挑戰。有很多方法可以解決這個問題。你可以開始公開端口、安裝卷等,以便將容器的信息公開給外部世界。這不僅麻煩,而且有安全問題。例如,當您想要公開一個JMX連接以訪問stats接口時,可能會通過JMX觸發潛在的惡意操作。因此,理想情況下,您希望將JMX連接本地保存到容器中,這就是容器的用途。
另一種方法是在容器中開始打包監視代理。除了額外的開銷之外,這也打破了容器的不可變性,并且與限制容器的單一進程是不兼容的。
我們在CoScale中處理這個問題的方式是使用一個每個節點的單一監控代理,它使用一組插件來監控容器和協調器指標,以及每個容器內的服務。代理將在容器的名稱空間內啟動插件,以確保插件與在容器內運行的應用程序具有相同的視圖。這確保您不需要公開任何東西,并且這種方法是在框中完成的。
訪問用于數據檢索的容器日志文件
日志通常是獲取度量標準的一個很好的信息來源。在容器環境中編寫和存儲日志文件有多種選擇。與監視一樣,你不希望在容器內放置代理,以收集日志或在容器內對您的日志聚合器有任何引用。日志應該由平臺來處理。
將日志數據從容器發送到外部世界的最有效方法是通過/dev/stdout。然后,平臺獲取這些日志并將它們推到日志聚合器中。這使得日志訪問和聚合變得簡單和直接,并且確保您的容器依賴于單個進程,不需要后臺工作人員或定時任務來清理他們的日志。
CoScale支持從被推到/dev/stdout和/dev/stderr的日志中提取指標和事件。但是,如果容器中有多個日志文件(例如訪問日志、錯誤日志等),可以配置CoScale插件,以從這些日志文件中提取度量和事件。
所有的容器都是相同的
容器使用環境變量進行初始化、連接等。有狀態容器,如數據庫容器(如postgresql,mysql)也使用環境變量來初始化數據庫,如果它還沒有初始化。必須考慮這些環境變量,以便正確地監視這些容器和它們正在運行的服務,因此您的監視解決方案應該理解這一點。
一些CoScale插件需要憑證來收集運行服務的度量標準。提供給容器的環境變量可以在CoScale插件配置中使用。例如,Postgresql容器使用pguser和pgpassword環境變量,在CoScale Postgres插件配置中,您可以使用$pguser和$pgpassword作為連接到數據庫的憑證。當CoScale代理檢測到Postgresql容器時,它將知道使用提供給該容器的環境變量作為憑證來獲取該容器的Postgresql統計信息。
通過這種方式,圖像不需要只是為了監視它們而更改為包含固定的憑證。
部署監控的方式與部署服務的方式相同
由于您的服務是在容器中運行的,所以對您的監視代理執行同樣的操作是有意義的。一些監控工具將要求您在容器中安裝代理,或者在sidecar容器中安裝代理,這通常會帶來額外的開銷。此外,必須在容器中包裝額外的監控代理,這并不是開發人員非常喜歡的事情,因為它破壞了容器的單一用途。在自己的容器中部署監視代理是一種更容器本機式的解決方案,這使得部署監視比其他的容器化服務更容易。此外,使用諸如deamonset和helm圖表之類的概念,您可以在部署的每個新節點上快速部署具有正確配置的監視代理。
我們在CoScale中處理這個問題的方法是在一個容器中運行我們的監控代理。可以將這些容器部署到各種不同的配置器和容器平臺中。我們與Kubernetes、OpenShift、Docker Swarm、Google容器引擎等進行了集成,然后我們在識別容器的名稱空間中直接運行我們的各種插件,以提取相關的度量標準。
基于容器映像的監視
容器本機監控也意味著容器圖像定義了監控應該怎么做,這個容器內部不需要一個代理,不需要引用監控細節,證書,等等。每個映像運行另一個服務或一個不同的版本,而這些都可以有不同的監控需求。例如,運行NGINX webservice的映像與運行Redis的映像具有不同的監視指標。
結論
容器本機監控有很多方面,上面列出的并不是詳盡,但是提供了如何利用容器技術的核心原則進行監視的一個好辦法。這包括在容器環境中訪問信息、監視設置的方式以及將低級指標轉換為可操作的洞察力的方式。