K8S 使用 SideCar 模式部署 Filebeat 收集容器日志
推荐阅读
Helm3(K8S 资源对象管理工具)视频教程:https://edu.csdn.net/course/detail/32506
Helm3(K8S 资源对象管理工具)博客专栏:https://blog.csdn.net/xzk9381/category_10895812.html
本文原文链接:https://blog.csdn.net/xzk9381/article/details/109535759,转载请注明出处。如有发现文章中的任何问题,欢迎评论区留言。
对于 K8S 内的容器日志收集,一般有两种常用的方式:
- 使用 DaemonSet 在每台 Node 上部署一个日志收集容器,用于收集当前 Node 上所有容器挂载到宿主机目录下的日志
- 使用 SideCar 模式将日志收集容器与业务容器部署在同一个 Pod 中,只收集对应容器的日志
这两种方式各有优缺点。使用 DaemonSet 方式部署日志收集服务,管理起来简单,但是如果一个 Node 中运行了过多的 Pod,那么日志收集会存在性能瓶颈。使用 SideCar 模式可以更有针对性的收集容器的日志,但是缺点是在运行了很多的业务时,SideCar 占用的资源也会增加。同时这种方式也会出现跟业务耦合的问题。
在我们实践 K8S 的过程中,结合当前业务的特点,最终选定了 SideCar 的方式,虽然占用的资源会增加,但是基于后期大规模日志收集稳定性的考虑,这些资源消耗是在承受范围之内的。
而日志收集的组件,经过长时间比对各种开源服务,选择了 Filebeat。一个是因为在业务未上容器之前,就是使用的 Filebeat 来收集的日志,在维护方面有很多的经验。还有就是 Filebeat 可以处理一些日志收集中出现的复杂情况,例如对于多行日志的处理(堆栈日志)。
下面对于整个实施步骤进行说明。
一、创建命名空间
首先创建一个命名空间,yaml 文件内容如下:
---
apiVersion: v1
kind: Namespace
metadata:name: ns-smc-gatewaylabels:name: ns-smc-gateway
二、创建 Filebeat 配置文件
由于是使用容器的方式运行 FIlebeat,所以需要使用 Configmap 创建一个 Filebeat 的配置文件,然后通过卷挂载的方式挂载到 Filebeat 容器的指定目录下。
创建 Configmap 的 yaml 文件内容如下(注意命名空间的配置,否则后面 Filebeat 无法挂载 Configmap,如果对于下面的配置有不清楚的地方,可以参考我的另一篇博文:Filebeat根据不同的日志设置不同的索引):
---
apiVersion: v1
kind: ConfigMap
metadata:name: filebeat-confignamespace: ns-smc-gatewaylabels:k8s-app: filebeat
data:filebeat.yml: |-filebeat.idle_timeout: 2sfilebeat.inputs:- type: logpaths:- /opt/logs/app.logfields:type: app-logenabled: truebackoff: 1sbackoff_factor: 2close_inactive: 1hencoding: plainharvester_buffer_size: 262144max_backoff: 10smax_bytes: 10485760scan_frequency: 10stail_lines: true- type: logpaths:- /opt/logs/app.errfields:type: app-err-logenabled: truebackoff: 1sbackoff_factor: 2close_inactive: 1hencoding: plainharvester_buffer_size: 262144max_backoff: 10smax_bytes: 10485760scan_frequency: 10stail_lines: truefilebeat.name: filebeat-shiperfilebeat.spool_zie: 50000output.elasticsearch:bulk_max_size: 8192hosts:- 10.16.12.206:30187- 10.16.12.207:30187- 10.16.12.208:30187- 10.16.13.214:30187- 10.16.13.215:30187index: smc-gateway-%{[fields.type]}-*indices:- index: smc-gateway-app-log-%{+yyyy.MM.dd}when.equals:fields.type: app-log- index: smc-gateway-app-err-log-%{+yyyy.MM.dd}when.equals:fields.type: app-err-logworkers: 4processors:- drop_fields:fields:- agent.ephemeral_id- agent.hostname- agent.id- agent.type- agent.version- ecs.version- input.type- log.offset- version- decode_json_fields:fields:- messagemax_depth: 1overwrite_keys: truesetup.ilm.enabled: falsesetup.template.name: smc-gateway-logsetup.template.pattern: smc-gateway-*setup.template.overwrite: truesetup.template.enabled: true
本文原文链接:https://blog.csdn.net/xzk9381/article/details/109535759,转载请注明出处。如有发现文章中的任何问题,欢迎评论区留言。
三、创建 Deployment
接下来使用 Deployment 控制器来部署 Pod,这个 Pod 中包含了业务容器和 Filebeat 服务容器。yaml 文件内容如下:
---
apiVersion: apps/v1
kind: Deployment
metadata:name: smc-gatewaynamespace: ns-smc-gatewaylabels:app: smc-gateway
spec:replicas: 1selector:matchLabels:app: smc-gatewaytemplate:metadata:name: smc-gatewaylabels:app: smc-gatewayspec:imagePullSecrets:- name: harbor-secretcontainers:- name: smc-gateway-for-test # 业务容器的名称image: 10.16.12.204/smc-gateway/smc-gateway:1.1 # 业务容器镜像的私服下载地址imagePullPolicy: Alwaysenv: # 需要传入到业务容器中的环境变量,在服务启动的时候调用- name: data_centervalue: bx- name: server_modevalue: testvolumeMounts: # 指定业务日志在容器中输出的目录- name: logdatamountPath: /opt/logs- name: filebeat-for-smc-gateway # 指定 Filebeat 容器的名称image: docker.elastic.co/beats/filebeat:7.3.0 # filebeat 镜像下载地址,这里使用的官方镜像仓库args: [ # 指定服务启动时的参数"-c", "/opt/filebeat/filebeat.yml", # 注意这里,文件的路径和名称要和 Configmap 传入的路径和名称一致"-e",]env:- name: POD_IP # 这里是将 pod 的 IP 地址赋值给这个变量传入容器中,便于后面 Filebeat 在日志中添加自定义的字段信息valueFrom:fieldRef:apiVersion: v1fieldPath: status.podIP- name: pod_name # 这里是将 pod 的名称赋值给这个变量,便于后面 Filebeat 在日志中添加自定义的字段信息valueFrom:fieldRef:apiVersion: v1fieldPath: metadata.namesecurityContext: # 这里用于设置 Pod 的安全上下文runAsUser: 0 # 指定容器内的服务以 ID 为 0 的用户运行(也就是root)volumeMounts:- name: config # 指定 filebeat 配置文件要挂载的路径mountPath: /opt/filebeat/- name: logdata # 指定卷的名称,这个名称要和前面业务容器指定的日志路径的卷名称一致,这样后面才会挂载同一个 emptyDir mountPath: /opt/logs/ # 指定要将业务的日志挂载在 filebeat 容器中的路径,这个路径要和 Configmap 中指定的日志路径一致volumes:- name: logdata # 为前面声明名称为 logdata 的卷挂载一个 emptyDir 卷(filebeat 和业务容器都会挂载这个卷)emptyDir: {}- name: config # 为前面声明名称为 config 的卷(filebeat 配置文件)挂载一个 configmap,并指定configmap 的名称configMap:name: filebeat-configitems:- key: filebeat.ymlpath: filebeat.yml
需要注意的是,使用 SideCar 模式收集容器日志实现的本质,就是将业务容器内的日志路径存储到本地宿主机的一个目录下,然后这个目录也会同时挂载到日志收集服务容器中,这样日志收集服务才可以读取到业务的日志。
所以上面的 yaml 文件中,首先业务容器的日志目录声明为一个卷,并命名为 logdata。而下面的 Filebeat 容器中也声明了一个 logdata 的卷。由于这两个卷名称一样,所以这两个卷挂载是同一个 emptyDir。也就实现了在 Filebeat 容器中读取业务日志的目的。当然使用 emptyDir 将容器中的日志存储到宿主机本地并不是持久化存储,emptyDir 会随着容器的删除而销毁。
四、创建 Service
将业务容器的 8080 端口暴露出去,yaml 文件内容如下:
---
apiVersion: v1
kind: Service
metadata:name: smc-servicelabels:app: smc-servicenamespace: ns-smc-gateway
spec:ports:- port: 8080targetPort: 8080nodePort: 30378selector:app: smc-gatewaytype: NodePort
五、验证
将以上 yaml 文件执行后,会在 ns-smc-gateway 命名空间下创建一个 Pod,这个 Pod 中包含两个容器。
[@k8s-master2 ~]# kubectl get pods -n ns-smc-gateway
NAME READY STATUS RESTARTS AGE
smc-gateway-fcf598c4b-wphhr 2/2 Running 0 150m[@k8s-master2 ~]# kubectl describe pod smc-gateway-fcf598c4b-wphhr -n ns-smc-gateway | grep -B1 "Container ID"smc-gateway-for-test:Container ID: docker://3711e3a5bc8fafc94ea174578c0a79774f5b25c7eae6c7aa47759e513645f221
--filebeat-for-smc-gateway:Container ID: docker://1b87242cdf8632edc1bea2fe23910f68c2d5da0254163b123bfc414829f7bea7
此时到 Kibana 中的索引管理中,会看到已经新增了两个业务索引,配置对应的索引模式后,就可以在 Kibana 中看到对应的日志。
本文原文链接:https://blog.csdn.net/xzk9381/article/details/109535759,转载请注明出处。如有发现文章中的任何问题,欢迎评论区留言。
K8S 使用 SideCar 模式部署 Filebeat 收集容器日志相关推荐
- 部署filebeat收集nginx日志
搭建filebeat自动发现日志 在上一篇博客我们部署了logstash去读取日志,但是logstash需要消耗的资源较大.在每台客户端安装logstash不现实. Filebeat是一个轻量级的日志 ...
- 容器服务Windows Kubernetes使用阿里云日志服务来收集容器日志
目前,容器服务Windows Kubernetes支持将业务容器产生的stdout输出.日志文件同步到阿里云日志服务(SLS)进行统一管理. 支撑组件安装 在Windows Kubernetes集群安 ...
- filebeat收集java日志_filebeat采集多个项目日志 | 吴老二
filebeat采集的日志内容包含java项目的和nginx日志,前期规划不同服务的日志路径应该进行区分.我们这里没有区分,java项目的日志和nginx的日志都存在一个路径下,导致在收集日志的时候, ...
- Spark On K8S(Standalone模式部署)
Spark on K8S 的几种模式 Standalone:在 K8S 启动一个长期运行的集群,所有 Job 都通过 spark-submit 向这个集群提交 Kubernetes Native:通过 ...
- 容器日志管理 (2) 开源日志管理方案 ELK/EFK
本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章.上一篇<容器日志管理(1)>中介绍了Docker自带的logs子命令 ...
- 你必须知道的容器日志 (2) 开源日志管理方案 ELK/EFK
本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章.上一篇<你必须知道的容器日志(1)>中介绍了Docker自带的log ...
- ELK:收集k8s容器日志最佳实践
简介 关于日志收集这个主题,这已经是第三篇了,为什么一再研究这个课题,因为这个课题实在太重要,而当今优秀的开源解决方案还不是很明朗: 就docker微服务化而言,研发有需求标准输出,也有需求文件输出, ...
- Filebeat 收集日志的那些事儿
女主宣言 最近因为云原生日志收集的需要,我们打算使用Filebeat作为容器日志收集工具,并对其进行二次开发,因此笔者将谈谈 Filebeat 收集日志的那些事儿.本文不涉及过具体的源码分析,希望通过 ...
- Sidecar 模式
Sidecar 模式是 Istio 服务网格采用的模式,在服务网格出现之前该模式就一直存在,尤其是当微服务出现后开始盛行,本文讲解 Sidecar 模式. 什么是 Sidecar 模式 将应用程序的功 ...
最新文章
- Python爬虫破解有道翻译
- 因女朋友的一个建议,这位程序员创立仅 551 天公司就被 10 亿美元收购了
- STL之hashtable源代码剖析
- php 像页面输出html,PHP在页面中原样输出HTML代码的方法介绍
- 一个简单的python爬虫(转)
- 51nod 1421 最大MOD值
- Linux for sougou ping yin (http://pinyin.sogou.com/linux/help.php)
- Java8函数式编程(5)--中间操作(源码)
- A little something to get you started
- 青客宝团队Consul内部分享ppt
- 【华为云技术分享】华为云多元计算+AI 打造企业级智能数据湖
- 看ct片子的软件_X光、CT、核磁、B超的辐射到底对孩子有多大影响?
- Java学习笔记十:Java的数组以及操作数组
- L2-004 这是二叉搜索树吗?(二叉树)
- 网络安全学习第16篇 - CE游戏动态内存修改器
- ffmpeg处理——*.flv视频文件和*.ass字幕文件合并成mp4
- 高通CSRA6640单芯片DDFA放大器解决方案
- USRPx310的底板介绍
- 一周“金”榜:CSDN创作者收益周排行榜(1月3日到1月9日)
- python快速排名seo代码_seo评价机制图(python快速排名seo)
热门文章
- UVALive6929 Sums【数学】
- CCF201604-3 路径解析(解法三)(90分)(废除!!!)
- 【等价转换】—— min/max 的转换与互相转换
- Python Tricks(一)—— np.where 与最大最小截断
- 算法 —— 实用程序片段
- pygame模块_pygame模块方法和事件
- 自学python单片机编程-Python玩转单片机:从基础到进阶,几款主流的开发板大盘点!...
- python是干什么的-python学来主要是干什么的
- 学了python能干啥举例-原来Python可以做这么多有趣的事情
- python自动化办公入门书籍-用Python自动办公,做职场高手 | 「讲文兄博客」