kubernetes集群日志收集ELK


ELK,分别指Elastic公司的Elasticsearch、Logstash、Kibana。在比较旧的ELK架构中,Logstash身兼日志的采集、过滤两职。但由于Logstash基于JVM,性能有一定限制,因此,目前业界更推荐使用Go语言开发FIiebeat代替Logstash的采集功能,Logstash只作为了日志过滤的中间件。

ELK架构


在这里插入图片描述
角色功能如下:

  • 多个Filebeat在各个业务端进行日志采集,然后上传至Logstash
  • 多个Logstash节点并行(负载均衡,不作为集群),对日志记录进行过滤处理,然后上传至Elasticsearch集群
  • 多个Elasticsearch构成集群服务,提供日志的索引和存储能力
  • Kibana负责对Elasticsearch中的日志数据进行检索、分析
    根据业务特点,还可以加入某些中间件,如Redis、Kafak等:
    在这里插入图片描述
    Kafka集群作为消息缓冲队列,可以降低大量FIlebeat对Logstash的并发访问压力。

日志采集方式


使用ELK+Filebeat架构,还需要明确Filebeat采集K8S集群日志的方式。

方式1:Node级日志代理

在每个节点(即宿主机)上可以独立运行一个Node级日志代理,通常的实现方式为DaemonSet。用户应用只需要将日志写到标准输出,Docker 的日志驱动会将每个容器的标准输出收集并写入到主机文件系统,这样Node级日志代理就可以将日志统一收集并上传。另外,可以使用K8S的logrotate或Docker 的log-opt 选项负责日志的轮转。
在这里插入图片描述
Docker默认的日志驱动(LogDriver)是json-driver,其会将日志以JSON文件的方式存储。所有容器输出到控制台的日志,都会以*-json.log的命名方式保存在/var/lib/docker/containers/目录下。对于Docker日志驱动的具体介绍,请参考官方文档。另外,除了收集Docker容器日志,一般建议同时收集K8S自身的日志以及宿主机的所有系统日志,其位置都在var/log下。

所以,简单来说,本方式就是在每个node上各运行一个日志代理容器,对本节点/var/log和 /var/lib/docker/containers/两个目录下的日志进行采集,然后汇总到elasticsearch集群,最后通过kibana展示。

方式2:伴生容器(sidecar container)作为日志代理

创建一个伴生容器(也可称作日志容器),与应用程序容器在处于同一个Pod中。同时伴生容器内部运行一个独立的、专门为收集应用日志的代理,常见的有Logstash、Fluentd 、Filebeat等。日志容器通过共享卷可以获得应用容器的日志,然后进行上传。

在这里插入图片描述

方式3:应用直接上传日志

应用程序容器直接通过网络连接上传日志到后端,这是最简单的方式。
在这里插入图片描述

对比

在这里插入图片描述
相对来说,方式1在业界使用更为广泛,并且官方也更为推荐。因此,最终我们采用ELK+Filebeat架构,并基于方式1,如下:
在这里插入图片描述

部署


目前相关的文件已经上传github直接可以下载用:

部署文件下载

 git clone https://github.com/hkj123/kubernetes-elk.git
 cd kubernetes-elk
 创建 logging namespace
 kubectl apply -f logging-namespace.yaml

kubectl 基本操作命令总结

创建service    
kubectl create -f service.yaml
查看创建的service当后端代理的pod的ip  
get endpoints my-service
查找目录下的所有文件中是否含有某个字符串
find .|xargs grep -ri "xxxx"
更新对象
kubectl replace -f <filename|url>
删除对象
kubectl delete -f <filename|url>
浏览对象
kubectl get -f <filename|url> -o yaml
加载对象
kubectl apply -f <filename|url> 
查看名称空间   
kubectl get namespaces
查看创建的service
kubectl get svc --all-namespaces
kubectl describe pod name
查看目前所有的deployment
kubectl get deployment --all-namespaces
kubectl describe deployment name
查看目前所有的replica set
kubectl get rs --all-namespaces
kubectl describe rs name
查看目前所有的pod
kubectl get pods --all-namespaces
kubectl describe pod name
查看具体的日志
kubectl --namespace=logging logs name
kubectl logs name

部署elastisearch

