0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Kubernetes如何在各个服务器上搜集日志后传输给Logstash

马哥Linux运维 来源:马哥Linux运维 作者:马哥Linux运维 2022-09-19 10:57 次阅读

一、概述

ELK 是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是开源软件。新增了一个 FileBeat,它是一个轻量级的日志收集处理工具 (Agent),Filebeat 占用资源少,适合于在各个服务器上搜集日志后传输给 Logstash,官方也推荐此工具。

大致流程图如下:

fcb4135a-373d-11ed-ba43-dac502259ad0.png

1)Elasticsearch 存储

Elasticsearch 是个开源分布式搜索引擎,提供搜集、分析、存储数据三大功能。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful 风格接口,多数据源,自动搜索负载等。

2)Filebeat 日志数据采集

filebeat 是 Beats 中的一员,Beats 在是一个轻量级日志采集器,其实 Beats 家族有 6 个成员,早期的 ELK 架构中使用 Logstash 收集、解析日志,但是 Logstash 对内存、cpu、io 等资源消耗比较高。相比 Logstash,Beats 所占系统的 CPU 和内存几乎可以忽略不计。

Filebeat 是用于转发和集中日志数据的轻量级传送工具。Filebeat 监视您指定的日志文件或位置,收集日志事件。

目前 Beats 包含六种工具:

Packetbeat网络数据(收集网络流量数据)

Metricbeat:指标(收集系统、进程和文件系统级别的 CPU 和内存使用情况等数据)

Filebeat:日志文件(收集文件数据)

Winlogbeat:windows 事件日志(收集 Windows 事件日志数据)

Auditbeat:审计数据(收集审计日志)

Heartbeat:运行时间监控(收集系统运行时的数据)

工作的流程图如下:

fcc5cba4-373d-11ed-ba43-dac502259ad0.png

优点

Filebeat 只是一个二进制文件没有任何依赖。它占用资源极少。

缺点

Filebeat 的应用范围十分有限,因此在某些场景下咱们会碰到问题。在 5.x 版本中,它还具有过滤的能力。

3)Kafka

kafka 能帮助我们削峰。ELK 可以使用 redis 作为消息队列,但 redis 作为消息队列不是强项而且 redis 集群不如专业的消息发布系统 kafka。kafka 安装可以参考我之前的文章:Kafka 原理介绍+安装+基本操作(kafka on k8s)[1]。

4)Logstash 过滤

Logstash 主要是用来日志的搜集、分析、过滤日志的工具,支持大量的数据获取方式。一般工作方式为 c/s 架构,client 端安装在需要收集日志的主机上,server 端负责将收到的各节点日志进行过滤、修改等操作在一并发往 elasticsearch 上去。

优点

可伸缩性

节拍应该在一组 Logstash 节点之间进行负载平衡。建议至少使用两个 Logstash 节点以实现高可用性。每个 Logstash 节点只部署一个 Beats 输入是很常见的,但每个 Logstash 节点也可以部署多个 Beats 输入,以便为不同的数据源公开独立的端点。

弹性

Logstash 持久队列提供跨节点故障的保护。对于 Logstash 中的磁盘级弹性,确保磁盘冗余非常重要。对于内部部署,建议您配置 RAID。在云或容器化环境中运行时,建议您使用具有反映数据 SLA 的复制策略的永久磁盘。

可过滤

对事件字段执行常规转换。您可以重命名,删除,替换和修改事件中的字段。

缺点

Logstash 耗资源较大,运行占用 CPU 和内存高。另外没有消息队列缓存,存在数据丢失隐患。

5)Kibana 展示

Kibana 也是一个开源和免费的工具,Kibana 可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助汇总、分析和搜索重要数据日志。

filebeat 和 logstash 的关系

因为 logstash 是 jvm 跑的,资源消耗比较大,所以后来作者又用 golang 写了一个功能较少但是资源消耗也小的轻量级的 logstash-forwarder。不过作者只是一个人,加入 http://elastic.co 公司以后,因为 es 公司本身还收购了另一个开源项目 packetbeat,而这个项目专门就是用 golang 的,有整个团队,所以 es 公司干脆把 logstash-forwarder 的开发工作也合并到同一个 golang 团队来搞,于是新的项目就叫 filebeat 了。

