推荐阅读

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 收集容器日志相关推荐

  1. 部署filebeat收集nginx日志

    搭建filebeat自动发现日志 在上一篇博客我们部署了logstash去读取日志,但是logstash需要消耗的资源较大.在每台客户端安装logstash不现实. Filebeat是一个轻量级的日志 ...

  2. 容器服务Windows Kubernetes使用阿里云日志服务来收集容器日志

    目前,容器服务Windows Kubernetes支持将业务容器产生的stdout输出.日志文件同步到阿里云日志服务(SLS)进行统一管理. 支撑组件安装 在Windows Kubernetes集群安 ...

  3. filebeat收集java日志_filebeat采集多个项目日志 | 吴老二

    filebeat采集的日志内容包含java项目的和nginx日志,前期规划不同服务的日志路径应该进行区分.我们这里没有区分,java项目的日志和nginx的日志都存在一个路径下,导致在收集日志的时候, ...

  4. Spark On K8S(Standalone模式部署)

    Spark on K8S 的几种模式 Standalone:在 K8S 启动一个长期运行的集群,所有 Job 都通过 spark-submit 向这个集群提交 Kubernetes Native:通过 ...

  5. 容器日志管理 (2) 开源日志管理方案 ELK/EFK

    本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章.上一篇<容器日志管理(1)>中介绍了Docker自带的logs子命令 ...

  6. 你必须知道的容器日志 (2) 开源日志管理方案 ELK/EFK

    本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章.上一篇<你必须知道的容器日志(1)>中介绍了Docker自带的log ...

  7. ELK:收集k8s容器日志最佳实践

    简介 关于日志收集这个主题,这已经是第三篇了,为什么一再研究这个课题,因为这个课题实在太重要,而当今优秀的开源解决方案还不是很明朗: 就docker微服务化而言,研发有需求标准输出,也有需求文件输出, ...

  8. Filebeat 收集日志的那些事儿

    女主宣言 最近因为云原生日志收集的需要,我们打算使用Filebeat作为容器日志收集工具,并对其进行二次开发,因此笔者将谈谈 Filebeat 收集日志的那些事儿.本文不涉及过具体的源码分析,希望通过 ...

  9. Sidecar 模式

    Sidecar 模式是 Istio 服务网格采用的模式,在服务网格出现之前该模式就一直存在,尤其是当微服务出现后开始盛行,本文讲解 Sidecar 模式. 什么是 Sidecar 模式 将应用程序的功 ...

最新文章

  1. Python爬虫破解有道翻译
  2. 因女朋友的一个建议,这位程序员创立仅 551 天公司就被 10 亿美元收购了
  3. STL之hashtable源代码剖析
  4. php 像页面输出html,PHP在页面中原样输出HTML代码的方法介绍
  5. 一个简单的python爬虫(转)
  6. 51nod 1421 最大MOD值
  7. Linux for sougou ping yin (http://pinyin.sogou.com/linux/help.php)
  8. Java8函数式编程(5)--中间操作(源码)
  9. A little something to get you started
  10. 青客宝团队Consul内部分享ppt
  11. 【华为云技术分享】华为云多元计算+AI 打造企业级智能数据湖
  12. 看ct片子的软件_X光、CT、核磁、B超的辐射到底对孩子有多大影响?
  13. Java学习笔记十:Java的数组以及操作数组
  14. L2-004 这是二叉搜索树吗?(二叉树)
  15. 网络安全学习第16篇 - CE游戏动态内存修改器
  16. ffmpeg处理——*.flv视频文件和*.ass字幕文件合并成mp4
  17. 高通CSRA6640单芯片DDFA放大器解决方案
  18. USRPx310的底板介绍
  19. 一周“金”榜:CSDN创作者收益周排行榜(1月3日到1月9日)
  20. python快速排名seo代码_seo评价机制图(python快速排名seo)

热门文章

  1. UVALive6929 Sums【数学】
  2. CCF201604-3 路径解析(解法三)(90分)(废除!!!)
  3. 【等价转换】—— min/max 的转换与互相转换
  4. Python Tricks(一)—— np.where 与最大最小截断
  5. 算法 —— 实用程序片段
  6. pygame模块_pygame模块方法和事件
  7. 自学python单片机编程-Python玩转单片机:从基础到进阶,几款主流的开发板大盘点!...
  8. python是干什么的-python学来主要是干什么的
  9. 学了python能干啥举例-原来Python可以做这么多有趣的事情
  10. python自动化办公入门书籍-用Python自动办公,做职场高手 | 「讲文兄博客」