天天看點

在kubernetes叢集中部署efk

本文将介紹在kubernetes 1.9叢集下配置elasticsearch、fluentd、kibana集中收集k8s叢集日志資訊。俗稱efk,其中elasticsearch負責存儲日志。fluentd負責将叢集中docker主機上的日志發送給elasticsearch,是以fluentd在k8s叢集中需要以daemonset的方式運作。kibana負責圖形化展示日志資訊。

一、環境介紹

軟體環境:

k8s版本:1.9.0

docker版本:17.03.2-ce

elasticsearch版本及鏡像下載下傳位址:k8s.gcr.io/elasticsearch:v5.6.4

kibana版本及鏡像下載下傳位址:docker.elastic.co/kibana/kibana:5.6.4

fluentd版本及鏡像下載下傳位址:gcr.io/google-containers/fluentd-elasticsearch:v2.0.4

master節點:

主機名:vm1

ip位址:192.168.115.5/24

node節點:

主機名:vm2

ip位址:192.168.115.6/24

在kubernetes叢集中部署efk
在kubernetes叢集中部署efk

二、下載下傳yaml檔案和elasticsearch、fluentd、kibana對應版本的鏡像。

鏡像的下載下傳需要使用方式實作。

yaml檔案下載下傳位址:

https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/fluentd-elasticsearch

三、通過下載下傳好的yaml檔案建立configmap、service、serviceaccount、clusterrole以及deployment等

在kubernetes叢集中部署efk

通過dashboard面闆上可以看到fluentd在vm1和vm2上都有運作。

在kubernetes叢集中部署efk

到這裡為止,看上去一切好像都挺正常的。可是過來一會elasticsearch-loggin-0、elasticsearch-loggin-1兩個pod不斷的restart, vmware的終端console上可以看出是因為java的oom引起的

在kubernetes叢集中部署efk

此時筆記本的記憶體已消耗90%、磁盤活動時間已達100%。即使硬碟是pcie的ssd也經不起這樣折騰。

在kubernetes叢集中部署efk

如果把es-statefulset.yaml的replicas參數修改為1,記憶體是将将夠,但是elasticsearch叢集又是斷腿的,運作不起來。

在kubernetes叢集中部署efk

既然筆記本資源不足,為了完成這個實驗。隻好選擇使用桌上型電腦了,幸好我的桌上型電腦有16g的記憶體,ssd硬碟也夠放的下虛拟機檔案。

四、将vm1和vm2虛拟機檔案從筆記本中複制到桌上型電腦後啟動k8s叢集,并進行重建。

在kubernetes叢集中部署efk

觀察了一會,發現所有的pod狀态都正常,不會出現oom問題自動restart

在kubernetes叢集中部署efk
在kubernetes叢集中部署efk

五、通路kibana和elasticsearch驗證

接下來我們臨時開啟api-server http協定的8888端口,用于測試kibana的通路

在kubernetes叢集中部署efk

通路位址:

http://192.168.115.5:8888/api/v1/proxy/namespaces/kube-system/services/kibana-logging/

在kubernetes叢集中部署efk
在kubernetes叢集中部署efk

通過curl檢視elasticsearch容器中資訊,這裡可以運作一個curl容器,或者直接用elasticsearch-logging-1容器

在kubernetes叢集中部署efk

檢視elasticsearch叢集的健康狀态、索引和節點資訊

在kubernetes叢集中部署efk

到目前為止,我們實作了在k8s叢集中使用efk進行日志的集中管理。

六、一些問題

1、elasticsearch java oom問題

這個在前文已經說明過了,解決方案隻有加資源一條路。

這問題一般出現在我們學習和測試環境中,生産環境一般不會遇到這種問題。

通過檢視elasticsearch容器可以看到實際上每個pod上的jvm參數設定啟動記憶體和最大記憶體均為2g,加上metaspace等,建議在生産環境,運作elasticsearch的節點至少要保證elasticsearch pod有3g以上的記憶體。

2、軟體版本相容性問題

實驗過程中有嘗試過使用其他的鏡像搭配github上下載下傳的yaml檔案,最終證明了一切都是徒勞。

kibana和elasticsearch的版本要能對應的上,在本文中使用的都是5.6.4版本

在kubernetes叢集中部署efk

通過通路kibana的位址,看樣子是沒找到索引檔案。

實際上此問題的原因是fluentd鏡像的版本不配合,無法往elasticsearch叢集中寫入資料。

在kubernetes叢集中部署efk

網絡上有五花八門的配置文檔,在這裡建議使用github上最新版本的yaml檔案搭配yaml檔案中的鏡像,可以少走一些彎路。如果實在無法下載下傳到gcr.io上的鏡像,可以使用github上配套的dockerfile,自己build鏡像。

3、安全性問題

在本文中,elasticsearch的資料是通過emptydir方式儲存的,如果要在生産環境中使用,需要将資料存儲修改成其他的存儲方案。

kibana的通路形式在本文中是使用api-server的http接口,在生産環境中,需要使用其他方式實作。

4、耐心等待

需要足夠的耐心,在下載下傳image或者使用dockerfile build都需要較長的時間。elasticsearch和kibana初始化也需要20分鐘左右的等待時間。可以通過觀察pod的日志檢視整個過程是否存在異常。

鏡像及yaml檔案百度雲下載下傳位址

連結:https://pan.baidu.com/s/1snt75pr

密碼:wu3s

繼續閱讀