网站首页 > 技术文章 正文
一、概述
Filebeat 是一个轻量级的开源数据采集器,通常用于从不同来源收集和发送日志和事件数据。在 Kubernetes 或 Docker 环境中,Filebeat 常用于采集容器的日志。以下是通过 Filebeat 采集容器日志的三种常见方式的实战讲解:
【第一种方式】:Filebeat 与 应用运行在同一容器
- 部署Filebeat:首先,在Kubernetes中或Docker环境中,部署 Filebeat 作为一个Sidecar容器,它将与应用容器一起运行(在同一个容器中运行)。
- 配置Filebeat:在Filebeat的配置文件(filebeat.yml)中,定义日志路径,以告诉 Filebeat 从哪里采集容器日志。
- 输出设置:配置Filebeat将采集到的日志数据发送到所需的目的地,如Elasticsearch、Logstash或Kafka。
- 启动Filebeat:启动Filebeat容器,它将开始采集容器的日志,并将其发送到配置的目的地。
【第二种方式】:Filebeat 与 应用运行不在同一容器
- 部署Filebeat:同样,在Kubernetes中或Docker环境中,部署 Filebeat作为一个独立的 Sidecar 容器。
- 配置Filebeat:在Filebeat的配置文件中,使用Docker日志驱动来采集容器日志。
- 输出设置:配置Filebeat的输出,以将采集到的日志数据发送到目标。
- 启动Filebeat:启动Filebeat容器,它将开始采集容器的日志。
【第三种方式】通过 Kubernetes Filebeat DaemonSet
- 部署 Filebeat:在Kubernetes中,可以使用Filebeat DaemonSet部署Filebeat作为一个集群级别的日志采集器。
- Filebeat配置:在Filebeat的配置中,设置输入插件以采集容器的日志。
- Filebeat输出:配置Filebeat的输出插件,以将采集到的日志数据发送到目标,如Elasticsearch或其他存储。
- 启动Filebeat:启动Filebeat DaemonSet,它将在Kubernetes集群中采集容器的日志。
Filebeat 官方文档:https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-overview.html
以前也写过关于 filebeat 更详细的介绍和实战操作的文章,只不过 filebeat 不是部署在 k8s 上,感兴趣的小伙伴可以先查阅我之前的文章:
二、K8s 集群部署
k8s 环境安装之前写过很多文档,可以参考我以下几篇文章:
三、ElasticSearch 和 kibana 环境部署
这里可以选择以下部署方式:
- 通过docker-compose部署:通过 docker-compose 快速部署 Elasticsearch 和 Kibana 保姆级教程
- on k8s 部署:ElasticSearch+Kibana on K8s 讲解与实战操作(版本7.17.3)
这里我选择 docker-compose 部署方式。
1)部署 docker
# 安装yum-config-manager配置工具
yum -y install yum-utils
# 建议使用阿里云yum源:(推荐)
#yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装docker-ce版本
yum install -y docker-ce
# 启动并开机启动
systemctl enable --now docker
docker --version
2)部署 docker-compose
curl -SL https://github.com/docker/compose/releases/download/v2.16.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose --version
3)创建网络
# 创建
docker network create bigdata
# 查看
docker network ls
4)修改 Linux 句柄数和最大线程数
#查看当前最大句柄数
sysctl -a | grep vm.max_map_count
#修改句柄数
vi /etc/sysctl.conf
vm.max_map_count=262144
#临时生效,修改后需要重启才能生效,不想重启可以设置临时生效
sysctl -w vm.max_map_count=262144
#修改后需要重新登录生效
vi /etc/security/limits.conf
# 添加以下内容
* soft nofile 65535
* hard nofile 65535
* soft nproc 4096
* hard nproc 4096
# 重启服务,-h 立刻重启,默认间隔一段时间才会开始重启
reboot -h now
5)下载部署包开始部署
# 这里选择 docker-compose 部署方式
git clone https://gitee.com/hadoop-bigdata/docker-compose-es-kibana.git
cd docker-compose-es-kibana
chmod -R 777 es kibana
docker-compose -f docker-compose.yaml up -d
docker-compose ps
四、容器日志采集的三种方式实战操作
1)【第一种方式】:Filebeat 与 应用运行在同一容器(不推荐)
这种方式应用服务与采集服务是没有隔离性的。一般不推荐使用这种方式。这里使用 Trino on k8s 来测试
1、下载 Trino on k8s 包
helm repo add trino https://trinodb.github.io/charts
helm pull trino/trino
tar -xf trino-0.14.0.tgz
2、重新构建镜像(将filebeat打包到Trino镜像中)
【1】下载 trino 镜像
docker pull trinodb/trino:432
【2】下载 Filebeat 部署包
官网地址:https://www.elastic.co/cn/downloads/past-releases#filebeat
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.6.2-linux-x86_64.tar.gz
【3】修改启动脚本
# trio的启动服务脚本:/usr/lib/trino/bin/run-trino
# 注意配置文件,可以打包在容器里,也可以通过configmap管理,配置文件怎么配置,可以看我上面filebeat的文章。
#!/bin/bash
set -xeuo pipefail
launcher_opts=(--etc-dir /etc/trino)
if ! grep -s -q 'node.id' /etc/trino/node.properties; then
launcher_opts+=("-Dnode.id=${HOSTNAME}")
fi
# 启动filebeat服务
nohup /opt/filebeat-7.6.2-linux-x86_64/filebeat -e -c /opt/filebeat-7.6.2-linux-x86_64/filebeat.yml >/dev/null 2>&1 &
exec /usr/lib/trino/bin/launcher run "${launcher_opts[@]}" "$@"
【4】开始重构镜像 Dockerfile
FROM trinodb/trino:432
ADD filebeat-7.6.2-linux-x86_64.tar.gz /opt/
COPY run-trino /usr/lib/trino/bin/run-trino
CMD ["/usr/lib/trino/bin/run-trino"]
【5】开始部署
helm install mytrino ./trino -n trino --create-namespace
2)【第二种方式】:Filebeat 与 应用运行不在同一容器
1、Pod 下容器之间目录共享实现
默认情况下pod中的容器目录是不共享的,kubernets 可以通过emptyDir实现在同一Pod的不同容器间共享文件系统。示例如下:
apiVersion: v1
kind: Pod
metadata:
name: volume-emptydir
spec:
containers:
- name: write
image: centos:centos7
imagePullPolicy: IfNotPresent
command: ["bash", "-c", "echo haha > /data/1.txt ;sleep 600000" ]
volumeMounts:
- name: data
mountPath: /data
- name: read
image: centos:centos7
imagePullPolicy: IfNotPresent
command: ["bash", "-c", "cat /data/1.txt ; sleep 600000"]
volumeMounts:
- name: data
mountPath: /data
volumes:
- name: data
emptyDir: {}
2、开始编排部署
【1】添加 coordinator/worker 日志采集配置,trino/templates/deployment-coordinator.yaml,trino/templates/deployment-worker.yaml
containers:
- args:
- -e
- -E
- http.enabled=true
env:
- name: POD_NAMESPACE
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
- name: NODE_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: spec.nodeName
image: docker.elastic.co/beats/filebeat:7.17.3
imagePullPolicy: IfNotPresent
livenessProbe:
exec:
command:
- sh
- -c
- |
#!/usr/bin/env bash -e
curl --fail 127.0.0.1:5066
failureThreshold: 3
initialDelaySeconds: 10
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 5
name: filebeat
readinessProbe:
exec:
command:
- sh
- -c
- |
#!/usr/bin/env bash -e
filebeat test output
failureThreshold: 3
initialDelaySeconds: 10
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 5
resources:
limits:
cpu: "1"
memory: 200Mi
requests:
cpu: 100m
memory: 100Mi
securityContext:
privileged: false
runAsUser: 0
volumeMounts:
- mountPath: /usr/share/filebeat/filebeat.yml
name: filebeat-config
readOnly: true
subPath: filebeat.yml
- name: data-share-dir
mountPath: /data/trino/var
volumes:
- configMap:
defaultMode: 384
name: filebeat-config
name: filebeat-config
- name: data-share-dir
emptyDir: {}
# trino 镜像配置也得加上这个共享目录的挂载
volumeMounts:
- name: data-share-dir
mountPath: /data/trino/var
filebeat configmap 配置
apiVersion: v1
data:
filebeat.yml: |
filebeat.inputs:
- type: container
paths:
- /data/trino/var/log/*.log
fields:
index: k8s-pod-log
processors:
- add_kubernetes_metadata:
host: ${NODE_NAME}
matchers:
- logs_path:
logs_path: "/data/trino/var/log/"
output.elasticsearch:
host: '${NODE_NAME}'
hosts: '192.168.182.110:9200'
index: "filebeat-%{[fields][index]}-%{+yyyy.MM.dd}"
setup.template.name: "default@template"
setup.template.pattern: "filebeat-k8s-*"
setup.ilm.enabled: false
kind: ConfigMap
metadata:
annotations:
meta.helm.sh/release-name: filebeat
meta.helm.sh/release-namespace: logging
labels:
app: filebeat-filebeat
app.kubernetes.io/managed-by: Helm
name: filebeat-config
3)【第三种方式】通过 Kubernetes Filebeat DaemonSet
这种采集方式可以参考我这篇文章:Filebeat on k8s 日志采集实战操作
容器日志采集的三种方式实战操作讲解就先到这里了,有任何疑问也可关注我公众号:大数据与云原生技术分享,进行技术交流,如本篇文章对您有所帮助,麻烦帮忙一键三连(点赞、转发、收藏)~
- 上一篇: Consul集群搭建
- 下一篇: 轻量级的日志采集组件 Filebeat 讲解与实战操作
猜你喜欢
- 2024-09-22 经典案例复盘——运维专家讲述如何实现K8S落地
- 2024-09-22 EFK 日志系统收集K8s日志 (二)
- 2024-09-22 Docker安装ELK并实现JSON格式日志分析
- 2024-09-22 开发利器丨如何使用ELK设计微服务中的日志收集方案?
- 2024-09-22 智汇华云 | 集群日志动态采集方案
- 2024-09-22 使用Elastic进行事件响应的便携式SIEM
- 2024-09-22 日志服务架构设计
- 2024-09-22 如何将 Python 项目日志接入到 ELK
- 2024-09-22 搭建ELK容器化,so easy
- 2024-09-22 Elasticsearch Service 数据接入
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)