日志管理系统EFK部署

发布时间 2023-04-11 15:31:53作者: 王竹笙

1. EFK简介

Elasticsearch 是一个实时的、分布式的可扩展的搜索引擎,允许进行全文、结构化搜索,它通常用于索引和搜索大量日志数据,也可用于搜索许多不同类型的文档。

Beats 是数据采集的得力工具。将 Beats 和您的容器一起置于服务器上,或者将 Beats 作为函数加以部署,然后便可在 Elastisearch 中集中处理数据。如果需要更加强大的处理性能,Beats 还能将数据输送到 Logstash 进行转换和解析。

Kibana 核心产品搭载了一批经典功能:柱状图、线状图、饼图、旭日图,等等。不仅如此,您还可以使用 Vega 语法来设计独属于您自己的可视化图形。所有这些都利用 Elasticsearch 的完整聚合功能。

Elasticsearch 通常与 Kibana 一起部署,Kibana 是 Elasticsearch 的一个功能强大的数据可视化Dashboard,Kibana 允许你通过 web 界面来浏览 Elasticsearch 日志数据。

EFK架构图

 

 

ELK和EFK的区别

ELK 是现阶段众多企业单位都在使用的一种日志分析系统,它能够方便的为我们收集你想要的日志并且展示出来

ELK是Elasticsearch、Logstash、Kibana的简称,这三者都是开源软件,通常配合使用。

1. Elasticsearch -->存储数据

是一个实时的分布式搜索和分析引擎,它可以用于全文搜索,结构化搜索以及分析。它是一个建立在全文搜索引擎 Apache Lucene 基础上的搜索引擎,使用 Java 语言编写,能对大容量的数据进行接近实时的存储、搜索和分析操作。

2. Logstash --> 收集数据

数据收集引擎。它支持动态的从各种数据源搜集数据,并对数据进行过滤、分析、丰富、统一格式等操作,然后存储到用户指定的位置。

3. Kibana --> 展示数据

数据分析和可视化平台。通常与 Elasticsearch 配合使用,对其中数据进行搜索、分析和以统计图表的方式展示。

EFK是ELK日志分析系统的一个变种,加入了filebeat 可以更好的收集到资源日志 来为我们的日志分析做好准备工作。

优缺点

Filebeat 相对 Logstash 的优点:

  • 侵入低,无需修改 elasticsearch 和 kibana 的配置;
  • 性能高,IO 占用率比 logstash 小太多;

当然 Logstash 相比于 FileBeat 也有一定的优势,比如 Logstash 对于日志的格式化处理能力,FileBeat 只是将日志从日志文件中读取出来,当然如果收集的日志本身是有一定格式的,FileBeat 也可以格式化,但是相对于Logstash 来说,效果差很多。

2. 部署介质

部署模式

项目地址

镜像地址

在线资源下载

git clone https://git.xxcn/middleware/efk.git

docker.elastic.co/elasticsearch/elasticsearch:7.9.1 

docker.elastic.co/beats/metricbeat:7.9.1

docker.elastic.co/beats/filebeat:7.9.1

docker.elastic.co/kibana/kibana  :7.9.1

离线资源下载

https://deploystore.xx.cn/middleware/efk/efk.zip

https://deploystore.insightone.cn/middleware/efk/images/

3. k8s安装

如果离线部署,则不需下载步骤。以上部资源则在部署介质步骤中下载,直接使用即可。

3.1 安装elasticsearch

3.1.1 增加efk的helm源

[root@devops-0001 ~]# helm repo add elastic https://helm.elastic.co
"elastic" has been added to your repositories
[root@devops-0001 ~]#
[root@devops-0001 ~]# helm repo list
NAME    URL                                      
azure   http://mirror.azure.cn/kubernetes/charts/
ali     https://apphub.aliyuncs.com              
elastic https://helm.elastic.co                  
[root@devops-0001 ~]#

3.1.2 安装elasticsearch

[root@devops-0001 ~]# mkdir efk && cd efk
[root@devops-0001 efk]#
[root@devops-0001 efk] helm pull elastic/elasticsearch

用命令tar zxvf elasticsearch-7.9.1.tgz解压下载下来的elasticsearch-7.9.1.tgz,得到一个目录elasticsearch。

[root@devops-0001 efk]# tar zxvf elasticsearch-7.9.1.tgz

编辑 vim elasticsearch/values.yaml,修改如下部分:

因为我们环境一台master,5台worker,replicas修改为3就行。保证节点的高可用即可。

因为不使用持久性存储,所以这里把persistence下面的enabled值有true改为false。

这里用的指定了elasticsearch用的镜像,最好是提前在所有节点上提前下载下来,之后保存退出。

执行安装

[root@devops-0001 efk]# helm install elastic elasticsearch
NAME: elastic
LAST DEPLOYED: Fri Apr  7 17:28:00 2023
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
1. Watch all cluster members come up.
  $ kubectl get pods --namespace=default -l app=elasticsearch-master -w
