天天看点

在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

继续阅读