当前位置: 首页 > news >正文

附046.集群管理-EFK日志解决方案-Filebeat

文章目录

    • 统一日志管理
      • 日志管理
      • EFK简介
      • 架构设计
    • EFK部署
      • 设置标签
      • 获取EFK chart包
      • 创建证书
      • 手动创建secret
      • 创建elasticsearch自定义配置
      • 正式部署elasticsearch
      • 确认验证
      • 创建filebeat自定义配置
      • 正式部署filebeat
      • 创建kibana自定义配置
      • 正式部署kibana
    • 确认验证
      • 查看部署的资源
      • 访问验证
    • 基础使用
      • 确认连接
      • 测试日志
      • 创建索引
      • 日志查看与搜索

统一日志管理

日志管理

在Kubernetes集群环境中,一个完整的应用或服务都会涉及为数众多的组件运行,各组件所在的Node及实例数量都是可变的。日志子系统如果不做集中化管理,则会给系统的运维支撑造成很大的困难,因此建议在集群层面对日志进行统一收集和检索等工作。
在容器中输出到控制台的日志,都会以*-json.log的命名方式保存在/var/lib/docker/containers/目录下。
Kubernetes推荐采用Fluentd+Elasticsearch+Kibana完成对系统和容器日志的采集、查询和展现工作。
部署统一的日志管理系统,需要以下两个前提条件。

  • API Server正确配置了CA证书。
  • DNS服务启动、运行。

EFK简介

Kubernetes 配套一个 Elasticsearch 附加组件来实现集群的日志管理。这是一个 Elasticsearch、Fluentd或Filebeat 和 Kibana 的组合。

  • Elasticsearch 是一个搜索引擎,负责存储日志并提供查询接口;
  • Fluentd/Filebeat 负责从 Kubernetes 搜集日志,每个node节点上面的fluentd监控并收集该节点上面的系统日志,并将处理过后的日志信息发送给Elasticsearch;
  • Kibana 提供了一个 Web GUI,用户可以浏览和搜索存储在 Elasticsearch 中的日志。
    通过在每台node上部署一个以DaemonSet方式运行的fluentd来收集每台node上的日志。Fluentd将docker日志目录/var/lib/docker/containers和/var/log目录挂载到Pod中,然后Pod会在node节点的/var/log/pods目录中创建新的目录,可以区别不同的容器日志输出,该目录下有一个日志文件链接到/var/lib/docker/contianers目录下的容器日志输出。

001

即相对应的三个组件整个流程大体如下:

002

在各Node上都运行了一个Fluentd/Filebeat容器,采集本节点/var/log和/var/lib/docker/containers两个目录下的日志进程,将其汇总到Elasticsearch集群,最终通过Kibana完成和用户的交互工作。因此Fluentd必须在每个Node上运行。为了满足这一需求,可通过以下几种方式部署Fluentd/Filebeat。

  • 直接在Node主机上部署Fluentd/Filebeat。
  • 利用kubelet的–config参数, 为每个Node都加载Fluentd/Filebeat Pod。
  • 利用DaemonSet让Fluentd/Filebeat Pod在每个Node上运行。

003

架构设计

节点IP角色组件
master01172.24.8.11Kubernetes master控制平面Kibana、Filebeat
master02172.24.8.12Kubernetes master控制平面Kibana、Filebeat
master03172.24.8.13Kubernetes master控制平面Kibana、Filebeat
worker01172.24.8.14Kubernetes master控制平面elasticsearch、Filebeat
worker02172.24.8.15Kubernetes master控制平面elasticsearch、Filebeat
worker03172.24.8.16Kubernetes master控制平面elasticsearch、Filebeat

elasticsearch:部署在worker节点(172.24.8.14-16),worker节点为业务节点
部署方式:StatefulSet(ES) + Deployment(Kibana)
Fluentd/Filebeat:部署在所有节点(包括master和worker),需要收集每个节点的容器日志
部署方式:DaemonSet(每个节点一个Pod)
Kibana:部署在master节点(172.24.8.11-13),只暴露服务,Elasticsearch不直接暴露。

提示:本环境基于学习目的,把Elasticsearch也暴露。

EFK部署

设置标签

针对需要部署的节点,进行打标签,从而实现定向调度。

[root@master01 ~]# kubectl label nodes worker0{1,2,3} elasticsearch=enable
[root@master01 ~]# kubectl label nodes master0{1,2,3} kibana=enable

获取EFK chart包

[root@master01 ~]# helm repo add elastic https://helm.elastic.co
[root@master01 ~]# helm repo update[root@master01 ~]# helm search repo elastic/
NAME                            CHART VERSION   APP VERSION     DESCRIPTION                                       
elastic/apm-attacher            1.1.3                           A Helm chart installing the Elastic APM Kuberne...
elastic/apm-server              8.5.1           8.5.1           Official Elastic helm chart for Elastic APM Server
elastic/eck-agent               0.15.0                          Elastic Agent managed by the ECK operator         
elastic/eck-apm-server          0.15.0                          Elastic APM Server managed by the ECK operator    
elastic/eck-beats               0.15.0                          Elastic Beats managed by the ECK operator         
elastic/eck-elasticsearch       0.15.0                          Elasticsearch managed by the ECK operator         
elastic/eck-enterprise-search   0.15.0                          Elastic Enterprise Search managed by the ECK op...
elastic/eck-fleet-server        0.15.0                          Elastic Fleet Server as an Agent managed by the...
elastic/eck-kibana              0.15.0                          Kibana managed by the ECK operator                
elastic/eck-logstash            0.15.0                          Logstash managed by the ECK operator              
elastic/eck-operator            3.0.0           3.0.0           Elastic Cloud on Kubernetes (ECK) operator        
elastic/eck-operator-crds       3.0.0           3.0.0           ECK operator Custom Resource Definitions          
elastic/eck-stack               0.15.0                          Elastic Stack managed by the ECK Operator         
elastic/elastic-agent           9.0.3           9.0.3           Elastic-Agent Helm Chart                          
elastic/elasticsearch           8.5.1           8.5.1           Official Elastic helm chart for Elasticsearch     
elastic/filebeat                8.5.1           8.5.1           Official Elastic helm chart for Filebeat          
elastic/kibana                  8.5.1           8.5.1           Official Elastic helm chart for Kibana            
elastic/kube-state-metrics      5.30.1          2.15.0          Install kube-state-metrics to generate and expo...
elastic/logstash                8.5.1           8.5.1           Official Elastic helm chart for Logstash          
elastic/metricbeat              8.5.1           8.5.1           Official Elastic helm chart for Metricbeat        
elastic/pf-host-agent           8.14.3          8.14.3          Hyperscaler software efficiency. For everybody.   
elastic/profiling-agent         9.0.3           9.0.3           Hyperscaler software efficiency. For everybody.   
elastic/profiling-collector     9.0.3           9.0.3           Universal Profiling. Hyperscaler software effic...
elastic/profiling-symbolizer    9.0.3           9.0.3           Universal Profiling. Hyperscaler software effic...

提示:Elasticsearch Helm Chart 。

创建证书

默认 elasticsearch 没有开启ingress,本环境已部署ingress,因此规划启用ingress来基于https暴露服务。
同时相关证书使用自签名创建证书,同时使用对应证书创建secret。

  • 脚本快速自签名基于实验目的,采用自签名证书。
[root@master01 ~]# mkdir elasticsearch[root@master01 ~]# cd elasticsearch/
[root@master01 elasticsearch]# wget http://down.linuxsb.com/myshell/signcert.sh[root@master01 elasticsearch]# vim signcert.sh
#!/bin/sh
#***************************************************************#
# ScriptName: signcert.sh
# Author: xhy
# Create Date: 2025-02-25 21:49
# Modify Author: xhy
# Modify Date: 2025-04-27 19:11
# Version: v1
#***************************************************************#
# 配置参数
#PARENT_DOMAIN="linuxsb.com"          # 父级域名
#SUB_DOMAINS=("aaa" "bbb" "ccc")      # 子域名列表,可选配置PARENT_DOMAIN="linuxsb.com"
SUB_DOMAINS=("es" "kibana")
#……                                     #其他保持默认[root@master01 dashboard]# bash signcert.sh[root@master01 dashboard]# ll certs/
total 24K
-rw-r--r-- 1 root root 2.4K Jul 19 20:50 fullchain.crt
-rw-r--r-- 1 root root 1.3K Jul 19 20:50 linuxsb.com.crt
-rw------- 1 root root 1.7K Jul 19 20:50 linuxsb.com.key
-rw-r--r-- 1 root root 1.2K Jul 19 20:50 myCA.crt
-rw------- 1 root root 1.7K Jul 19 20:50 myCA.key
-rw-r--r-- 1 root root   41 Jul 19 20:50 myCA.srl

手动创建secret

自定义证书的场景,建议提前使用对应的证书创建secret。
后续用于使用https暴露elasticsearch。

[root@master01 elasticsearch]# kubectl create ns es                #dashboard独立ns
[root@master01 elasticsearch]# kubectl -n es create secret tls elasticsearch-ui-tls \
--cert=/root/elasticsearch/certs/linuxsb.com.crt \
--key=/root/elasticsearch/certs/linuxsb.com.key[root@master01 elasticsearch]# kubectl -n es get secret kubernetes-elasticsearch-certs -o yaml    #查看证书信息

创建elasticsearch自定义配置

根据实际情况修改默认的chart values,未配置的项表示使用默认值。
如下自定义yaml主要做了几项自定义配置:

  • 指定elasticsearch部署在master节点;
  • 指定了使用自有的TLS证书,及https的ingress域名;
  • 指定了污点能接受master节点;
  • 指定了Pod挂载本地时间文件,使Pod时钟正确;
  • 使用Longhorn提供的持久化存储保存数据。
[root@master01 elasticsearch]# helm show values elastic/elasticsearch > defaults-elasticsearch-values.yaml        #查看默认配置[root@master01 elasticsearch]# vim my-elasticsearch-values.yaml
---
replicas: 2# 此部分配置将直接写入elasticsearch.yml
# 此部分配置将直接写入elasticsearch.yml
# 磁盘空间管理 - 防止磁盘写满导致集群崩溃# 低水位线(85%) - 达到此使用率时停止分配新分片# 高水位线(90%) - 达到此使用率时尝试迁移分片
esConfig:elasticsearch.yml: |cluster.routing.allocation.disk.threshold_enabled: truecluster.routing.allocation.disk.watermark.low: "85%"cluster.routing.allocation.disk.watermark.high: "90%"# 启用密码存储(自动创建Kubernetes Secret)
secret:enabled: truepassword: "redhat123"image: "uhub.service.ucloud.cn/imxhy/elasticsearch"
imageTag: "8.5.1"# 持久化存储配置
volumeClaimTemplate:accessModes: ["ReadWriteOnce"]storageClassName: "longhorn"resources:requests:storage: 5Gi# 时间同步配置
extraVolumeMounts:- name: timeconfigmountPath: /etc/localtimereadOnly: true
extraVolumes:- name: timeconfighostPath:path: /etc/localtime# 节点调度配置
nodeSelector: {"elasticsearch": "enable"}# Ingress配置
ingress:enabled: trueannotations: nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" nginx.ingress.kubernetes.io/proxy-body-size: "50m"className: "nginx"hosts:- host: es.linuxsb.compaths:- path: /tls:- secretName: elasticsearch-ui-tlshosts:- es.linuxsb.com

正式部署elasticsearch

根据生产环境最佳实践进行调优,调优完成后开始部署。

[root@master01 elasticsearch]# helm upgrade --install elasticsearch elastic/elasticsearch --create-namespace --namespace es -f my-elasticsearch-values.yaml

确认验证

使用浏览器访问 https://es.linuxsb.com ,使用默认用户 elastic 和自定义的密码登录。

004

创建filebeat自定义配置

根据实际情况修改默认的chart values,未配置的项表示使用默认值。
如下自定义yaml主要做了几项自定义配置:

  • 指定filebeat部署在所有节点,对master打上容忍;
  • 修改镜像为国内。
[root@master01 elasticsearch]# helm show values elastic/filebeat > defaults-filebeat-values.yaml        #查看默认配置[root@master01 elasticsearch]# vim my-filebeat-values.yaml
---
daemonset:tolerations: # 主节点容忍- key: node-role.kubernetes.io/control-planeoperator: "Exists"effect: "NoSchedule"deployment:enabled: falseimage: "uhub.service.ucloud.cn/imxhy/filebeat"
imageTag: "8.5.1"

正式部署filebeat

根据生产环境最佳实践进行调优,调优完成后开始部署。

[root@master01 elasticsearch]# helm upgrade --install filebeat elastic/filebeat --create-namespace --namespace es -f my-filebeat-values.yaml

创建kibana自定义配置

根据实际情况修改默认的chart values,未配置的项表示使用默认值。
如下自定义yaml主要做了几项自定义配置:

  • 指定kibana部署在所有节点,对master打上容忍;
  • 修改镜像为国内。
[root@master01 elasticsearch]# helm show values elastic/kibana > defaults-kibana-values.yaml        #查看默认配置[root@master01 elasticsearch]# vim my-kibana-values.yaml
---
replicas: 1image: "uhub.service.ucloud.cn/imxhy/kibana"
imageTag: "8.5.1"kibanaConfig:kibana.yml: |server.publicBaseUrl: "https://kibana.linuxsb.com"elasticsearch.ssl.certificateAuthorities: /usr/share/kibana/config/certs/ca.crt# 时间同步配置
extraVolumeMounts:- name: timeconfigmountPath: /etc/localtimereadOnly: true
extraVolumes:- name: timeconfighostPath:path: /etc/localtimeingress:enabled: trueclassName: "nginx"hosts:- host: kibana.linuxsb.compaths:- path: /tls: - secretName: elasticsearch-ui-tlshosts:- kibana.linuxsb.com# 节点调度(与ES相同节点)
nodeSelector: {"kibana": "enable"}
tolerations: - key: node-role.kubernetes.io/control-planeoperator: "Exists"effect: "NoSchedule"

正式部署kibana

根据生产环境最佳实践进行调优,调优完成后开始部署。

[root@master01 elasticsearch]# helm upgrade --install kibana elastic/kibana --create-namespace --namespace es -f my-kibana-values.yaml

提示:若部署kibana过程异常,需要重新卸载再部署,但卸载和重部署报错某个资源already exists,可如下操作:
报错:

Error: failed pre-install: warning: Hook pre-install kibana/templates/pre-install-rolebinding.yaml failed: 1 error occurred:* rolebindings.rbac.authorization.k8s.io "pre-install-kibana-kibana" already exists[root@master01 elasticsearch]# kubectl -n es get configmap,secret,serviceaccount,role,rolebindings,jobs            #查询所有相应的资源
[root@master01 elasticsearch]# kubectl -n es delete configmap/kibana-kibana-config secret/kibana-kibana-es-token secret/sh.helm.release.v1.kibana.v1 configmaps/kibana-kibana-helm-scripts serviceaccounts/pre-install-kibana-kibana roles/pre-install-kibana-kibana rolebindings/pre-install-kibana-kibana jobs.batch/pre-install-kibana-kibana #其他资源类似手动全部删除
[root@master01 elasticsearch]# helm -n es uninstall kibana

确认验证

查看部署的资源

[root@master01 elasticsearch]# kubectl -n es get all -o wide
[root@master01 elasticsearch]# kubectl -n es get ingress -o wide

005

访问验证

浏览器访问 https://kibana.linuxsb.com ,使用elasticsearch默认用户 elastic 和自定义的密码 redhat123 登录。

006

007

基础使用

确认连接

浏览器访问后确认正常连接filebeat-8.5.1 。
进入 Index Management 中的 Data Streams 中可以看到 filebeat-8.5.1 已被列为数据索引项目。

008

测试日志

创建一个生产日志的Pod,用于生成日志,确认能正常获取。

[root@master01 elasticsearch]# vim test-logging-pod.yaml
apiVersion: v1
kind: Pod
metadata:name: testpods01
spec:containers:- name: countimage: uhub.service.ucloud.cn/imxhy/busybox:1.37.0args: [/bin/sh, -c,'i=0; while true; do echo "$i: $(date)"; i=$((i+1)); sleep 1; done'][root@master01 elasticsearch]# kubectl apply -f test-logging-pod.yaml
pod/testpods01 created
[root@master01 elasticsearch]# kubectl get pods -o wide
NAME         READY   STATUS    RESTARTS   AGE   IP            NODE       NOMINATED NODE   READINESS GATES
testpods01   1/1     Running   0          6s    10.10.30.91   worker02   <none>           <none>

kibana界面中查看 Observability->Logs->Stream:

009

创建索引

配置Kibana,要查询和分析 Elasticsearch 中的哪些日志,因此需要配置一个 Index Pattern。从 Filebeat 中可知 Index 是 filebeat-timestamp 这种格式,因此需要定义 Index Pattern 为 filebeat-*

提示:当前版本已存在一个包含filebeat-*格式的索引模式。

010

日志查看与搜索

基本日志查看:
左侧菜单 > Analytics > Discover
选择默认创建的视图即可。
可根据时间范围选择: Last 15 minutes

011

也可以使用kubernetes.namespace: “es” 查看特定namespace下的日志。

012

还可以根据需要创建一个dashboard,用于展示。

013

尝试查找error关键字日志。

014

参考:

一文读懂开源日志管理方案 ELK 和 EFK 的区别

Helm实战案例二:在Kubernetes(k8s)上使用helm安装部署日志管理系统EFK

使用EFKLK搭建Kubernetes日志收集工具栈

http://www.dtcms.com/a/333610.html

相关文章:

  • 考研复习-计算机组成原理-第七章-IO
  • NumPy基础入门
  • 第40周——GAN入门
  • 详解区块链技术及主流区块链框架对比
  • PSME2通过IL-6/STAT3信号轴调控自噬
  • 【机器学习】核心分类及详细介绍
  • 控制块在SharedPtr中的作用(C++)
  • 【秋招笔试】2025.08.15饿了么秋招机考-第二题
  • 基于MATLAB的机器学习、深度学习实践应用
  • Matlab(5)进阶绘图
  • 后端学习资料 持续更新中
  • StarRocks数据库集群的完整部署流程
  • plantsimulation中存储(store)、缓冲区(buffer)、放置缓冲区(PlaceBuffer)的区别,分别应用于那种情况
  • 第七十四章:AI的“诊断大师”:梯度可视化(torchviz / tensorboardX)——看透模型“学习”的秘密!
  • 测试用例的一些事项
  • API接口大全实用指南:构建高质量接口的六个关键点
  • Adobe Photoshop 2024:软件安装包分享和详细安装教程
  • Unity与OpenGL中的材质系统详解
  • 杭州电子商务研究院发布“数字化市场部”新部门组织的概念定义
  • Gato:多模态、多任务、多具身的通用智能体架构
  • Vue 组件二次封装透传slots、refs、attrs、listeners
  • 【Spring框架】SpringAOP
  • Ubuntu 22.04 安装PCL(Point Cloud Library)和Eigen库
  • 基于 Ubuntu22.04 安装 SSH 服务,记录
  • 如何实现免密码 SSH 登录
  • 零基础-动手学深度学习-10.4. Bahdanau 注意力
  • week1-[一维数组]传送
  • python-pycharm切换python各种版本的环境与安装python各种版本的环境(pypi轮子下载)
  • Linux下的软件编程——多任务(线程)
  • QT开发中如何加载第三方dll文件