2. Test cluster health using Helm test.
  $ helm test elastic --cleanup

命令里的elastic是应用的名字可以随意写,elasticsearch是解压出来的文件夹。
这里大概1分钟左右,对应的pod会运行起来:

[root@devops-0001 efk]# kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
elasticsearch-master-0          1/1     Running   0          80s
elasticsearch-master-1          1/1     Running   0          79s
[root@devops-0001 efk]#

3.2.安装filebeat

3.2.1 下载filebeat

[root@devops-0001 efk] helm pull elastic/filebeat

用命令tar zxvf filebeat-7.9.1.tgz解压下载下来的 filebeat-7.9.1.tgz,得到一个目录filebeat。

root@devops-0001 efk]# tar zxcf filebeat-7.9.1.tgz 

编辑 vim filebeat/values.yaml,查看如下部分:

hostPathRoot: /var/lib
hostNetworking: false
image: "docker.elastic.co/beats/filebeat"
imageTag: "7.9.1"
imagePullPolicy: "IfNotPresent"
imagePullSecrets: []


建议提前把所需镜像在所有节点上下载下来,其他不需要编辑什么,保存退出。

修改抓取日志路径和elasticsearch地址

filebeatConfig:
  filebeat.yml: |
    filebeat.inputs:
    - type: container
      paths:
        - /var/log/containers/*.log
      processors:
      - add_kubernetes_metadata:
          host: ${NODE_NAME}
          matchers:
          - logs_path:
              logs_path: "/var/log/containers/"

    output.elasticsearch:
      host: '${NODE_NAME}'
      hosts: '${ELASTICSEARCH_HOSTS:elasticsearch-master:9200}'

3.2.2 配置filebeat

[root@devops-0001 efk]# helm install fb filebeat
NAME: fb
LAST DEPLOYED: Fri Apr  7 17:34:56 2023
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
1. Watch all containers come up.
  $ kubectl get pods --namespace=default -l app=fb-filebeat -w

命令里的fb是应用的名字可以随意写,filebeat是解压出来的文件夹。
大概20秒就好:

[root@devops-0001 efk]# kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
elasticsearch-master-0   1/1     Running   0          9m33s
elasticsearch-master-1   1/1     Running   0          9m32s
fb-filebeat-lgm76        1/1    Running   0          21s
fb-filebeat-trz5m        1/1     Running   0          21s
[root@devops-0001 efk]#

3.3安装metricbeat

3.3.1 下载metricbeat:

[root@devops-0001 efk] helm pull elastic/metricbeat

用命令tar zxvf metricbeat-7.9.1.tgz解压下载下来的 metricbeat-7.9.1.tgz,得到一个目录metricbeat。

 tar zxvf metricbeat-7.9.1.tgz 

3.3.2 配置metricbeat

类似前面的方法把所有的镜像提前在所有节点下载下来,

[root@devops-0001 efk]#  helm install metric metricbeat
NAME: metric
LAST DEPLOYED: Fri Apr  7 17:43:25 2023
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
1. Watch all containers come up.
  $ kubectl get pods --namespace=default -l app=metric-metricbeat -w

命令里的metric是应用的名字可以随意写,metricbeat是解压出来的文件夹。
这里大概40秒钟左右,对应的pod会运行起来:

[root@devops-0001 efk]# kubectl get pods
NAME                                       READY   STATUS   RESTARTS   AGE
    ...输出...
metric-kube-state-metrics-76c5b9fdbf-4jmnr  1/1    Running   0          46s
metric-metricbeat-bbbxx                     1/1    Running   0          46s
metric-metricbeat-metrics-696b596c6f-lwp74  1/1    Running   0          46s
metric-metricbeat-z7x7v                     1/1    Running   0          46s
[root@devops-0001 efk]#

3.4.安装kibana

[root@devops-0001 efk]#  helm pull elastic/kibana

用命令tar zxvf kibana-7.9.1.tgzz解压下载下来的kibana-7.9.1.tgz,得到一个目录kibana。
类似前面的方法把所有的镜像提前在所有节点下载下来,并把服务类型改为NodePort:

保存退出之后,开始安装:

[root@devops-0001 efk]# helm install kb kibana
NAME: kb
LAST DEPLOYED: Sat Sep 12 18:58:36 2020
NAMESPACE: ns6
STATUS: deployed
REVISION: 1
TEST SUITE: None
[root@devops-0001 efk]#

命令里的kb是应用的名字可以随意写,kibana是解压出来的文件夹。
这里大概2分钟左右,对应的pod会运行起来:

[root@devops-0001 efk]# kubectl get pods
NAME                          READY   STATUS    RESTARTS   AGE
    ...输出...
kb-kibana-d97c78c6-nqt5p      1/1     Running   0          2m1s
    ...输出...
[root@devops-0001 efk]# 

注意两台worker的配置是:分别8G内存,4核CPU

3.4.1 检查pod和svc是否都正常启动

查看启动pod的svc是否都正常启动。当前kibana对应的NodePort端口为30729

kubectl get svc
kubectl get pods

以上可以看到每个节点都自动部署了filebeat抓取端。

[root@devops-0001 ~]# kubectl get pods -o wide|grep filebeat

3.4.2 配置kibana

http://192.168.3.61:30729/app/home#/

3.4.2.1 配置索引

3.4.2.2  创建索引

 Kibana-->Index Patterns

索引创建创建filebeat步骤,添加索引名称即可。*代表配置所有。

管理索引选择 Data-->Index Managerment

3.4.3 查看日志

Kibana-->Discover

可以自定义选择过滤条件,就可查看想看的日志了。

4. docker-compose安装配置

4.1 创建洞见虚拟网络。

docker network create --driver bridge --subnet 172.18.0.0/24 --gateway 172.18.0.1 dongjian

4.2 创建docker-compose项目

mkdir efk/filebeat

4.3 配置filbeat.yml 

vim filebaet/filebeat.yml

filebeat.inputs:
- type: log
  paths:
    - '/var/log/*log'
    # 日志目录,这个目录是挂载insightone宿主机的日志目录。
    - '/usr/share/filebeat/in-logs/*log'  

processors:
- decode_json_fields:
    fields: ["message"]
    target: ""
    overwrite_keys: true

output.elasticsearch:
  hosts: ["http://192.168.3.158:9200"]    # es地址
  indices:
    - index: "filebeat-%{+yyyy.MM.dd}"
#    - index: "filebeat-%{[agent.version]}-%{+yyyy.MM.dd}"

#output.console:
#  enabled: true
#  codec.json:
#    pretty: true
    #escape_html: false

logging.json: true
#logging.metrics.enabled: false

## 定义info1应用的input类型、以及存放的具体路径
#filebeat.inputs:
#- type: log
#  enabled: true
#  paths:
#    - /var/logs/*.log
#  tags: ["log-app"]
#  fields:
#    index: log-app
#
##============================= Filebeat modules ===============================
#filebeat.config.modules:
#  # Glob pattern for configuration loading
#  path: ${path.config}/modules.d/*.yml
#  # Set to true to enable config reloading
#  reload.enabled: true
#
## ============================== logstash =====================================
##output.logstash:
##  hosts: ["192.168.226.135:5044"] #192.168.226.135为logstash安装的服务器ip
##  enabled: true
##============================== Kibana =====================================
#setup.kibana:
#  host: "192.168.3.158:5601"
#
##============================== elasticsearch =====================================
#output.elasticsearch:
#  hosts: ["192.168.3.158:9200"]
#  enabled: true

4.4 配置 docker-compose.yml

docker-compose.yml

version: '3.3'
services:
  elasticsearch:
    image: "harbor.insightone.cn/efk/elasticsearch:7.9.1"
    container_name: elasticsearch
    hostname:  elasticsearch
    restart: always
    environment:
    - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    - "discovery.type=single-node"
    - "cluster.name=cluster-elasticsearch"
    - "node.name=elasticsearch"
    - "bootstrap.memory_lock=true"  # 锁住内存 提高性能
    ulimits:
      memlock:
        soft: -1
        hard: -1
    ports:
    - "9200:9200"
    - "9300:9300"
    networks:
      dongjian:
        ipv4_address: 172.18.0.163
        aliases:
          - es
          - elasticsearch
    #volumes:
    #- elasticsearch_data:/usr/share/elasticsearch/data

  kibana:
    image: "harbor.insightone.cn/efk/kibana:7.9.1"
    container_name: kibana
    hostname: kibana
    restart: always
    depends_on:
      - elasticsearch
    environment:
      ELASTICSEARCH_URL: http://elasticsearch:9200
      ELASTICSEARCH_HOSTS: '["http://elasticsearch:9200"]'
    ports:
    - "5601:5601"
    networks:
      dongjian:
        ipv4_address: 172.18.0.164
        aliases:
          - kibana
          - kib

  filebeat:
    image: "harbor.insightone.cn/efk/filebeat:7.9.1"
    container_name: filebeat
    hostname: filebeat
    restart: always
    depends_on:
      - elasticsearch
      - kibana
    user: root
    command: ["--strict.perms=false"]
    volumes:
    - ./filebeat/filebeat.yaml:/usr/share/filebeat/filebeat.yml
    - ./filebeat/logs:/usr/share/filebeat/logs
    - ./data/insightone/docker-compose/data/logs/server:/usr/share/filebeat/in-logs


      #- /var/run/docker.sock:/var/run/docker.sock
    networks:
      dongjian:
        ipv4_address: 172.18.0.165
        aliases:
          - filebeat
          - fb
networks:
  dongjian:
    external: true

4.5 启动项目

[root@master efk]# docker-compose up -d

4.6 配置kibana

http://192.168.3.158:5601/

登录kibana配置索引。

查看日志,可以根据想查看的就行过滤。http://192.168.3.158:5601/