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 設置為true,Fluentd 將會以 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之間的通訊。
常用用_cat API檢測集群是否健康。 確保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}