‍第五部分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 File

  • Application 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_PORTElasticsearch TCP埠9200

需要對Yaml文件進行任何相關的更改才能部署它。使用默認值假定在集群中至少有一個Elasticsearch podelasticsearch-logging。

4.4、企業支持

Treasure Data,Fluentd的原創創始人,為Kubernetes的Fluentd提供商業支持。

Advertisements

你可能會喜歡