二、helm3 安装 ELK

详细流程图如下:

fcdd1836-373d-11ed-ba43-dac502259ad0.png

1)准备条件

1、添加 helm 仓库

$helmrepoaddelastichttps://helm.elastic.co

2)helm3 安装 elasticsearch

1、自定义 values

主要是设置 storage Class 持久化和资源限制,本人电脑资源有限,所以这里就把资源调小了很多,小伙伴们可以根据自己配置自定义哈。

#集群名称
clusterName:"elasticsearch"
#ElasticSearch6.8+默认安装了x-pack插件,部分功能免费,这里选禁用
esConfig:
elasticsearch.yml:|
network.host:0.0.0.0
cluster.name:"elasticsearch"
xpack.security.enabled:false
resources:
requests:
memory:1Gi
volumeClaimTemplate:
storageClassName:"bigdata-nfs-storage"
accessModes:["ReadWriteOnce"]
resources:
requests:
storage:3Gi
service:
type:NodePort
port:9000
nodePort:31311

禁用 Kibana 安全提示(Elasticsearch built-in security features are not enabled)xpack.security.enabled: false

2、开始安装 Elasitcsearch

安装过程比较慢,因为官方镜像下载比较慢

$helminstalleselastic/elasticsearch-fmy-values.yaml--namespacebigdata
fcefb8a6-373d-11ed-ba43-dac502259ad0.png
W12072357.98028321465warnings.go:70]policy/v1beta1PodDisruptionBudgetisdeprecatedinv1.21+,unavailableinv1.25+;usepolicy/v1PodDisruptionBudget
W12072358.01541621465warnings.go:70]policy/v1beta1PodDisruptionBudgetisdeprecatedinv1.21+,unavailableinv1.25+;usepolicy/v1PodDisruptionBudget
NAME:es
LASTDEPLOYED:TueDec723572021
NAMESPACE:bigdata
STATUS:deployed
REVISION:1
NOTES:
1.Watchallclustermemberscomeup.
$kubectlgetpods--namespace=bigdata-lapp=elasticsearch-master-w2.TestclusterhealthusingHelmtest.
$helm--namespace=bigdatatestes

查看,需要所有 pod 都正常运行才正常,下载镜像有点慢,需要稍等一段时间再查看

$kubectlgetpod-nbigdata-lapp=elasticsearch-master
$kubectlgetpvc-nbigdata
$watchkubectlgetpod-nbigdata-lapp=elasticsearch-master
fcfcb9ca-373d-11ed-ba43-dac502259ad0.png

3、验证

$helm--namespace=bigdatatestes
$kubectlgetpod,svc-nbigdata-lapp=elasticsearch-master-owide
$curl192.168.0.113:31311/_cat/health
$curl192.168.0.113:31311/_cat/nodes
fd112f72-373d-11ed-ba43-dac502259ad0.png

4、清理

$helmuninstalles-nbigdata
$kubectldeletepvcelasticsearch-master-elasticsearch-master-0-nbigdata
$kubectldeletepvcelasticsearch-master-elasticsearch-master-1-nbigdata
$kubectldeletepvcelasticsearch-master-elasticsearch-master-2-nbigdata

3)helm3 安装 Kibana

1、自定义 values

域名(elasticsearch-master-headless.bigdata.svc.cluster.local)的由来不清楚的,可以参考我之前的文章:Kubernetes(k8s)DNS(CoreDNS)介绍[2]

$cat<my-values.yaml
#此处修改了kibana的配置文件,默认位置/usr/share/kibana/kibana.yaml
kibanaConfig:
kibana.yml:|
server.port:5601
server.host:"0.0.0.0"
elasticsearch.hosts:["elasticsearch-master-headless.bigdata.svc.cluster.local:9200"]
resources:
requests:
cpu:"1000m"
memory:"256Mi"
limits:
cpu:"1000m"
memory:"1Gi"
service:
#type:ClusterIP
type:NodePort
loadBalancerIP:""
port:5601
nodePort:"30026"
EOF

