本文将介绍在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

# mkdir efk
# cd efk/
# wget  \
https://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/fluentd-elasticsearch/es-statefulset.yaml
# wget  \
https://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/fluentd-elasticsearch/es-service.yaml
# wget  \
https://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/fluentd-elasticsearch/fluentd-es-configmap.yaml
# wget  \
https://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/fluentd-elasticsearch/fluentd-es-ds.yaml
# wget  \
https://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/fluentd-elasticsearch/kibana-service.yaml
# wget  \
https://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/fluentd-elasticsearch/kibana-deployment.yaml

三、通过下载好的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集群又是断腿的,运行不起来。

# kubectl logs elasticsearch-logging-0  -n kube-system

在kubernetes集群中部署efk
既然笔记本资源不足,为了完成这个实验。只好选择使用台式机了,幸好我的台式机有16G的内存,SSD硬盘也够放的下虚拟机文件。

四、将vm1和vm2虚拟机文件从笔记本中复制到台式机后启动k8s集群,并进行重建。
在kubernetes集群中部署efk
观察了一会,发现所有的pod状态都正常,不会出现oom问题自动restart
在kubernetes集群中部署efk
在kubernetes集群中部署efk
五、访问kibana和elasticsearch验证
接下来我们临时开启api-server http协议的8888端口,用于测试kibana的访问

# kubectl  proxy --address='192.168.115.5' --port=8888 --accept-hosts='^*$' &

在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容器

# kubectl exec -it curl -n kube-system /bin/sh
# curl http://elasticsearch-logging:9200
# curl -XGET http://elasticsearch-logging:9200/_cat

在kubernetes集群中部署efk
查看elasticsearch集群的健康状态、索引和节点信息

# curl -XGET http://elasticsearch-logging:9200/_cluster/health?pretty=true
# curl -XGET http://elasticsearch-logging:9200/_cat/indices?v
# curl -XGET http://elasticsearch-logging:9200/_cat/nodes?v

在kubernetes集群中部署efk
到目前为止,我们实现了在k8s集群中使用efk进行日志的集中管理。

六、一些问题
1、Elasticsearch java oom问题
这个在前文已经说明过了,解决方案只有加资源一条路。
这问题一般出现在我们学习和测试环境中,生产环境一般不会遇到这种问题。
通过查看elasticsearch容器可以看到实际上每个pod上的jvm参数设置启动内存和最大内存均为2g,加上metaspace等,建议在生产环境,运行elasticsearch的节点至少要保证elasticsearch pod有3g以上的内存。

2、软件版本兼容性问题
由于gcr.io网站被墙,***下载又不是很快,因此在实验过程中有尝试过使用其他的镜像搭配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