K8S搭建监控平台二之EFK(ElasticSearch + Filebeat + Kibana)

流程图

K8S搭建监控平台二之EFK(ElasticSearch + Filebeat + Kibana)

服务器可用资源 4 核 8G,Kubernetes 集群版本信息

K8S搭建监控平台二之EFK(ElasticSearch + Filebeat + Kibana)

源码

https://gitee.com/pingfanrenbiji/k8s/

创建命名空间

kubectl create -f create-logging-namespace.yaml

创建 ElasticSearch 集群

kubectl create -f es-service.yamlkubectl create -f es-statefulset.yaml

查看资源是否已创建

kubectl get service -n logging

K8S搭建监控平台二之EFK(ElasticSearch + Filebeat + Kibana)

kubectl get pods -n logging

K8S搭建监控平台二之EFK(ElasticSearch + Filebeat + Kibana)

部署 Kibana

kubectl create -f kibana-deployment.yaml kubectl create -f kibana-service.yaml

查看Kibana

kubectl get pod -n logging|grep kibana

K8S搭建监控平台二之EFK(ElasticSearch + Filebeat + Kibana)

查看Kibana Service

K8S搭建监控平台二之EFK(ElasticSearch + Filebeat + Kibana)

访问Kibana

http://10.1.2.190:32032/kibana/

K8S搭建监控平台二之EFK(ElasticSearch + Filebeat + Kibana)

安装helm

mkdir -p /tmp/helmcd /tmp/helmwget -O helm.tar.gz https://get.helm.sh/helm-v3.0.0-linux-amd64.tar.gztar zxvf helm.tar.gzsudo cp linux-amd64/helm /usr/bin/helm version若输出:version.BuildInfo{Version:"v3.0.0", GitCommit:"e29ce2a54e96cd02ccfce88bee4f58bb6e2a28b6", GitTreeState:"clean", GoVersion:"go1.13.4"},说明安装成功。初始化 Helmhelm repo add stable https://kubernetes-charts.storage.googleapis.com/

部署kafka 和 Logstash

cd k8s/efk-7.10.2/filebeathelm install zookeeper zookeeper/ -n logging # 安装 zookeeperkubectl get pods -n logging -l app.kubernetes.io/name=zookeeper

K8S搭建监控平台二之EFK(ElasticSearch + Filebeat + Kibana)

helm install kafka kafka/ -n logging # 安装 Kafkakubectl get pods -n logging -l app.kubernetes.io/component=kafka

当所有 Pod 都正常后,创建 logstash 服务

kubectl create -f logstash-service.yaml -f logstash-cm.yaml -f logstash.yaml -n logging

注意

logstash-cm.yaml 文件中的一些配置:input: 数据来源,本次示例配置的是 kafkainput.kafka.bootstrap_servers: kafka 的地址,由于是安装在集群内,可以直接使用 kafka 集群的 Service 接口,如果是外部地址,按需配置既可;input.kafka.topics: Kafka 的 topic,需要和 Filebeat 输出的 topic 一致;input.kafka.type: 定义一个 type,可以用于 logstash 输出至不同的 Elasticsearch 集群;output: 数据输出至哪里,本次示例输出至 Elasticsearch 集群,在里面配置了一个判断语句,当 type 为 filebeat-sidecar 时,将会输出至 Elasticsearch 集群,并且索引为 filebeat-xxx。注入 Filebeat Sidecar

当应用的日志没有输出到控制台,而是被输出到一个文件中时,此时可以使用 Filebeat 进行采集。以下示例会创建一个模拟程序,该程序会在 /opt/date.log 文件输出当前日志

``

cd k8s/efk-7.10.2/filebeatkubectl create -f app.yaml -n logging kubectl get configmap -n logging|grep filebeat

K8S搭建监控平台二之EFK(ElasticSearch + Filebeat + Kibana)

创建模拟程序

kubectl create -f app-filebeat.yaml -n logging

K8S搭建监控平台二之EFK(ElasticSearch + Filebeat + Kibana)

创建es索引

K8S搭建监控平台二之EFK(ElasticSearch + Filebeat + Kibana)

查询日志

K8S搭建监控平台二之EFK(ElasticSearch + Filebeat + Kibana)

最终pod情况

K8S搭建监控平台二之EFK(ElasticSearch + Filebeat + Kibana)

最终service情况

K8S搭建监控平台二之EFK(ElasticSearch + Filebeat + Kibana)

数据流转情况

K8S搭建监控平台二之EFK(ElasticSearch + Filebeat + Kibana)

这个pod中有2个docker程序 一个是filebeat一个应用程序,这个应用程序是往指定目录下写入日志。

查看pod yaml

kubectl edit pod app-b8677899d-h44gf -n logging

K8S搭建监控平台二之EFK(ElasticSearch + Filebeat + Kibana)

应用程序往/opt/date.log文件写入数据

K8S搭建监控平台二之EFK(ElasticSearch + Filebeat + Kibana)

该目录并没有做宿主机映射

K8S搭建监控平台二之EFK(ElasticSearch + Filebeat + Kibana)

filebeat从logpath目录下读取日志数据,并映射到/data/log/app/,从filebeatconf目录读取filebeat的配置文件。并映射到usr/share/filebeat/filebeat.yml

K8S搭建监控平台二之EFK(ElasticSearch + Filebeat + Kibana)

而logpath就是应用pod日志,并没有映射到宿主机上,filebeatconf表示读取宿主机上的filebeat.yml(configmap文件)映射到pod中usr/share/filebeat/filebeat.yml目录下。

K8S搭建监控平台二之EFK(ElasticSearch + Filebeat + Kibana)

configmap的内容读取pod中/data/log/xxxx.log日志文件,存储到kafka中。

查看应用产生的日志

kubectl exec -ti -n logging app-b8677899d-h44gf -- tail -1 /data/log/app/date.log

K8S搭建监控平台二之EFK(ElasticSearch + Filebeat + Kibana)

进入kafka中

K8S搭建监控平台二之EFK(ElasticSearch + Filebeat + Kibana)

验证是否收到filebeat传送过来的数据

监听kafaka消息队列

cd /opt/bitnami/kafka/binsh kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic filebeat-sidecar --from-beginning

K8S搭建监控平台二之EFK(ElasticSearch + Filebeat + Kibana)

应用pod中的filebeat进程可以读取到应用进程产生的日志,并可以正常穿给kafka中的消息队列中并且可以由消费者消费。

kafka消息了之后,发送给logstach进行处理并发给es

K8S搭建监控平台二之EFK(ElasticSearch + Filebeat + Kibana)

logstach的输入是kafka消息,输出是es,es中的数据再由kibana展示出来。