Docker 日誌的 10 大陷阱

2018-01-21    分類:雲端計算/大資料、程式設計開發、首頁精華1人評論發表於2018-01-21

本文由碼農網 – 小峰原創翻譯,轉載請看清文末的轉載要求,歡迎參與我們的付費投稿計劃

Docker不僅改變了應用程式的部署方式,還改變了日誌管理的工作流程。容器不但無需將日誌寫入檔案,反而是將日誌寫入控制檯(stdout / stderr),然後Docker Logging Drivers將日誌轉發到目標。針對Docker GitHub問題的檢查很快會顯示使用者在處理Docker日誌時遇到各種問題。使用Docker管理日誌貌似有點棘手,且需要深入理解Docker Logging Driver的實現和替代方法,以解決報告的問題。

那麼,Docker日誌的十大陷阱是什麼?

首先,讓我們從Docker Logging Drivers和選項的概述開始,將日誌傳送到集中式日誌管理解決方案,如Elastic Stack(前身ELK Stack)或Sematext Cloud

在Docker的早期,容器日誌只能通過Docker遠端API,即通過“docker logs”命令和一些高階的日誌傳送工具才能使用。之後,Docker引入日誌驅動程式作為外掛,以開啟Docker與各種日誌管理工具進行整合。這些日誌驅動程式是作為docker守護程式中的二進位制外掛實現的。最近,外掛體系結構得到了擴充套件,以便於執行日誌驅動程式作為外部程式,不但可以註冊為外掛,還可以通過Unix套接字檢索日誌。目前,Docker二進位制檔案附帶的日誌記錄驅動程式是二進位制外掛,但在不久的將來可能會發生變化。

Docker Logging Drivers接收容器日誌並將其轉發到遠端目標或檔案。預設的日誌驅動程式是“json-file”。它在本地磁碟上以JSON格式儲存容器日誌。Docker有一個用於日誌記錄驅動程式的外掛體系結構,所以有外掛可用於開源工具和商業工具:

  • Journald – 將容器日誌儲存在系統日誌中
  • Syslog Driver – 支援UDP,TCP,TLS
  • Fluentd- 支援TCP或Unix套接字連線到fluentd
  • Splunk - 將HTTP / HTTPS轉發到Splunk伺服器
  • Gelf - 將UDP日誌轉發到Graylog2

對於完整的日誌管理解決方案,需要包含附加工具:

日誌解析器來構造日誌,通常是日誌傳送工具(fluentdrsysloglogstashlogagent等)的一部分

日誌索引,視覺化和警報:

為了將日誌傳送到其中一個後端,你可能需要選擇一個支援所選日誌管理解決方案的日誌驅動程式或日誌記錄工具。如果你的工具需要Syslog輸入,則可以選擇Syslog驅動程式。

Docker日誌的十大陷阱

1. Docker日誌命令只在使用json-file日誌驅動程式時可工作

預設的日誌驅動程式“json-file”將日誌寫入本地磁碟,而json-file驅動程式是唯一與“docker logs”命令並行工作的驅動程式。只要有人使用替代日誌驅動程式,例如Syslog,Gelf或Splunk,則Docker日誌API呼叫就會失敗,而“docker logs”命令將顯示報告限制的錯誤,而不是在控制檯上顯示日誌。docker log命令不僅會失敗,而且很多其他使用Docker API的日誌工具,比如像Portainer這樣的Docker使用者介面,或者像Logspout這樣的日誌集合容器,都不能在這種情況下顯示容器日誌。

請參閱https://github.com/moby/moby/issues/30887<wbr><wbr><wbr>

2. Docker Syslog驅動程式可以阻止容器部署

使用Docker Syslog驅動程式與TCP或TLS是提供日誌的可靠方式。但是,Syslog日誌驅動程式需要在啟動容器時建立與Syslog伺服器的TCP連線。如果無法在容器啟動時建立此連線,則容器啟動失敗,並顯示錯誤訊息如