2、开始安装 Kibana

$helminstallkibanaelastic/kibana-fmy-values.yaml--namespacebigdata
fd21de62-373d-11ed-ba43-dac502259ad0.png

3、验证

$kubectlgetpod,svc-nbigdata-lapp=kibana

浏览器访问:http://192.168.0.113:30026/

fd2ec794-373d-11ed-ba43-dac502259ad0.pngfd3ea524-373d-11ed-ba43-dac502259ad0.png

4、清理

$helmuninstallkibana-nbigdata

4)helm3 安装 Filebeat

filebeat 默认收集宿主机上 docker 的日志路径:/var/lib/docker/containers。如果我们修改了 docker 的安装路径要怎么收集呢,很简单修改 chart 里的 DaemonSet 文件里边的 hostPath 参数

-name:varlibdockercontainers
hostPath:
path:/var/lib/docker/containers#改为docker安装路径

当然也可以自定义 values 修改,这里推荐自定义 values 方式修改采集日志路径

1、自定义 values

默认是将数据存储到 ES,这里做修改数据存储到 Kafka

$cat<my-values.yaml
daemonset:
filebeatConfig:
filebeat.yml:|
filebeat.inputs:
-type:container
paths:
-/var/log/containers/*.log

output.elasticsearch:
enabled:false
host:'${NODE_NAME}'
hosts:'${ELASTICSEARCH_HOSTS9200}'
output.kafka:
enabled:true
hosts:["kafka-headless.bigdata.svc.cluster.local:9092"]
topic:test
EOF

2、开始安装 Filefeat

$helminstallfilebeatelastic/filebeat-fmy-values.yaml--namespacebigdata
$kubectlgetpods--namespace=bigdata-lapp=filebeat-filebeat-w
fd4fe79e-373d-11ed-ba43-dac502259ad0.pngfd5e3754-373d-11ed-ba43-dac502259ad0.png

3、验证

#先登录kafka客户端
$kubectlexec--tty-ikafka-client--namespacebigdata--bash
#再消费数据
$kafka-console-consumer.sh--bootstrap-serverkafka.bigdata.svc.cluster.local:9092--topictest
fd723b28-373d-11ed-ba43-dac502259ad0.png

看到已经可以消费数据了,说明数据已经存储到 kafka 了。

查看 kafka 数据积压情况

$kubectlexec--tty-ikafka-client--namespacebigdata--bash
$kafka-consumer-groups.sh--bootstrap-serverkafka-0.kafka-headless.bigdata.svc.cluster.local:9092--describe--groupmygroup

发现大量数据都是处于积压的状态

fd897bb2-373d-11ed-ba43-dac502259ad0.png

接下来就是部署 logstash 去消费 kafka 数据,最后存储到 ES。

4、清理

$helmuninstallfilebeat-nbigdata

5)helm3 安装 Logstash

1、自定义 values

【注意】记得把 ES 和 kafka 的地址换成自己环境的。

$cat<my-values.yaml
logstashConfig:
logstash.yml:|
xpack.monitoring.enabled:false

logstashPipeline:
logstash.yml:|
input{
kafka{
bootstrap_servers=>"kafka-headless.bigdata.svc.cluster.local:9092"
topics=>["test"]
group_id=>"mygroup"
#如果使用元数据就不能使用下面的byte字节序列化,否则会报错
#key_deserializer_class=>"org.apache.kafka.common.serialization.ByteArrayDeserializer"
#value_deserializer_class=>"org.apache.kafka.common.serialization.ByteArrayDeserializer"
consumer_threads=>1
#默认为false,只有为true的时候才会获取到元数据
decorate_events=>true
auto_offset_reset=>"earliest"
}
}
filter{
mutate{
#从kafka的key中获取数据并按照逗号切割
split=>["[@metadata][kafka][key]",","]
add_field=>{
#将切割后的第一位数据放入自定义的“index”字段中
"index"=>"%{[@metadata][kafka][key][0]}"
}
}
}
output{
elasticsearch{
pool_max=>1000
pool_max_per_route=>200
hosts=>["elasticsearch-master-headless.bigdata.svc.cluster.local:9200"]
index=>"test-%{+YYYY.MM.dd}"
}
}

#资源限制
resources:
requests:
cpu:"100m"
memory:"256Mi"
limits:
cpu:"1000m"
memory:"1Gi"

volumeClaimTemplate:
accessModes:["ReadWriteOnce"]
resources:
requests:
storage:3Gi
EOF

output plugin 输出插件,将事件发送到特定目标:

stdout { codec => rubydebug } // 开启 debug 模式,可在控制台输出

stdout :标准输出。将事件输出到屏幕上

output{
    stdout{
        codec => "rubydebug"
    }
}

file :将事件写入文件

output{
   file {
       path => "/data/logstash/%{host}/{application}
       codec => line { format => "%{message}"} }
    }
}

kafka :将事件发送到 kafka

output{
   kafka{
        bootstrap_servers => "localhost:9092"
        topic_id => "test_topic"  #必需的设置。生成消息的主题
    }
}

elasticseach :在 es 中存储日志

output{
   elasticsearch {
        #user => elastic
        #password => changeme
        hosts => "localhost:9200"
        index => "nginx-access-log-%{+YYYY.MM.dd}"  
    }
}

2、开始安装 Logstash

$helminstalllogstashelastic/logstash-fmy-values.yaml--namespacebigdata
fd980772-373d-11ed-ba43-dac502259ad0.png
$kubectlgetpods--namespace=bigdata-lapp=logstash-logstash
fdbae346-373d-11ed-ba43-dac502259ad0.png

3、验证

1、登录 kibana 查看索引是否创建

fdc8c772-373d-11ed-ba43-dac502259ad0.png

2、查看 logs

$kubectllogs-flogstash-logstash-0-nbigdata>logs
$tail-100logs
fdda2120-373d-11ed-ba43-dac502259ad0.png

3、查看 kafka 消费情况

$kubectlexec--tty-ikafka-client--namespacebigdata--bash
$kafka-consumer-groups.sh--bootstrap-serverkafka-0.kafka-headless.bigdata.svc.cluster.local:9092--describe--groupmygroup
fdf078bc-373d-11ed-ba43-dac502259ad0.png

4、通过 kibana 查看索引数据(Kibana 版本:7.15.0) 创建索引模式

Management-》Stack Management-》Kibana-》Index patterns

fe05b7ae-373d-11ed-ba43-dac502259ad0.pngfe182c68-373d-11ed-ba43-dac502259ad0.pngfe24e246-373d-11ed-ba43-dac502259ad0.png

通过上面创建的索引模式查询数据(Discover)

fe38dc1a-373d-11ed-ba43-dac502259ad0.pngfe4f0486-373d-11ed-ba43-dac502259ad0.png

4、清理

$helmuninstalllogstash-nbigdata

三、ELK 相关的备份组件和备份方式

Elasticsearch 备份两种方式:

将数据导出成文本文件,比如通过elasticdump[3]、esm[4]等工具将存储在 Elasticsearch 中的数据导出到文件中。适用数据量小的场景

备份 elasticsearch data 目录中文件的形式来做快照,借助 Elasticsearch 中 snapshot 接口实现的功能。适用大数据量的场景

1)Elasticsearch 的 snapshot 快照备份

优点:通过 snapshot 拍摄快照,然后定义快照备份策略,能够实现快照自动化存储,可以定义各种策略来满足自己不同的备份

缺点:还原不够灵活,拍摄快照进行备份很快,但是还原的时候没办法随意进行还原,类似虚拟机快照

1、配置备份目录

在 elasticsearch.yml 的配置文件中注明可以用作备份路径 path.repo ,如下所示:

path.repo:["/mount/backups","/mount/longterm_backups"]

配置好后,就可以使用 snapshot api 来创建一个 repository 了,如下我们创建一个名为 my_backup 的 repository。

PUT/_snapshot/my_backup
{
"type":"fs",
"settings":{
"location":"/mount/backups/my_backup"
}
}

2、开始通过 API 接口备份

有了 repostiroy 后,我们就可以做备份了,也叫快照,也就是记录当下数据的状态。如下所示我们创建一个名为snapshot_1的快照。

PUT/_snapshot/my_backup/snapshot_1?wait_for_completion=true

【温馨提示】wait_for_completion 为 true 是指该 api 在备份执行完毕后再返回结果,否则默认是异步执行的,我们这里为了立刻看到效果,所以设置了该参数,线上执行时不用设置该参数,让其在后台异步执行即可。

3、增量备份

PUT/_snapshot/my_backup/snapshot_2?wait_for_completion=true

当执行完毕后,你会发现 /mount/backups/my_backup 体积变大了。这说明新数据备份进来了。要说明的一点是,当你在同一个 repository 中做多次 snapshot 时,elasticsearch 会检查要备份的数据 segment 文件是否有变化,如果没有变化则不处理,否则只会把发生变化的 segment file 备份下来。这其实就实现了增量备份。

4、数据恢复

通过调用如下 api 即可快速实现恢复功能:

POST/_snapshot/my_backup/snapshot_1/_restore?wait_for_completion=true
{
"indices":"index_1",
"rename_replacement":"restored_index_1"
}

2)elasticdump 备份迁移 es 数据

索引数据导出为文件(备份)

#导出索引Mapping数据
$elasticdump
--input=http://es实例IP:9200/index_name/index_type
--output=/data/my_index_mapping.json#存放目录
--type=mapping
#导出索引数据
$elasticdump
--input=http://es实例IP:9200/index_name/index_type
--output=/data/my_index.json
--type=data

索引数据文件导入至索引(恢复)

#Mapping数据导入至索引
$elasticdump
--output=http://es实例IP:9200/index_name
--input=/home/indexdata/roll_vote_mapping.json#导入数据目录
--type=mapping
#ES文档数据导入至索引
$elasticdump
--output=http:///es实例IP:9200/index_name
--input=/home/indexdata/roll_vote.json
--type=data

可直接将备份数据导入另一个 es 集群

$elasticdump--input=http://127.0.0.1:9200/test_event--output=http://127.0.0.2:9200/test_event--type=data

type 类型

type 是 ES 数据导出导入类型,Elasticdump 工具支持以下数据类型:

type 类型 说明
mapping ES 的索引映射结构数据
data ES 的数据
settings ES 的索引库默认配置
analyzer ES 的分词器
template ES 的模板结构数据
alias ES 的索引别名

3)esm 备份迁移 es 数据

备份 es 数据

$esm-shttp://10.33.8.103:9201-x"petition_data"-b5--count=5000--sliced_scroll_size=10--refresh-o=./es_backup.bin

-w 表示线程数 -b 表示一次 bulk 请求数据大小,单位 MB 默认 5M -c 一次 scroll 请求数量 导入恢复 es 数据

$esm-dhttp://172.16.20.20:9201-y"petition_data6"-c5000-b5--refresh-i=./dump.bin

四、彩蛋

还有个日志系统架构跟 ELK 架构很相似(Elasticsearch、Flume、Kafka、Flink、Kibana),只是把 Filebeat 换成了 Flume,Logstash 换成了 Flink。后面也会写篇文章分享出来,请耐心等待……

fe6515aa-373d-11ed-ba43-dac502259ad0.png  

审核编辑:彭静
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 开源软件
    +关注

    关注

    0

    文章

    210

    浏览量

    15900
  • 服务器
    +关注

    关注

    12

    文章

    9119

    浏览量

    85312
  • kubernetes
    +关注

    关注

    0

    文章

    224

    浏览量

    8709

原文标题:如何在 Kubernetes 下快速构建企业级云原生日志系统

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    服务器远程不服务器怎么办?服务器无法远程的原因是什么?

    运营商。 2.服务器网络问题 解决办法:通过路由图来确定是哪里的线路出现丢包,联系服务器商切换线路。 二、服务器问题 服务器带宽跑满、服务器
    发表于 02-27 16:21

    再次升级!阿里云Kubernetes日志解决方案

    服务器,获取新的或已更新的配置并进行热加载。Logtail根据配置信息采集各个容器(POD)的标准输出或日志文件。最终Logtail将处理、聚合好的数据发送到
    发表于 05-28 19:08

    何在linux服务器使用hanlp

    `关于如何在linux服务器使用hanlp也有分享过一篇,但分享的内容与湘笑的这篇还是不同的。此处分享一下湘笑的这篇hanlp在linux服务器
    发表于 03-04 10:29

    Kubernetes平台中的日志收集方案

    十、Kubernetes平台中日志收集
    发表于 11-04 09:19

    如何安装logstash

    ELK实时日志分析平台搭建(四)安装logstash
    发表于 05-22 10:16

    何在Ota服务器安装JDK版本呢

    何在Ota服务器安装JDK版本呢?具体安装步骤有哪些?
    发表于 03-03 12:15

    何在Arm利用Istio搭建一个基于Kubernetes的Service Mesh平台

    ,另一方面,又通过Service Function Chain将各个服务有机的连接在一起,从而组合实现复杂的功能。在这篇文章中,我们将介绍如何在Arm平台上,利用Istio,搭建一个
    发表于 03-30 10:59

    轻松搭建ELK日志分析系统

    Logstash是一个用来搜集、分析、过滤日志的工具。它支持几乎任何类型的日志,包括系统日志、错误日志
    的头像 发表于 04-12 11:03 1.1w次阅读
    轻松搭建ELK<b class='flag-5'>日志</b>分析系统

    何在ESP8266实现基于AJAX的网络服务器

    在本文中,您将学习如何在 ESP8266 实现基于 AJAX 的网络服务器
    发表于 08-06 16:23 1936次阅读
    如<b class='flag-5'>何在</b>ESP8266<b class='flag-5'>上</b>实现基于AJAX的网络<b class='flag-5'>服务器</b>

    vivo大数据日志采集Agent设计实践

    通常,日志采集服务可以分为几个部分(业界常见的架构如下图所示):日志采集Agent组件(常见的开源采集Agent组件有Flume、Logstash、Scribe等)、采集
    的头像 发表于 11-29 15:39 1024次阅读

    分布式实时日志:ELK的部署架构方案

    该架构与第一种架构唯一不同的是:应用端日志收集换成了Filebeat,Filebeat轻量,占用服务器资源少,所以使用Filebeat作为应用服务器端的
    的头像 发表于 01-08 09:56 910次阅读

    区分云服务器与本地服务器

    服务器,大家一定不陌生。随着物联网的发展,很多应用开始纷纷云了。作为物联网小白,也想在云服务冲一把浪的话。 目前安排的内容包含:云服务器的选择与MQTT消息
    的头像 发表于 02-20 16:10 2197次阅读
    区分云<b class='flag-5'>服务器</b>与本地<b class='flag-5'>服务器</b>

    Logstash、Fluentd、Fluent Bit和Vector,谁才是开源日志收集最强王者?

    。本文讨论了市面上流行的几款日志收集工具(包括 Logstash、Fluentd、Fluent Bit 和 Vector)及其主要特点。 1. Logstash Logstash  是
    的头像 发表于 05-28 09:16 1468次阅读

    Kubernetes集群搭建容器云需要几台服务器

    Kubernetes集群搭建容器云需要几台服务器?至少需要4台服务器。搭建容器云所需的服务器数量以及具体的搭建步骤,会根据所选用的技术栈、业务规模、架构设计以及安全需求等因素而有所不同
    的头像 发表于 10-21 10:06 151次阅读

    何在Linux系统设置站群服务器IP地址

    在Linux系统设置站群服务器的IP地址,可以通过以下步骤进行,主机推荐小编为您整理发布如何在Linux系统设置站群服务器IP地址。
    的头像 发表于 12-11 10:05 135次阅读