第五部分Fluentd容器日誌部署設置
1、安裝Fluentd與docker
fluentd官方鏡像
https://hub.docker.com/r/fluent/fluentd/Fluentd官方鏡像(源)
https://github.com/fluent/fluentd-docker-image
1.1、步驟0:安裝docker
請從這裡下載並安裝Docker。
Docker Installation
https://docs.docker.com/engine/installation/
1.2、步驟1:pull Fluentd docker鏡像
然後,請通過docker pull命令下載Fluentd v0.12的圖像。
Advertisements
$ docker pull fluent/fluentd:v0.12-debian
Debian和AlpineLinux版適用於Fluentd鏡像。Debian版本是正式推薦的,因為它有jemalloc支持,但是Alpine的圖像更小。
如果您需要安全測試的Docker映像與清晰的生命周期管理,請檢查企業支持。
1.3、步驟3:啟動fluentd容器
為了簡化測試,請在/tmp/fluentd.conf下創建下面的示例配置。此示例接受來自http的記錄,並輸出到stdout。
# /tmp/fluentd.conf<source> @type http port 9880 bind 0.0.0.0</source><match **> @type stdout</match>
最後,你可以運行fluentd與Docker運行命令。
Advertisements
$ docker run -d \ -p 9880:9880 -v /tmp:/fluentd/etc -e FLUENTD_CONF=fluentd.conf \ fluent/fluentd2017-01-30 11:52:23 +0000 [info]: reading config file path="/fluentd/etc/fluentd.conf"2017-01-30 11:52:23 +0000 [info]: starting fluentd-0.12.312017-01-30 11:52:23 +0000 [info]: gem 'fluentd' version '0.12.31'2017-01-30 11:52:23 +0000 [info]: adding match pattern="**" type="stdout"2017-01-30 11:52:23 +0000 [info]: adding source type="http"2017-01-30 11:52:23 +0000 [info]: using configuration file: <ROOT> <source> @type http port 9880 bind 0.0.0.0 </source> <match **> @type stdout </match></ROOT>
1.4、步驟三:通過HTTP發送示例日誌
讓我們通過HTTP來發布示例日誌,並確認它正在工作。curl命令始終是您的朋友。
$ curl -X POST -d 'json={"json":"message"}' http://localhost:9880/sample.test
使用docker ps命令檢索容器ID,並使用docker logs命令檢查特定容器的日誌。
$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESb495e527850c fluent/fluentd "/bin/sh -c 'exec ..." 2 hours ago Up 2 hours 5140/tcp, 24224/tcp, 0.0.0.0:9880->9880/tcp awesome_mcnulty$ docker logs b495e527850c | tail -n 12017-01-30 14:04:37 +0000 sample.test: {"json":"message"}
1.5、下一個步驟
現在你知道如何使用Fluentd通過Docker。 這是Fluentd的幾個Docker相關文檔。
Fluentd』s official Docker image
Fluentd』s official Docker image (Source)
Docker Logging Driver and Fluentd
Docker Logging via EFK (Elasticsearch + Fluentd + Kibana) Stackwith Docker Compose
另外,請參閱以下教程,了解如何從各種數據源收集數據。
基礎設置
Config FileApplication Logs
Ruby, Java, Python, PHP, Perl, Node.js, Scala例子
Store Apache Log into Amazon S3
Store Apache Log into MongoDB
Data Collection into HDFS
2、docker的fluentd日誌驅動
以下文章介紹如何為Docker容器實施統一的日誌記錄系統。 任何生產應用程序需要在運行時註冊某些事件或問題。
舊的方式是將這些消息寫入日誌文件,但是當我們嘗試對寄存器執行一些分析時,或者另一方面,如果應用程序具有多個實例運行,那麼它們會繼承某些問題,escenario變得更加複雜。
在Docker v1.6中,引入了日誌記錄驅動程序的概念,基本上Docker引擎了解管理應用程序消息的輸出介面。
對於Docker v1.8,我們已經實現了一個原生的FluentdDocker日誌驅動程序,現在您可以使用簡單和高性能的Fluentd來統一結構化的日誌記錄系統。
2.1、開始
使用Fluentd的Docker日誌記錄機制是一個非常重要的一步,要開始確保您具有以下先決條件:
基本了解Fluentd
基本了解docker
基本了解docker日誌驅動
本文推出Fluentd作為標準流程,而不是容器。 預先參考Docker通過EFK(Elasticsearch + Fluentd+ Kibana)進行日誌記錄與Docker-compose編寫用於完全集裝箱化的環境教程。
步驟1、創建fluentd配置文件
第一步是準備Fluentd偵聽從Docker容器接收的消息,為了演示目的,我們將指示Fluentd將消息寫入標準輸出;在稍後的步驟中,您將發現如何實現將日誌聚合為MongoDB實例的方法。
創建一個名為in_docker.conf的簡單文件。包含以下條目的conf:
<source> type forward port 24224 bind 0.0.0.0</source><match *.*> type stdout</match>
步驟2、開始fluentd
使用這個簡單的命令啟動Fluentd的一個實例:
$ fluentd -c in_docker.conf
如果服務開始,您應該看到如下輸出:
$ fluentd -c in_docker.conf2015-09-01 15:07:12 -0600 [info]: reading config file path="in_docker.conf"2015-09-01 15:07:12 -0600 [info]: starting fluentd-0.12.152015-09-01 15:07:12 -0600 [info]: gem 'fluent-plugin-mongo' version '0.7.10'2015-09-01 15:07:12 -0600 [info]: gem 'fluentd' version '0.12.15'2015-09-01 15:07:12 -0600 [info]: adding match pattern="*.*" type="stdout"2015-09-01 15:07:12 -0600 [info]: adding source type="forward"2015-09-01 15:07:12 -0600 [info]: using configuration file: <ROOT> <source> @type forward port 24224 bind 0.0.0.0 </source> <match docker.*> @type stdout </match></ROOT>2015-09-01 15:07:12 -0600 [info]: listening fluent socket on 0.0.0.0:24224
步驟3、使用Fluentd驅動程序啟動Docker容器
默認情況下,Fluentd日誌記錄驅動程序將嘗試查找localFluentd實例(步驟2)監聽TCP埠24224上的連接,請注意,如果無法連接到Fluentd實例,則該容器將無法啟動。
以下命令將運行一個基本的Ubuntu容器,並向標準輸出列印一些消息,請注意,我們已經啟動了指定Fluentd日誌記錄驅動程序的容器:
$ docker run --log-driver=fluentd ubuntu echo "Hello Fluentd!"Hello Fluentd!
步驟四、確認
現在,在Fluentd輸出中,您將看到來自容器的傳入消息,例如:
2015-09-01 15:10:40 -0600 docker.3fd8678d487e: {"source":"stdout","log":"Hello Fluentd!","container_id":"3fd8678d487e540c7a303e1613101e746c5012f3317434eda93f24351c1928f7","container_name":"/angry_kalam"}
在這一點上,您將注意到有趣的事情,傳入的消息具有時間戳,標記為container_id,並且包含沿消息的源容器的一般信息,JSON格式的所有內容。
額外步驟1、解析日誌消息
應用程序日誌存儲在記錄中的「日誌」欄位中。 您可以在發送到目的地之前使用filter_parser過濾器解析此日誌。
<filter docker.**> @type parser format json # apache2, nginx, etc... key_name log reserve_data true</filter>
原始事件:
2015-09-01 15:10:40 -0600 docker.3fd8678d487e: {"source":"stdout","log":"{\"key\":\"value\"}","container_id":"3fd8678d487e540c7a303e1613101e746c5012f3317434eda93f24351c1928f7","container_name":"/angry_kalam"}
過濾事件:
2015-09-01 15:10:40 -0600 docker.3fd8678d487e: {"source":"stdout","log":"{\"key\":\"value\"}","container_id":"3fd8678d487e540c7a303e1613101e746c5012f3317434eda93f24351c1928f7","container_name":"/angry_kalam","key":"value"}
額外步驟2、連接多行日誌消息
應用程序日誌存儲在記錄中的「日誌」欄位中。在發送到目的地之前,您可以使用fluent-plugin-concat插件連接過濾器連接這些日誌。
<filter docker.**> @type concat key log stream_identity_key container_id multiline_start_regexp /^-e:2:in `\/'/ multiline_end_regexp /^-e:4:in/</filter>
原始活動:
2016-04-13 14:45:55 +0900 docker.28cf38e21204: {"container_id":"28cf38e212042225f5f80a56fac08f34c8f0b235e738900c4e0abcf39253a702","container_name":"/romantic_dubinsky","source":"stdout","log":"-e:2:in `/'"}2016-04-13 14:45:55 +0900 docker.28cf38e21204: {"source":"stdout","log":"-e:2:in `do_division_by_zero'","container_id":"28cf38e212042225f5f80a56fac08f34c8f0b235e738900c4e0abcf39253a702","container_name":"/romantic_dubinsky"}2016-04-13 14:45:55 +0900 docker.28cf38e21204: {"source":"stdout","log":"-e:4:in `<main>'","container_id":"28cf38e212042225f5f80a56fac08f34c8f0b235e738900c4e0abcf39253a702","container_name":"/romantic_dubinsky"}
過濾事件:
2016-04-13 14:45:55 +0900 docker.28cf38e21204: {"container_id":"28cf38e212042225f5f80a56fac08f34c8f0b235e738900c4e0abcf39253a702","container_name":"/romantic_dubinsky","source":"stdout","log":"-e:2:in `/'\n-e:2:in `do_division_by_zero'\n-e:4:in `<main>'"}
2.2、驅動參數
Fluentd日誌驅動程序通過-log-opt Docker命令行參數支持更多選項:
fluentd-address
tag
fluentd-address
為Fluentd指定可選地址,它允許設置主機和TCP埠,例如:
$ docker run --log-driver=fluentd --log-opt fluentd-address=192.168.2.4:24225 ubuntu echo "..."
tag
tag簽是Fluentd的主要要求,它們允許識別傳入的數據並進行路由決策。默認情況下,Fluentd日誌記錄驅動程序使用container_id作為標籤(64個字元ID),您可以使用tag選項更改其值,如下所示:
$ docker run --log-driver=fluentd --log-opt tag=docker.my_new_tag ubuntu echo "..."
此外,此選項允許指定一些內部變數:{{.ID}},{{.FullID}}或{{.Name}}。 例如:
$ docker run --log-driver=fluentd --log-opt tag=docker.{{.ID}} ubuntu echo "..."
2.3、開發環境
在一個更真實的用例中,您想要使用其他比Fluentd標準輸出存儲集裝箱碼頭工人的信息,如Elasticsearch,MongoDB,HDFS,S3,谷歌雲存儲等等。
本文檔介紹了如何使用DockerCompose通過EFK(Elasticsearch,Fluentd,Kibana)設置多容器日誌記錄環境。
Docker Logging via EFK (Elasticsearch + Fluentd + Kibana) Stackwith Docker Compose
2.4、生產環境
在生產環境中,您必須使用其中一個容器編排工具。目前,Kubernetes更好地與Fluentd集成,我們正在努力與其他工具進行更好的集成。
Kubernetes』s Logging Overview
3、Docker Logging via EFK (Elasticsearch + Fluentd + Kibana)Stack with Docker Compose
本文介紹如何將Docker日誌收集到EFK(Elasticsearch + Fluentd + Kibana)堆棧。該示例使用Docker Compose設置多個容器。
Elasticsearch是一款以易於使用而聞名的開源搜索引擎。Kibana是一個開源的WebUI,使得Elasticsearch用戶對營銷人員,工程師和數據科學家都很友好。
通過結合這三個工具EFK(Elasticsearch + Fluentd +Kibana),我們可以獲得可擴展,靈活,易於使用的日誌收集和分析流程。 在本文中,我們將設置4個容器,每個容器包括:
Apache HTTP Server
Fluentd
Elasticsearch
Kibana
所有httpd的日誌將通過Fluentd進入Elasticsearch + Kibana。
3.1、前提條件
下載並安裝Docker/Docker-Compose
Docker Installation
3.2、步驟0、準備docker-compose.yml
首先,請為Docker Compose準備docker-compose.yml。Docker-Compose是定義和運行多容器Docker應用程序的工具。
使用下面的YAML文件,您可以通過一個命令創建並啟動所有服務(在本例中為Apache,Fluentd,Elasticsearch,Kibana)。
version: '2'services: web: image: httpd ports: - "80:80" links: - fluentd logging: driver: "fluentd" options: fluentd-address: localhost:24224 tag: httpd.access fluentd: build: ./fluentd volumes: - ./fluentd/conf:/fluentd/etc links: - "elasticsearch" ports: - "24224:24224" - "24224:24224/udp" elasticsearch: image: elasticsearch expose: - 9200 ports: - "9200:9200" kibana: image: kibana links: - "elasticsearch" ports: - "5601:5601"
Web容器的記錄部分(檢查Docker Compose文檔)將Docker FluentdLogging驅動程序指定為默認容器日誌記錄驅動程序。來自Web容器的所有日誌將被自動轉發到由fluentd-address指定的主機:埠。
3.3、步驟1、使用Config + Plugin準備Fluentd映像
然後,請準備具有以下內容的fluentd /Dockerfile,以使用Fluentd的官方Docker映像,並另外安裝Elasticsearch插件。
# fluentd/DockerfileFROM fluent/fluentd:v0.12-debianRUN ["gem", "install", "fluent-plugin-elasticsearch", "--no-rdoc", "--no-ri", "--version", "1.9.2"]
然後,請準備Fluentd的配置文件fluentd/conf/fluent.conf。in_forward插件用於從Docker日誌驅動程序接收日誌,out_elasticsearch用於將日誌轉發到Elasticsearch。
# fluentd/conf/fluent.conf<source> @type forward port 24224 bind 0.0.0.0</source><match *.**> @type copy <store> @type elasticsearch host elasticsearch port 9200 logstash_format true logstash_prefix fluentd logstash_dateformat %Y%m%d include_tag_key true type_name access_log tag_key @log_name flush_interval 1s </store> <store> @type stdout </store></match>
3.4、步驟2、啟動容器
讓我們啟動所有的容器,只有一個命令。
$ docker-compose up
您可以檢查4個容器是否由docker ps命令運行。
$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES2d28323d77a3 httpd "httpd-foreground" About an hour ago Up 43 seconds 0.0.0.0:80->80/tcp dockercomposeefk_web_1a1b15a7210f6 dockercomposeefk_fluentd "/bin/sh -c 'exec ..." About an hour ago Up 45 seconds 5140/tcp, 0.0.0.0:24224->24224/tcp, 0.0.0.0:24224->24224/udp dockercomposeefk_fluentd_101e43b191cc1 kibana "/docker-entrypoin..." About an hour ago Up 45 seconds 0.0.0.0:5601->5601/tcp dockercomposeefk_kibana_1b7b439415898 elasticsearch "/docker-entrypoin..." About an hour ago Up 50 seconds 0.0.0.0:9200->9200/tcp, 9300/tcp dockercomposeefk_elasticsearch_1
3.5、步驟3、生產httpd訪問日誌
讓我們訪問httpd來生成一些訪問日誌。curl命令始終是您的朋友。
$ repeat 10 curl http://localhost:80/<html><body><h1>It works!</h1></body></html><html><body><h1>It works!</h1></body></html><html><body><h1>It works!</h1></body></html><html><body><h1>It works!</h1></body></html><html><body><h1>It works!</h1></body></html><html><body><h1>It works!</h1></body></html><html><body><h1>It works!</h1></body></html><html><body><h1>It works!</h1></body></html><html><body><h1>It works!</h1></body></html><html><body><h1>It works!</h1></body></html>
3.6、步驟4、從Kibana確認日誌
請訪問http://localhost:5601/使用您的瀏覽器。然後,您需要為Kibana建立索引名稱模式。請將fluentd -*指定為索引名稱或模式,並按下Create按鈕。
然後,前往Discover選項卡尋找日誌。正如您所看到的,日誌被正確地收集到Elasticsearch+Kibana,通過Fluentd。
3.7、結論
本文解釋了如何從Apache收集日誌到EFK(Elasticsearch+ Fluentd +Kibana)。示例代碼可在該存儲庫中使用。
https://github.com/kzk/docker-compose-efk
了解更多
Fluentd架構
Fluentd開始使用
下載Fluentd
4、Fluentd收集kubernetes日誌
Kubernetes為應用程序和集群日誌提供兩個日誌記錄端點:StackdriverLogging用於Google Cloud Platform和Elasticsearch。幕後有一個日誌記錄代理,關心日誌收集,解析和分發:Fluentd。
以下文檔著重介紹如何在Kubernetes中部署Fluentd,並擴展為您的日誌設置不同目的地的可能性。
4.1、開始
以下文檔假設您已運行Kubernetes集群或至少可以用於測試目的的本地(單個)節點。
在開始之前,請確保您了解或了解Kubernetes的以下概念:
node
一個節點是Kubernetes中的一個工作機器,以前被稱為一個奴才。 根據集群,節點可以是VM或物理機。每個節點具有運行pod的必要服務,並由主組件管理...
pod
pod(如在pod或pea pod中)是一組或多個容器(如Docker容器),這些容器的共享存儲器以及有關如何運行容器的選項。Pods總是位於同一個位置並且共同安排,並在共享的環境中運行
DaemonSet
DaemonSet確保所有(或一些)節點運行pod的副本。 隨著節點被添加到集群,pod被添加到它們。當從集群中刪除節點時,這些pod被垃圾回收。 刪除DaemonSet將清除它創建的pod。
由於應用程序在Pods中運行,並且多個Pod可能存在於多個節點之間,因此我們需要一個特定的Fluentd-Pod來處理每個節點上的日誌收集:FluentdDaemonSet。
4.2、Fluentd DaemonSet
對於Kubernetes,DaemonSet確保所有(或某些)節點運行pod的副本。為了解決日誌收集,我們要實現一個Fluentd DaemonSet。
Fluentd具有足夠的靈活性,並具有適當的插件來將日誌分發到不同的第三方應用程序,如資料庫或雲服務,所以主要的問題是知道:日誌將被存儲在哪裡?一旦我們回答了這個問題,我們可以前進配置我們的DaemonSet。
以下步驟將專註於將日誌發送到Elasticsearch Pod。
獲取fluentd daemonset sources
我們已經創建了一個Fluentd DaemonSet,它有合適的規則和容器映像,準備開始:
https://github.com/fluent/fluentd-kubernetes-daemonset
請使用GIT從命令行抓取存儲庫的副本:
$ git clone https://github.com/fluent/fluentd-kubernetes-daemonset
DaemonSet內容
clonedrepository包含允許將Fluentd部署為DaemonSet的多個配置,分發在存儲庫上的Docker容器映像也預先配置,因此Fluentd可以從Kubernetes節點環境收集所有日誌,並且還將適當的元數據附加到日誌中。
這個 repository有幾個預設的alpine/debian與流行的輸出。
DaemonSet preset settings
4.3、日誌記錄Elasticsearch
要求
從fluentd-kubernetes-daemonset /目錄中,找到Yaml配置文件:
fluentd-daemonset-elasticsearch.yaml
作為一個例子,我們來看看文件內容的一部分:
apiVersion: extensions/v1beta1kind: DaemonSetmetadata: name: fluentd namespace: kube-system ...spec: ... spec: containers: - name: fluentd image: quay.io/fluent/fluentd-kubernetes-daemonset env: - name: FLUENT_ELASTICSEARCH_HOST value: "elasticsearch-logging" - name: FLUENT_ELASTICSEARCH_PORT value: "9200" ...
Yaml文件有兩個相關的環境變數,它們在容器啟動時被Fluentd使用:
環境變數 | 描述 | 默認 |
---|---|---|
FLUENT_ELASTICSEARCH_HOST | 指定主機名或IP地址。 | elasticsearch日誌 |
FLUENT_ELASTICSEARCH_PORT | Elasticsearch TCP埠 | 9200 |
需要對Yaml文件進行任何相關的更改才能部署它。使用默認值假定在集群中至少有一個Elasticsearch podelasticsearch-logging。
4.4、企業支持
Treasure Data,Fluentd的原創創始人,為Kubernetes的Fluentd提供商業支持。