使用EFK收集Kubernetes多集羣日誌

Collecting logs for multi kubernetes clusters with EFK

在有多個集羣的情況下,一個集羣就搭建一套日誌收集分析服務實在太浪費。因此可以嘗試只跑一套Elasticsearch和Kibana實例,然後讓各個集羣中的日誌收集器向Elasticsearch發送日誌,。

如圖所示:

graph TD;
Elastic---|analysis the data|Kibana;

cluster1-->|send log|Elastic((Elastic server)); cluster2-->|send log|Elastic; cluster3-->|send log|Elastic;
cluster(...)-->|send log|Elastic;

Elasticsearch和Kibana可以放在Kubernetes集羣中也可以獨立部署。這裏爲了方便就選擇獨立部署.

部署ElasticSearch和Kibana

Elastic自建了docker鏡像倉庫,因此到https://www.docker.elastic.co/拉去最新的Elasticsearch和Kibana 的鏡像.

然後編寫docker-compose.yaml文件.

關於詳細配置,參考官方文檔:

version: '2' services: elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:6.4.0 restart: unless-stopped
 ports:
 - "9200:9200"
 - "9300:9300" ulimits: memlock: soft: -1 hard: -1 nofile: soft: -1 hard: -1 environment:
 bootstrap.memory_lock: "true"
 discovery.type: "single-node" volumes:
 - /opt/es_data:/usr/share/elasticsearch/data
 kibana: image: docker.elastic.co/kibana/kibana:6.4.0 restart: unless-stopped
 ports:
 - "5601:5601" environment:
 server.host: "0.0.0.0"
 elasticsearch.url: "http://elasticsearch:9200" volumes: # 掛載kibana.yaml,可以在其中編寫更詳細的配置.這裏圖方便,用環境變量傳進去. # - ./kibana.yml:/usr/share/kibana/config/kibana.yml:ro
 - /opt/kibana_data:/usr/share/kibana/data

然後啓動docker-compose up -d,查看日誌 docker-compose logs -f可以看到ES和Kibana輸出的全部都是INFO等級的日誌,沒有ERROR,並且Kibana已經連接上ES。

curl -X GET 127.0.0.1:9200

{
 "name" : "h9sEa61",
 "cluster_name" : "docker-cluster",
 "cluster_uuid" : "8MjE8hwVSq2Vvbe2azZggQ",
 "version" : {
 "number" : "6.4.0",
 "build_flavor" : "default",
 "build_type" : "tar",
 "build_hash" : "595516e",
 "build_date" : "2018-08-17T23:18:47.308994Z",
 "build_snapshot" : false,
 "lucene_version" : "7.4.0",
 "minimum_wire_compatibility_version" : "5.6.0",
 "minimum_index_compatibility_version" : "5.0.0"
 },
 "tagline" : "You Know, for Search"
}

curl 127.0.0.1:5601

<script>
var hashRoute = '/app/kibana';
var defaultRoute = '/app/kibana';

var hash = window.location.hash;
if (hash.length) {
 window.location = hashRoute + hash;
} else {
 window.location = defaultRoute;
}
</script>

可以看到ES和Kibana成功返回數據.

部署Fluent

將Fluent以DaemonSet的方式部署在Kuberntes集羣中,讓Fluent收集每個Node上的日誌。

在Gihub上Fluent的官方庫下載fluentd-daemonset-elasticsearch-rbac.yaml

只需對yaml文件修改一個地方,就是將envFLUENT_ELASTICSEARCH_HOST的value改成ES的IP地址或網址即可。至於X-Pack的鑑權,ES默認是收費使用的,暫不用理會,或裝第三方的HTTP Basic Auth實現鑑權。

同時有的人會遇到一個錯誤,如果K8s集羣是用root權限運行的,則fluentd在收集日誌的時候會遇到權限問題。

因爲fluentd鏡像在構建的時候用的是fluent用戶權限運行,所以會發生權限不足的情況。

解決方法就是可以去拉取fluent代碼自行構建並在Dockfile中指定用戶;或使用最簡單的方法,在env中指定fluent用戶的UID爲0,如下所示:

...
 env:
 - name: FLUENT_UID
 value: "0"
...

查看es日誌,發現類似如下的日誌

xxx update_mapping [fluentd] 

說明fluent已經連接.

用瀏覽器打開Kibana,點擊Discover欄可以看到類似logstash-xxxx.xx.xx的條目,說明Kibana成功獲取到了日誌。接下來就是根據自己的日誌格式編寫過濾語句了。

本文轉自開源中國-使用EFK收集Kubernetes多集羣日誌

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章