docker: Error response from daemon: Failed to initialize logging driver: dial tcp

這意味著暫時的網路問題或高網路延遲可以阻止容器的部署。此外,Syslog伺服器的重新啟動可能會將所有通過TCP / TS的容器日誌記錄到中央Syslog伺服器,這絕對是要避免的情況。

請參閱:https://github.com/docker/docker/issues/21966

3.當目標關閉時,Docker Syslog驅動程式會丟失日誌

與上面的問題#2類似,導致日誌丟失的原因是Docker日誌驅動程式在日誌無法傳遞到遠端目標時缺少了緩衝磁碟日誌的能力。

一個有趣的問題要看:https://github.com/moby/moby/issues/30979

4. Docker日誌驅動程式不支援像Error Stack Traces這樣的多行日誌

當我們考慮日誌時,大多數人都會想到簡單的單行日誌,比如Nginx或Apache日誌。但是,日誌也可以跨越多個行。例如,異常跟蹤通常跨越多行,因此為了幫助Logstash使用者,我們分享瞭如何使用Logstash處理堆疊跟蹤。在容器世界中情況也不見得好一點,甚至反而更加複雜,因為在容器中執行的所有app的日誌都被輸出到相同的輸出——標準輸出。難怪看到問題#22920以“Closed. Don’t care.”結束使得這麼多人失望了。幸運的是,像Sematext Docker Agent這樣的工具可以立即可用地解析多行日誌,以及應用自定義的多行模式。

5. Docker服務日誌命令與非JSON日誌記錄驅動程式掛起

雖然json-files驅動程式看起來很健壯,但其他日誌驅動程式可能仍然會造成Docker Swarm模式的麻煩。

請參閱Github問題:https://github.com/docker/docker/issues/28793

6.如果fluentd守護程式已經失效並且緩衝區已滿,則Docker守護程式會崩潰

另一種日誌驅動程式在遠端目標不可訪問時會導致問題的情境——在這種情況下,日誌驅動程式會丟擲導致Docker後臺程式崩潰的異常。

7.在Splunk驅動程式失敗時,Docker Container陷入建立狀態

如果Splunk伺服器在容器啟動時返回504,則容器實際上是啟動的,但是Docker報告容器未能啟動。一旦處於這種狀態,容器將不再出現在docker ps下,並且容器程式不能通過docker kill停止。停止該過程的唯一方法是手動kill。

Github:https://github.com/moby/moby/issues/24376

8. Docker日誌跳過/缺少應用程式日誌(journald驅動程式)

事實證明,這個問題是由journald速率限制引起的,當Docker為所有正在執行的應用程式建立日誌時,需要增加日誌速率限制,而由於其速率限制設定,journald可能會跳過某些日誌。所以當你連線Docker的時候要注意你的journald設定。

9.Gelf驅動程式問題

Gelf日誌驅動程式缺少TCP或TLS選項,並且僅支援UDP,當UDP資料包丟失時可能會有丟失日誌訊息的風險。有些問題報告了使用GELF驅動程式進行DNS解析/快取的問題,所以當你的Graylog伺服器IP更改時,你的日誌可能會傳送到“Nirvana” ——這使用容器部署可能會快速發生。

10. Docker不支援多個日誌驅動程式

將日誌儲存在本地伺服器上並將其傳送到遠端伺服器是很好的。目前,Docker不支援多個日誌驅動程式,所以使用者不得不選擇單個日誌驅動程式。

儘管已經知道了這篇文章中列出的各種問題,但抉擇起來依然不是一件易事。

譯文連結:http://www.codeceo.com/article/10-docker-logging-gotchas.html
英文原文:Top 10 Docker Logging Gotchas
翻譯作者:碼農網 – 小峰
轉載必須在正文中標註並保留原文連結、譯文連結和譯者等資訊。]

相關文章