天天看點

如何在 Rancher 中統一管理容器日志

相信大家對于容器和 docker 這個概念并不陌生,很高興的是 docker 為我們提供了多種log-driver。 

<a href="https://s4.51cto.com/wyfs02/M00/8E/C6/wKioL1jLMlvAHiI3AACiXm5RIfk114.jpg" target="_blank"></a>

我們在使用 docker 處理日志的時候多數是采用 docker logs &lt;container&gt;指令,因為 docker 預設采用的 log-driver 是 json-file,是以 docker 會捕捉每一個容器程序 STDOUTS 和 STDERR,儲存在磁盤檔案.json.log 中供 docker logs 指令查詢。 

<a href="https://s1.51cto.com/wyfs02/M02/8E/C8/wKiom1jLMmyDTA3TAABPgcpj3SA142.jpg" target="_blank"></a>

上述方式如果用于開發過程中的調試工作,是種快速且不錯的方案,但是如果面對大規模應用部署的環境下那麼日志的跟蹤與調試帶來的困擾顯而易見,是以我們需要一個統一集中的容器日志收集與展示平台。

對于容器日志收集與展示,syslog + rsyslog + ELK(ElasticSearch、Logstash、Kibana)是一個不錯的技術方案,我将簡單介紹下為什麼我們選用這種方案。

Syslog 是一種 RFC 協定,與平台無關,且是 UNIX 标準的日志解決方案,內建度良好。rsyslog 顧名思義是 remote 的意思,使 syslog 具備收集遠端日志的功能,由于 logstash 采用 java 和 jruby開發,是以 logstash 檔案庫中可以加入 windows 日志檔案。而 logspout 暫不支援容器-t(tty) 啟動。

我們慶幸的是 Rancher 的 Catalog 真的很強大,Rancher Catalog 已經為我們提供了 ELK 的Catalog,下面我将給出 ELK 在 Rancher 中的部署視圖,并簡單介紹下視圖中每個元件都是幹什麼的。 

<a href="https://s4.51cto.com/wyfs02/M01/8E/C8/wKiom1jLMnuz0yrjAABOtSRqUl8253.jpg" target="_blank"></a>

logstash-collector:用于接收 docker container 發送過來的日志資訊,并将日志資訊發送到redis 隊列中。在 rancher 中預設開啟 TCP:6000 UDP:5000 端口用于偵聽發送過來的日志封包。

redis:日志消息隊列。

logstash-indexer:用于接收redis中未處理的日志資訊,然後将該日志消息發送到elasticsearsh中進行存儲及搜尋分析。

kopf:elasticsearch 的一款第三方插件,提供一個簡單的管理者 web 界面。

elasticsearch-clients:用于處理路由請求,協調資料節點與主節點。

elasticsearch-master:用于叢集操作相關的内容。

elasticsearch-datanode: 用于存儲索引資料的節點。

上述部署視圖中說好的 Kibana 哪兒去了?

因為我們有自己的日志展現平台,是以這裡去掉了 kibana,如果你想在 Rancher 中使用 Kibana做日志前端展現,那麼很簡單,隻需要利用 Rancher 的 Catalog,service link:Rancher 環境中上述已經部署好的 elasticsearch-client 即可。

至此,在 Rancher 中如何部署一套完整 ELK 系統已經介紹完了,下面我将介紹如何将容器日志發送到 ELK 中。 

為了完成上述的目标,我們還需要做一些準備工作,那就是需要一個運作 rsyslog 的容器。如果你不想基于 alpine 去制作 rsyslog 鏡像,那麼可以使用 panoptix/rsyslog 這個鏡像。

下面就是關鍵的一步:如何讓 rsyslog 發送日志到 logstash 中。

上述 rsyslog 容器啟動好之後我們需要告知 rsyslog,目的接收端 logstash 的位址。過程很簡單,需要在容器中/etc/rsyslog.d/ 目錄下建立一個檔案 60-logstash.conf 

<a href="https://s2.51cto.com/wyfs02/M00/8E/C6/wKioL1jLMt2hgTOuAAATXQPSuuk427.jpg" target="_blank"></a>

:programname, contains, “docker”的意思是過濾日志,隻有 Properties 中 key 為 programname,value 包含 docker 字樣的日志才會被發送給 logstash

*.* @@logstash-collector:6000;json-template 是所有使用者的所有日志通過 tcp 傳輸到logstash-collector 的 6000 端口并且日志使用 json-template 格式化。

同樣我們需要建立 01-json-template.conf,property 的 key 值我們可以通過 rsyslog 官網擷取。 

<a href="https://s2.51cto.com/wyfs02/M02/8E/C8/wKiom1jLMvuQMhLHAABzKZF-M_U010.jpg" target="_blank"></a>

下面我将介紹 rsyslog 如何收集容器日志。

首先我們需要修改我們的應用容器 log-driver 為 syslog(可以通過 rancher-ui 或者rancher-compose)來完成。

其次我們需要設定我們日志接收端 rsyslog 位址,可以通過 log_opt 指定syslog-address:hostname:tcp_port 來完成。

log_opt 可以指定許多 syslog 支援的選項比如 facility 等,在此不一一列舉。目前日志顯的雜亂無序。如何去按照 container 或者 stack 或者 service 去區分日志呢?

syslog 的 tag 屬性為我們支援了自定義的标簽,通過打 tag 的方式我們可以細粒度的自行切分日志。

Rancher 對 docker 的親和性極大程度的為我們提供了周遊。我們可以通過 go templage 文法去擷取 rancher 環境下容器的特征值進而協助我們切分日志資訊。 

<a href="https://s5.51cto.com/wyfs02/M01/8E/C8/wKiom1jLMxCTkZYWAABlXoFM9dQ838.jpg" target="_blank"></a>

OK,現在我們再去檢視 kibana 發現我們的容器日志已經展示在這裡了。 

<a href="https://s1.51cto.com/wyfs02/M02/8E/C6/wKioL1jLMyGiqOGOAADT-8bvy5E594.jpg" target="_blank"></a>

最後我們可以按照 rancher catalog 規範,制作一鍵部署應用。 

<a href="https://s4.51cto.com/wyfs02/M00/8E/C8/wKiom1jLMzDjk6lTAAA2NW193Ec565.jpg" target="_blank"></a>

本文轉自 RancherLabs 51CTO部落格,原文連結:http://blog.51cto.com/12462495/1907506

繼續閱讀