本文将介绍在kubernetes 1.9集群下配置elasticsearch、fluentd、kibana集中收集k8s集群日志信息。俗称EFK,其中elasticsearch负责存储日志。fluentd负责将集群中docker主机上的日志发送给elasticsearch,所以fluentd在k8s集群中须要以daemonset的方式运行。kibana负责图形化展现日志信息。java
1、环境介绍
软件环境:
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.4node
Master节点:
主机名:vm1
IP地址:192.168.115.5/24git
Node节点:
主机名:vm2
IP地址:192.168.115.6/24
2、下载yaml文件和elasticsearch、fluentd、kibana对应版本的镜像。
镜像的下载须要使用方式实现。
Yaml文件下载地址:
https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/fluentd-elasticsearchgithub
# 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
3、经过下载好的yaml文件建立configmap、service、serviceaccount、clusterrole以及deployment等
经过dashboard面板上能够看到fluentd在vm1和vm2上都有运行。
到这里为止,看上去一切好像都挺正常的。但是过来一会elasticsearch-loggin-0、elasticsearch-loggin-1两个pod不断的restart, vmware的终端console上能够看出是由于java的oom引发的
此时笔记本的内存已消耗90%、磁盘活动时间已达100%。即便硬盘是pcie的ssd也经不起这样折腾。
若是把es-statefulset.yaml的replicas参数修改成1,内存是将将够,可是elasticsearch集群又是断腿的,运行不起来。docker
# kubectl logs elasticsearch-logging-0 -n kube-system
既然笔记本资源不足,为了完成这个实验。只好选择使用台式机了,幸亏个人台式机有16G的内存,SSD硬盘也够放的下虚拟机文件。api
4、将vm1和vm2虚拟机文件从笔记本中复制到台式机后启动k8s集群,并进行重建。
观察了一会,发现全部的pod状态都正常,不会出现oom问题自动restart
5、访问kibana和elasticsearch验证
接下来咱们临时开启api-server http协议的8888端口,用于测试kibana的访问安全
# kubectl proxy --address='192.168.115.5' --port=8888 --accept-hosts='^*$' &
访问地址:
http://192.168.115.5:8888/api/v1/proxy/namespaces/kube-system/services/kibana-logging/
经过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
查看elasticsearch集群的健康状态、索引和节点信息curl
# 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
到目前为止,咱们实现了在k8s集群中使用efk进行日志的集中管理。jvm
6、一些问题
一、Elasticsearch java oom问题
这个在前文已经说明过了,解决方案只有加资源一条路。
这问题通常出如今咱们学习和测试环境中,生产环境通常不会遇到这种问题。
经过查看elasticsearch容器能够看到实际上每一个pod上的jvm参数设置启动内存和最大内存均为2g,加上metaspace等,建议在生产环境,运行elasticsearch的节点至少要保证elasticsearch pod有3g以上的内存。
二、软件版本兼容性问题
实验过程当中有尝试过使用其余的镜像搭配github上下载的yaml文件,最终证实了一切都是徒劳。
Kibana和elasticsearch的版本要能对应的上,在本文中使用的都是5.6.4版本
经过访问kibana的地址,看样子是没找到索引文件。
实际上此问题的缘由是fluentd镜像的版本不配合,没法往elasticsearch集群中写入数据。
网络上有五花八门的配置文档,在这里建议使用github上最新版本的yaml文件搭配yaml文件中的镜像,能够少走一些弯路。若是实在没法下载到gcr.io上的镜像,可使用github上配套的dockerfile,本身build镜像。
三、安全性问题
在本文中,elasticsearch的数据是经过emptyDir方式保存的,若是要在生产环境中使用,须要将数据存储修改为其余的存储方案。
Kibana的访问形式在本文中是使用api-server的http接口,在生产环境中,须要使用其余方式实现。
四、耐心等待
须要足够的耐心,在下载image或者使用dockerfile build都须要较长的时间。elasticsearch和kibana初始化也须要20分钟左右的等待时间。能够经过观察pod的日志查看整个过程是否存在异常。
镜像及yaml文件百度云下载地址
连接:https://pan.baidu.com/s/1snt75Pr 密码:wu3s