EFK的學習(Elasticsearch + Fluentd+ Kibana)


1. 安裝部署參考https://www.qikqiak.com/post/install-efk-stack-on-k8s/

2. Fluentd對應的yaml配置方式,配置文件一般為fluentd-es-configmap.yaml

日志源配置

比如我們這里為了收集 Kubernetes 節點上的所有容器日志,就需要做如下的日志源配置:

<source>

@id fluentd-containers.log

@type tail

path /var/log/containers/*.log

pos_file /var/log/fluentd-containers.log.pos

time_format %Y-%m-%dT%H:%M:%S.%NZ

tag raw.kubernetes.*

format json

read_from_head true

</source>

上面配置部分參數說明如下:

  • id:表示引用該日志源的唯一標識符,該標識可用於進一步過濾和路由結構化日志數據
  • type:Fluentd 內置的指令,tail表示 Fluentd 從上次讀取的位置通過 tail 不斷獲取數據,另外一個是http表示通過一個 GET 請求來收集數據。
  • path:tail類型下的特定參數,告訴 Fluentd 采集/var/log/containers目錄下的所有日志,這是 docker 在 Kubernetes 節點上用來存儲運行容器 stdout 輸出日志數據的目錄。
  • pos_file:檢查點,如果 Fluentd 程序重新啟動了,它將使用此文件中的位置來恢復日志數據收集。
  • tag:用來將日志源與目標或者過濾器匹配的自定義字符串,Fluentd 匹配源/目標標簽來路由日志數據。

路由配置

上面是日志源的配置,接下來看看如何將日志數據發送到 Elasticsearch:

<match **>

@id elasticsearch

@type elasticsearch

@log_level info

include_tag_key true

type_name fluentd

host "#{ENV['OUTPUT_HOST']}"

port "#{ENV['OUTPUT_PORT']}"

logstash_format true

<buffer>

@type file

path /var/log/fluentd-buffers/kubernetes.system.buffer

flush_mode interval

retry_type exponential_backoff

flush_thread_count 2

flush_interval 5s

retry_forever

retry_max_interval 30

chunk_limit_size "#{ENV['OUTPUT_BUFFER_CHUNK_LIMIT']}"

queue_limit_length "#{ENV['OUTPUT_BUFFER_QUEUE_LIMIT']}"

overflow_action block

</buffer>

  • match:標識一個目標標簽,后面是一個匹配日志源的正則表達式,我們這里想要捕獲所有的日志並將它們發送給 Elasticsearch,所以需要配置成**
  • id:目標的一個唯一標識符。
  • type:支持的輸出插件標識符,我們這里要輸出到 Elasticsearch,所以配置成 elasticsearch,這是 Fluentd 的一個內置插件。
  • log_level:指定要捕獲的日志級別,我們這里配置成info,表示任何該級別或者該級別以上(INFO、WARNING、ERROR)的日志都將被路由到 Elsasticsearch。
  • host/port:定義 Elasticsearch 的地址,也可以配置認證信息,我們的 Elasticsearch 不需要認證,所以這里直接指定 host 和 port 即可。
  • logstash_format:Elasticsearch 服務對日志數據構建反向索引進行搜索,將 logstash_format 設置為trueFluentd 將會以 logstash 格式來轉發結構化的日志數據。
  • Buffer: Fluentd 允許在目標不可用時進行緩存,比如,如果網絡出現故障或者 Elasticsearch 不可用的時候。緩沖區配置也有助於降低磁盤的 IO。

3. Elasticsearch數據存儲 

日志數據是存放於 Elasticsearch POD中,但是默認情況下它使用的是emptyDir存儲類型,所以當 POD被刪除或重新調度時,日志數據也就丟失了。以下講解使用NFS 服務器手動(靜態)創建PV 持久化保存日志數據的例子。

ES數據寫入原理

es建索引寫入數據,數據最先是存在內存buffer里的,然后再刷入到lucene的底層文件segment中;
寫入segment完畢后再執行refresh操作,refresh操作后,數據將commit到磁盤中。
數據刷入到了磁盤,就可以執行查詢操作了。

ES數據持久化

如何創建NFS服務器參考:

https://github.com/easzlab/kubeasz/blob/master/docs/guide/nfs-server.md

ES索引操作

具體命令參考:https://blog.csdn.net/hong2511/article/details/81808517

 

查用的es操作命令(查詢時以實際ip為准)

 

9200作為Http協議端口,用於節點和外部通訊。
9300作為Tcp協議端口,用於節點與節點之間、節點與TCPClient之間的通訊。

 

常用用_catAPI檢測集群是否健康。 確保9200端口號可用:curl  localhost:9200/_cat/health?V

 

獲取集群的節點列表:curl  localhost:9200/_cat/nodes?V

 

列出所有索引:curl localhost:9200/_cat/indices?V

 

刪除索引

curl -XDELETE http://localhost:9200/twitter,my_index

curl -XDELETE http://localhost:9200/*

 

創建索引

curl -XPUT 'localhost:9200/customer?pretty'

往集群索引中插入數據

curl -XPUT 'localhost:9200/customer/external/1?pretty' -d '

  {

           "name": "John Doe"

}'

獲取剛剛插入的數據curl -XGET 'localhost:9200/customer/external/1?pretty'

更新索引

id為1數據的name字段更新為Jane Doe同時增加字段age為20

curl -XPOST 'localhost:9200/customer/external/1/_update?pretty' -d '

  {

    "doc": { "name": "Jane Doe", "age": 20 }

  }'

 

 

索引操作的通用格式

curl -X<REST Verb> <Node>:<Port>/<Index>/<Type>/<ID>

  <REST Verb>REST風格的語法謂詞

  <Node>:節點ip

  <port>:節點端口號,默認9200

  <Index>:索引名

  <Type>:索引類型

  <ID>:操作對象的ID

 

$ curl localhost:9200/_cat

=^.^=

/_cat/allocation

/_cat/shards

/_cat/shards/{index}

/_cat/master

/_cat/nodes

/_cat/indices

/_cat/indices/{index}

/_cat/segments

/_cat/segments/{index}

/_cat/count

/_cat/count/{index}

/_cat/recovery

/_cat/recovery/{index}

/_cat/health

/_cat/pending_tasks

/_cat/aliases

/_cat/aliases/{alias}

/_cat/thread_pool

/_cat/plugins

/_cat/fielddata

/_cat/fielddata/{fields}

/_cat/nodeattrs

/_cat/repositories

/_cat/snapshots/{repository}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM