k8s 全面掌控日志系统

devtools/2024/10/18 14:24:25/

概述

为了提高系统运维和故障排查的效率, 日志系统采用 ELK(Elasticsearch、Logstash、Kibana)技术栈,通过 FileBeats 作为日志收集器,将来自不同节点的日志数据汇总并存储在 Elasticsearch 中,最终通过 Kibana 进行可视化展示和分析。

系统配置包括 FileBeats 的收集规则、Logstash 的处理管道和 Elasticsearch 的索引设置。部署过程采用 Kubernetes 的 Helm Chart 实现,简化了安装和管理。

架构

FileBeats + Kafka + ELK

⚡️: 在不影响旧有日志系统运行的前提下,我们在现有的 ELK+Kafka 架构基础上,新增了 Filebeat 作为日志收集器,用于采集 Kubernetes 日志。

在这里插入图片描述

日志采集器Logstash其功能虽然强大,但是它依赖java、在数据量大的时候,Logstash进程会消耗过多的系统资源,这将严重影响业务系统的性能,而filebeat就是一个完美的替代者,它基于Go语言没有任何依赖,配置文件简单,格式明了,同时filebeat比logstash更加轻量级,所以占用系统资源极少,非常适合安装在生产机器上。这就是推荐使用filebeat,也是 ELK Stack 在 Agent 的第一选择。
​ 此架构适合大型集群、海量数据的业务场景,它通过将前端Logstash Agent替换成filebeat,有效降低了收集日志对业务系统资源的消耗。同时,消息队列使用kafka集群架构,有效保障了收集数据的安全性和稳定性,而后端Logstash和Elasticsearch均采用集群模式搭建,从整体上提高了ELK系统的高效性、扩展性和吞吐量。我所在的项目组采用的就是这套架构,由于生产所需的配置较高,且涉及较多持久化操作,采用的都是性能高配的云主机搭建方式而非时下流行的容器搭建

部署

elasticsearch

安装方式:helm

安装版本:8.5.1

⚡️ helm安装8版本elastic默认开启ssl认证,我们这边禁用认证

开始前奏操作,生成secret

# 根据提供的 elastic-certificates.p12 将 pcks12 中的信息分离出来,写入文件
openssl pkcs12 -nodes -passin pass:'' -in elastic-certificates.p12 -out elastic-certificate.pem添加证书和密码到集群
# 添加证书
kubectl create secret generic elastic-certificates --from-file=elastic-certificates.p12
kubectl create secret generic elastic-certificate-pem --from-file=elastic-certificate.pem# 设置集群用户名密码,用户名不建议修改
##命令行
kubectl create secret generic elastic-credentials \--from-literal=username=elastic --from-literal=password=123456
##yaml
apiVersion: v1
data:password: MTIzNDU2username: ZWxhc3RpYw==
kind: Secret
metadata:name: elastic-credentialsnamespace: elastic
type: Opaque

🏴 加油特种兵

先添加elasticsearch的helm仓库,并拉取对应版本的Charts并对其解压

[root@ycloud ~]# helm repo add elastic https://helm.elastic.co
"elastic" has been added to your repositories
[root@ycloud ~]# helm pull elastic/elasticsearch --version 8.5.1
[root@ycloud ~]# tar -zxvf elasticsearch-8.5.1.tgz 
elasticsearch/Chart.yaml
elasticsearch/values.yaml
......

调整values

replicas: 2
minimumMasterNodes: 1esMajorVersion: ""# Allows you to add any config files in /usr/share/elasticsearch/config/
# such as elasticsearch.yml and log4j2.properties# ==================安全配置========================
protocol: http###挂在证书,这里用我们上面创建的证书
secretMounts: - name: elastic-certificatessecretName: elastic-certificatespath: /usr/share/elasticsearch/config/certsdefaultMode: 0755esConfig: elasticsearch.yml: |xpack.security.enabled: truexpack.security.transport.ssl.enabled: truexpack.security.transport.ssl.verification_mode: certificatexpack.security.transport.ssl.keystore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12xpack.security.transport.ssl.truststore.path: /usr/share/elasticsearch/config/certs/elastic-certificates.p12
#    key:
#      nestedkey: value
#  log4j2.properties: |
#    key = value## 关闭ssl认证
createCert: false        
esJavaOpts: "-Xmx1g -Xms1g"###指定elastic用户密码
extraEnvs: - name: ELASTIC_USERNAMEvalueFrom:secretKeyRef:name: elastic-credentials    ###用我们创建的secretkey: username- name: ELASTIC_PASSWORDvalueFrom:secretKeyRef:name: elastic-credentials		###用我们创建的secretkey: password
###true开启持久化
persistence:enabled: true

kibana

安装方式:helm

安装版本:8.5.1

⚡️: 默认使用身份验证和TLS部署Kibana 8.5.1连接到Elasticsearch

🐤:重置kibana_system账户密码

[root@ycloud hub]# kubectl exec -it elasticsearch-master-0 -- bin/elasticsearch-reset-password -u kibana_system
Defaulted container "elasticsearch" out of: elasticsearch, configure-sysctl (init)
This tool will reset the password of the [kibana_system] user to an autogenerated value.
The password will be printed in the console.
Please confirm that you would like to continue [y/N]yPassword for the [kibana_system] user successfully reset.
New value: nVUE*km=842x7duqB4TR

🐤:更新 elastic-credentials文件

# [root@ycloud hub]# echo nVUE*km=842x7duqB4TR|base64 
blZVRSprbT04NDJ4N2R1cUI0VFIK
apiVersion: v1
data:kibana_password: blZVRSprbT04NDJ4N2R1cUI0VFIK kibana_username: a2liYW5hX3N5c3RlbQ==password: MTIzNDU2username: ZWxhc3RpYw==
kind: Secret
metadata:name: elastic-credentialsnamespace: elastic
type: Opaque

🏴 加油特种兵

先添加kibana的helm仓库,并拉取对应版本的Charts并对其解压

[root@ycloud ~]# helm repo add elastic https://helm.elastic.co
"elastic" has been added to your repositories
[root@ycloud ~]# helm pull elastic/kibana --version 8.5.1
[root@ycloud ~]# tar -zxvf kibana-8.5.1.tgz 
kibana/Chart.yaml
kibana/values.yaml
......

调整template

# cd kibana/templates/ ; rm -rf post-delete-* pre-install-*
##删除deployment.yaml部分内容
---- name: ELASTICSEARCH_SSL_CERTIFICATEAUTHORITIESvalue: "{{ template "kibana.home_dir" . }}/config/certs/{{ .Values.elasticsearchCertificateAuthoritiesFile }}"- name: ELASTICSEARCH_SERVICEACCOUNTTOKENvalueFrom:secretKeyRef:name: {{ template "kibana.fullname" . }}-es-tokenkey: tokenoptional: false
--- readinessProbe:
{{ toYaml .Values.readinessProbe | indent 10 }}exec:command:- bash- -c- |#!/usr/bin/env bash -e# Disable nss cache to avoid filling dentry cache when calling curl# This is required with Kibana Docker using nss < 3.52export NSS_SDB_USE_CACHE=nohttp () {local path="${1}"set -- -XGET -s --fail -Lif [ -n "${ELASTICSEARCH_USERNAME}" ] && [ -n "${ELASTICSEARCH_PASSWORD}" ]; thenset -- "$@" -u "${ELASTICSEARCH_USERNAME}:${ELASTICSEARCH_PASSWORD}"fiSTATUS=$(curl --output /dev/null --write-out "%{http_code}" -k "$@" "{{ .Values.protocol }}://localhost:{{ .Values.httpPort }}${path}")if [[ "${STATUS}" -eq 200 ]]; thenexit 0fiecho "Error: Got HTTP code ${STATUS} but expected a 200"exit 1}http "{{ .Values.healthCheckPath }}"
---- name: elasticsearch-certssecret:secretName: {{ .Values.elasticsearchCertificateSecret }}
---- name: elasticsearch-certsmountPath: {{ template "kibana.home_dir" . }}/config/certsreadOnly: true
---

调整values

# cd kibana/templates/
# rm -rf post-delete-* pre-install-*
---
elasticsearchHosts: "http://elasticsearch-master:9200"
#elasticsearchCertificateSecret: elasticsearch-master-certs
#elasticsearchCertificateAuthoritiesFile: ca.crt
elasticsearchCredentialSecret: elastic-credentialsreplicas: 1extraEnvs:- name: "NODE_OPTIONS"value: "--max-old-space-size=1800"- name: 'ELASTICSEARCH_USERNAME'valueFrom:secretKeyRef:name: elastic-credentialskey: kibana_username- name: 'ELASTICSEARCH_PASSWORD'valueFrom:secretKeyRef:name: elastic-credentialskey: kibana_passwordresources:requests:cpu: "1000m"memory: "2Gi"limits:cpu: "1000m"memory: "2Gi"protocol: httpserverHost: "0.0.0.0"healthCheckPath: "/app/kibana"

filebeat

⚡️: 详情见 Here

总结

日志系统已成功应用于多种业务场景。为了进一步提高系统的稳定性,后面我们在新的部署中采用 ClickHouse 作为日志存储解决方案。


http://www.ppmy.cn/devtools/45272.html

相关文章

常见的几种编码方式

常见的编码方式及其特点&#xff1a; 编码方式的设计是为了适应不同的字符集和应用需求&#xff0c;因此它们在表示字符时使用的位数和字节数各不相同 常见编码方式及其位数和字节数 ASCII&#xff08;American Standard Code for Information Interchange&#xff09;&#x…

快速幂

a^b % q 给定整数 a b q&#xff0c; 求 a 的 b 次方 mod q 根据题目数字取值范围&#xff0c;不能暴力处理。 会有两个问题&#xff1a; 1、计算 a 的次方会超出范围 2、不能循环 b 次计算 a 的乘积&#xff0c;会超时 处理问题1&#xff1a; 每计算一次 a 的乘积&#xf…

三坐标测量机在汽车零部件质量控制中的应用

高质量的零部件能够确保汽车的性能达到设计标准&#xff0c;包括动力性能、燃油效率、操控稳定性等&#xff0c;从而提供更好的驾驶体验&#xff0c;建立消费者对汽车品牌的信任&#xff1b;也推动了汽车行业的技术创新&#xff0c;制造商不断研发新材料、新工艺&#xff0c;以…

vi和vim有什么不同?

vi 和 vim 都是流行的文本编辑器&#xff0c;它们之间有以下主要区别&#xff1a; 历史&#xff1a; vi 是一个非常古老的文本编辑器&#xff0c;最初由 Bill Joy 在 1976 年为 Unix 系统编写。vim&#xff08;Vi IMproved&#xff09;是 vi 的一个增强版&#xff0c;由 Bram M…

【Linux】使用pip3安装pexpect,解决报错:the ssl module in Python is not available

pip3是python3的包管理工具&#xff0c;安装、卸载、更新等管理python包。 pexpect是其中一个python库&#xff0c;用于自动化与终端交互。 centos7使用pip3安装pexpect&#xff0c;报错&#xff1a; pip3 install pexpect 原因&#xff1a;使用python3解释器导入ssl库检查ss…

Docker Swarm - 删除 worker 节点

1、前提&#xff1a;集群环境已经运行 在manager节点上执行: # 查看节点信息 >>> docker node lsID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION jr06s8pbrclkrxt7jpy7wae8t * iZ2ze78653g2…

随机森林分析:R语言轻松实现微生物组随机森林分析及重要变量的选择

数据和代码获取&#xff1a;请查看主页个人信息&#xff01;&#xff01;&#xff01; 大家好&#xff01;欢迎来到R语言数据分析视界。今天我来介绍微生物组执行随机森林分类分析的R语言操作方法。微生物组的随机森林分析可以用于研究微生物组的组成和功能与其他因素&#xff…

Python面试宝典:Python中与Pandas数据分析相关的面试笔试题(1000加面试笔试题助你轻松捕获大厂Offer)

Python面试宝典:1000加python面试题助你轻松捕获大厂Offer【第二部分:Python高级特性:第十七章:数据处理和分析:第二节:Pandas数据分析】 第十七章:数据处理和分析第二节:Pandas数据分析1. Pandas的核心数据结构2. 创建Series和DataFrame3. 数据访问和选择4. 数据清洗5…