# 本次部署虽然使用 StatefulSet 但是没有使用pv进行持久化数据存储
# pod重启之后,数据会丢失,生产环境一定要使用pv持久化存储数据

# 部署elasticsearch
kubectl apply -f elasticsearch.yaml
# 查看状态
kubectl get pods,svc -n logging -o wide

[root@saas98 ~]$ kubectl get pod --namespace=logging
NAME                              READY   STATUS    RESTARTS   AGE
elasticsearch-logging-0           1/1     Running   0          3d23h
elasticsearch-logging-1           1/1     Running   0          3d23h

# 等待所有pod变成running状态 
# 访问测试
# 如果测试都有数据返回代表部署成功
kubectl run curl -n logging --image=radial/busyboxplus:curl -i --tty
nslookup elasticsearch-logging
curl 'http://elasticsearch-logging:9200/_cluster/health?pretty'
curl 'http://elasticsearch-logging:9200/_cat/nodes'
exit

# 清理测试
kubectl delete deploy curl -n logging

部署kibana

# 部署
kubectl apply -f kibana.yaml

# 查看状态
kubectl get pods,svc -n logging -o wide

[root@saas98 ~]$ kubectl get pod --namespace=logging
NAME                              READY   STATUS    RESTARTS   AGE
elasticsearch-logging-0           1/1     Running   0          3d23h
elasticsearch-logging-1           1/1     Running   0          3d23h
kibana-logging-5df7d57b77-wmm2d   1/1     Running   0          3d23h

部署filebeat收集日志

# 部署
kubectl apply -f filebeat.yaml

[root@saas98 ~]$ kubectl get pod --namespace=logging
NAME                              READY   STATUS    RESTARTS   AGE
elasticsearch-logging-0           1/1     Running   0          3d23h
elasticsearch-logging-1           1/1     Running   0          3d23h
filebeat-kjvxb                    1/1     Running   0          2d5h
filebeat-rm426                    1/1     Running   0          2d5h
filebeat-sbhzz                    1/1     Running   0          2d5h
filebeat-whrxq                    1/1     Running   0          2d5h
kibana-logging-5df7d57b77-wmm2d   1/1     Running   0          3d23h

kibana查看日志

http://118.31.17.205:32256/

创建index fluentd-*,由于需要拉取镜像启动容器,可能需要等待几分钟才能看到索引和数据
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

参考


https://blog.csdn.net/java_zyq/article/details/82179175
https://www.jianshu.com/p/604a7149a632

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Kubernetes是一个用于容器编排和管理的开源平台,而ELK是一套用于日志分析和可视化的工具组合,包括Elasticsearch、Logstash和Kibana。在Kubernetes集群中部署ELK的目的是为了对集群中的日志信息进行收集、存储、分析和展示。 首先,我们需要为ELK组件创建Kubernetes Deployment和Service对象。Deployment定义了应用的副本数量和升级策略,Service提供了一个稳定的网络入口。 然后,我们需要为Elasticsearch、Logstash和Kibana分别创建Pod模板。Pod是Kubernetes中最小的可部署的单元,包含了一个或多个容器。Elasticsearch是用于存储和索引日志的分布式搜索引擎,Logstash用于收集、转换和发送日志数据,Kibana提供了可视化和查询界面。 在Pod模板中,我们需要指定每个容器的镜像、环境变量、容器端口等信息。特别注意的是,在Elasticsearch配置中,我们需要指定节点的名称、集群名称和持久化存储的挂载路径。 接下来,我们需要为每个组件创建Kubernetes Service对象,以便在集群内进行服务发现和负载均衡。Service会为每个Pod分配一个稳定的虚拟IP地址,并将这些地址与Service的名称关联起来。 最后,我们需要为Elasticsearch集群配置存储卷,以便持久化存储数据。Kubernetes支持多种存储卷类型,例如本地存储、网络存储和云存储等。 完成上述步骤后,我们就可以在Kubernetes集群中部署ELK。在部署过程中,Kubernetes会根据我们定义的Deployment和Service对象,自动调度和管理ELK组件的副本数量、网络和存储等资源。这样,我们就可以通过Kibana访问ELK集群,对日志进行搜索、过滤和可视化展示,实现集群日志的实时监控和分析。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值