fox111 发表于 2018-9-15 13:19:57

在kubernetes集群中部署efk-ylw6006

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


  二、下载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等

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

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


  既然笔记本资源不足,为了完成这个实验。只好选择使用台式机了,幸好我的台式机有16G的内存,SSD硬盘也够放的下虚拟机文件。
  四、将vm1和vm2虚拟机文件从笔记本中复制到台式机后启动k8s集群,并进行重建。

  观察了一会,发现所有的pod状态都正常,不会出现oom问题自动restart


  五、访问kibana和elasticsearch验证
  接下来我们临时开启api-server http协议的8888端口,用于测试kibana的访问
  

# kubectlproxy --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 -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进行日志的集中管理。
  六、一些问题
  1、Elasticsearch java oom问题
  这个在前文已经说明过了,解决方案只有加资源一条路。
  这问题一般出现在我们学习和测试环境中,生产环境一般不会遇到这种问题。
  通过查看elasticsearch容器可以看到实际上每个pod上的jvm参数设置启动内存和最大内存均为2g,加上metaspace等,建议在生产环境,运行elasticsearch的节点至少要保证elasticsearch pod有3g以上的内存。
  2、软件版本兼容性问题
  由于gcr.io网站被墙,***下载又不是很快,因此在实验过程中有尝试过使用其他的镜像搭配github上下载的yaml文件,最终证明了一切都是徒劳。
  Kibana和elasticsearch的版本要能对应的上,在本文中使用的都是5.6.4版本

  通过访问kibana的地址,看样子是没找到索引文件。
  实际上此问题的原因是fluentd镜像的版本不配合,无法往elasticsearch集群中写入数据。

  网络上有五花八门的配置文档,在这里建议使用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


页: [1]
查看完整版本: 在kubernetes集群中部署efk-ylw6006