iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >如何进行K8s日志采集最佳实践
  • 492
分享到

如何进行K8s日志采集最佳实践

2023-06-04 13:06:46 492人浏览 八月长安
摘要

这篇文章将为大家详细讲解有关如何进行k8s日志采集最佳实践,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。kubernetes 日志采集难点在 Kubernetes 中,日志采集相比传统虚拟机

这篇文章将为大家详细讲解有关如何进行k8s日志采集最佳实践,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

kubernetes 日志采集难点

在 Kubernetes 中,日志采集相比传统虚拟机、物理机方式要复杂很多,最根本的原因是 Kubernetes 把底层异常屏蔽,提供更加细粒度的资源调度,向上提供稳定、动态的环境。因此日志采集面对的是更加丰富、动态的环境,需要考虑的点也更加的多。

例如:

  • 对于运行时间很短的 Job 类应用,从启动到停止只有几秒的时间,如何保证日志采集的实时性能够跟上而且数据不丢?

  • K8s 一般推荐使用大规格节点,每个节点可以运行 10-100+ 的容器,如何在资源消耗尽可能低的情况下采集 100+ 的容器?

  • 在 K8s 中,应用都以 yaml 的方式部署,而日志采集还是以手工的配置文件形式为主,如何能够让日志采集以 K8s 的方式进行部署?


Kubernetes传统方式
日志种类文件、stdout、宿主机文件、journal文件、journal
日志源业务容器、系统组件、宿主机业务、宿主机
采集方式Agent(Sidecar、DaemonSet)、直写(DockerEngine、业务)Agent、直写
单机应用数10-1001-10
应用动态性
节点动态性
采集部署方式手动、Yaml手动、自定义

采集方式:主动 or 被动

日志的采集方式分为被动采集和主动推送两种,在 K8s 中,被动采集一般分为 Sidecar 和 DaemonSet 两种方式,主动推送有 DockerEngine 推送和业务直写两种方式。

  • DockerEngine 本身具有 LogDriver 功能,可通过配置不同的 LogDriver 将容器的 stdout 通过 DockerEngine 写入到远端存储,以此达到日志采集的目的。这种方式的可定制化、灵活性、资源隔离性都很低,一般不建议在生产环境中使用;

  • 业务直写是在应用中集成日志采集的 SDK,通过 SDK 直接将日志发送到服务端。这种方式省去了落盘采集的逻辑,也不需要额外部署 Agent,对于系统的资源消耗最低,但由于业务和日志 SDK 强绑定,整体灵活性很低,一般只有日志量极大的场景中使用;

  • DaemonSet 方式在每个 node 节点上只运行一个日志 agent,采集这个节点上所有的日志。DaemonSet 相对资源占用要小很多,但扩展性、租户隔离性受限,比较适用于功能单一或业务不是很多的集群

  • Sidecar 方式为每个 POD 单独部署日志 agent,这个 agent 只负责一个业务应用的日志采集。Sidecar 相对资源占用较多,但灵活性以及多租户隔离性较强,建议大型的 K8s 集群或作为 PaaS 平台为多个业务方服务的集群使用该方式。

如何进行K8s日志采集最佳实践

总结下来:

  • DockerEngine 直写一般不推荐;

  • 业务直写推荐在日志量极大的场景中使用;

  • DaemonSet 一般在中小型集群中使用;

  • Sidecar 推荐在超大型的集群中使用。

详细的各种采集方式对比如下:


DockerEngine业务直写DaemonSet方式Sidecar方式
采集日志类型标准输出业务日志标准输出+部分文件文件
部署运维低,原生支持低,只需维护好配置文件即可一般,需维护DaemonSet较高,每个需要采集日志的POD都需要部署sidecar容器
日志分类存储无法实现业务独立配置一般,可通过容器/路径等映射每个POD可单独配置,灵活性高
多租户隔离弱,日志直写会和业务逻辑竞争资源一般,只能通过配置间隔离强,通过容器进行隔离,可单独分配资源
支持集群规模本地存储无限制,若使用syslog、fluentd会有单点限制无限制取决于配置数无限制
资源占用低,docker


engine提供整体最低,省去采集开销较低,每个节点运行一个容器较高,每个POD运行一个容器
查询便捷性低,只能grep原始日志高,可根据业务特点进行定制较高,可进行自定义的查询、统计高,可根据业务特点进行定制
可定制性高,可自由扩展高,每个POD单独配置
耦合度高,与DockerEngine强绑定,修改需要重启DockerEngine高,采集模块修改/升级需要重新发布业务低,Agent可独立升级一般,默认采集Agent升级对应Sidecar业务也会重启(有一些扩展包可以支持Sidecar热升级)
适用场景测试、POC等非生产场景对性能要求极高的场景日志分类明确、功能较单一的集群大型、混合型、PAAS型集群

日志输出:Stdout or 文件

和虚拟机/物理机不同,K8s 的容器提供标准输出和文件两种方式。在容器中,标准输出将日志直接输出到 stdout 或 stderr,而 DockerEngine 接管 stdout 和 stderr 文件描述符,将日志接收后按照 DockerEngine 配置的 LogDriver 规则进行处理;日志打印到文件的方式和虚拟机/物理机基本类似,只是日志可以使用不同的存储方式,例如默认存储、EmptyDir、HostVolume、NFS 等。

虽然使用 Stdout 打印日志是 Docker 官方推荐的方式,但大家需要注意:这个推荐是基于容器只作为简单应用的场景,实际的业务场景中我们还是建议大家尽可能使用文件的方式,主要的原因有以下几点:

  • Stdout 性能问题,从应用输出 stdout 到服务端,中间会经过好几个流程(例如普遍使用的 JSON LogDriver):应用 stdout -> DockerEngine -> LogDriver -> 序列化成 jsON -> 保存到文件 -> Agent 采集文件 -> 解析 JSON -> 上传服务端。整个流程相比文件的额外开销要多很多,在压测时,每秒 10 万行日志输出就会额外占用 DockerEngine 1 个 CPU 核;

  • Stdout 不支持分类,即所有的输出都混在一个流中,无法像文件一样分类输出,通常一个应用中有 AccessLog、ErrorLog、InterfaceLog(调用外部接口的日志)、TraceLog 等,而这些日志的格式、用途不一,如果混在同一个流中将很难采集和分析;

  • Stdout 只支持容器的主程序输出,如果是 daemon/fork 方式运行的程序将无法使用 stdout;

  • 文件的 Dump 方式支持各种策略,例如同步/异步写入、缓存大小、文件轮转策略、压缩策略、清除策略等,相对更加灵活。

因此我们建议线上应用使用文件的方式输出日志,Stdout 只在功能单一的应用或一些 K8s 系统/运维组件中使用。

CICD集成:Logging Operator

如何进行K8s日志采集最佳实践

Kubernetes 提供了标准化的业务部署方式,可以通过 yaml(K8s api)来声明路由规则、暴露服务、挂载存储、运行业务、定义缩扩容规则等,所以 Kubernetes 很容易和 CICD 系统集成。而日志采集也是运维监控过程中的重要部分,业务上线后的所有日志都要进行实时的收集。

原始的方式是在发布之后手动去部署日志采集的逻辑,这种方式需要手工干预,违背 CICD 自动化的宗旨;为了实现自动化,有人开始基于日志采集的 API/SDK 包装一个自动部署的服务,在发布后通过 CICD 的 WEBhook 触发调用,但这种方式的开发代价很高。

在 Kubernetes 中,日志最标准的集成方式是以一个新资源注册到 Kubernetes 系统中,以 Operator(CRD)的方式来进行管理和维护。在这种方式下,CICD 系统不需要额外的开发,只需在部署到 Kubernetes 系统时附加上日志相关的配置即可实现。

Kubernetes 日志采集方案

如何进行K8s日志采集最佳实践

早在 Kubernetes 出现之前,我们就开始为容器环境开发日志采集方案,随着 K8s 的逐渐稳定,我们开始将很多业务迁移到 K8s 平台上,因此也基于之前的基础专门开发了一套 K8s 上的日志采集方案。主要具备的功能有:

  • 支持各类数据的实时采集,包括容器文件、容器 Stdout、宿主机文件、Journal、Event 等;

  • 支持多种采集部署方式,包括 DaemonSet、Sidecar、DockerEngine LogDriver 等;

  • 支持对日志数据进行富化,包括附加 Namespace、Pod、Container、Image、Node 等信息;

  • 稳定、高可靠,基于阿里自研的 Logtail 采集 Agent 实现,目前全网已有几百万的部署实例;

  • 基于 CRD 进行扩展,可使用 Kubernetes 部署发布的方式来部署日志采集规则,与 CICD 完美集成。

安装日志采集组件

目前这套采集方案已经对外开放,我们提供了一个 Helm 安装包,其中包括 Logtail 的 DaemonSet、AliyunloGConfig 的 CRD 声明以及 CRD Controller,安装之后就能直接使用 DaemonSet 采集以及 CRD 配置了。安装方式如下:

  1. 阿里云 Kubernetes 集群在开通的时候可以勾选安装,这样在集群创建的时候会自动安装上述组件。如果开通的时候没有安装,则可以手动安装;

  2. 如果是自建的 Kubernetes,无论是在阿里云上自建还是在其他云或者是线下,也可以使用这样采集方案。

安装好上述组件之后,Logtail 和对应的 Controller 就会运行在集群中,但默认这些组件并不会采集任何日志,需要配置日志采集规则来采集指定 Pod 的各类日志。

采集规则配置:环境变量 or CRD

除了在日志服务控制台上手动配置之外,对于 Kubernetes 还额外支持两种配置方式:环境变量和 CRD。

  • 环境变量是自 swarm 时代一直使用的配置方式,只需要在想要采集的容器环境变量上声明需要采集的数据地址即可,Logtail 会自动将这些数据采集到服务端;

这种方式部署简单,学习成本低,很容易上手;但能够支持的配置规则很少,很多高级配置(例如解析方式、过滤方式、黑白名单等)都不支持,而且这种声明的方式不支持修改/删除,每次修改其实都是创建 1 个新的采集配置,历史的采集配置需要手动清理,否则会造成资源浪费。

如何进行K8s日志采集最佳实践

  • CRD 配置方式是非常符合 Kubernetes 官方推荐的标准扩展方式,让采集配置以 K8s 资源的方式进行管理,通过向 Kubernetes 部署 AliyunLogConfig 这个特殊的 CRD 资源来声明需要采集的数据。

例如下面的示例就是部署一个容器标准输出的采集,其中定义需要 Stdout 和 Stderr 都采集,并且排除环境变量中包含 COLLEXT_STDOUT_FLAG:false 的容器。

基于 CRD 的配置方式以 Kubernetes 标准扩展资源的方式进行管理,支持配置的增删改查完整语义,而且支持各种高级配置,是我们极其推荐的采集配置方式。

如何进行K8s日志采集最佳实践

采集规则推荐的配置方式

如何进行K8s日志采集最佳实践

实际应用场景中,一般都是使用 DaemonSet 或 DaemonSet 与 Sidecar 混用方式,DaemonSet 的优势是资源利用率高,但有一个问题是 DaemonSet 的所有 Logtail 都共享全局配置,而单一的 Logtail 有配置支撑的上限,因此无法支撑应用数比较多的集群。

上述是我们给出的推荐配置方式,核心的思想是:

  • 一个配置尽可能多的采集同类数据,减少配置数,降低 DaemonSet 压力;

  • 核心的应用采集要给予充分的资源,可以使用 Sidecar 方式;

  • 配置方式尽可能使用 CRD 方式;

  • Sidecar 由于每个 Logtail 是单独的配置,所以没有配置数的限制,这种比较适合于超大型的集群使用。

实践 1 - 中小型集群

如何进行K8s日志采集最佳实践

绝大部分 Kubernetes 集群都属于中小型的,对于中小型没有明确的定义,一般应用数在 500 以内,节点规模 1000 以内,没有职能明确的 Kubernetes 平台运维。这种场景应用数不会特别多,DaemonSet 可以支撑所有的采集配置:

  • 绝大部分业务应用的数据使用 DaemonSet 采集方式;

  • 核心应用(对于采集可靠性要求比较高,例如订单/交易系统)使用 Sidecar 方式单独采集。

实践 2 - 大型集群

如何进行K8s日志采集最佳实践

对于一些用作 PaaS 平台的大型/超大型集群,一般业务在 1000 以上,节点规模也在 1000 以上,有专门的 Kubernetes 平台运维人员。这种场景下应用数没有限制,DaemonSet 无法支持,因此必须使用 Sidecar 方式,整体规划如下:

  • Kubernetes 平台本身的系统组件日志、内核日志相对种类固定,这部分日志使用 DaemonSet 采集,主要为平台的运维人员提供服务;

  • 各个业务的日志使用 Sidecar 方式采集,每个业务可以独立设置 Sidecar 的采集目的地址,为业务的 devops 人员提供足够的灵活性

关于如何进行K8s日志采集最佳实践就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: 如何进行K8s日志采集最佳实践

本文链接: https://www.lsjlt.com/news/238047.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何进行K8s日志采集最佳实践
    这篇文章将为大家详细讲解有关如何进行K8s日志采集最佳实践,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Kubernetes 日志采集难点在 Kubernetes 中,日志采集相比传统虚拟机...
    99+
    2023-06-04
  • 如何在Python中进行日志处理和调试的最佳实践和技巧
    如何在Python中进行日志处理和调试的最佳实践和技巧引言在编写大型Python应用程序时,日志处理和调试是非常重要的,它们能够帮助我们追踪问题、诊断错误和改进代码。本文将介绍在Python中进行日志处理和调试的最佳实践和技巧,以及具体的代...
    99+
    2023-10-22
    Python 调试 日志处理
  • Django中log日志记录的最佳实践
    目录1、模块总览2、Loggers3、Handlers4、Filters5、Formatters6、日志记录方式7、logger 参数解析8、handler 参数解析1.Rotati...
    99+
    2023-05-17
    Django项目中日志记录 django 中如何优雅的记录日志 django配置log日志
  • 日志开发技术:PHP的最佳实践
    日志开发技术:PHP的最佳实践 日志是软件开发中非常重要的一部分,它可以记录应用程序在运行过程中的状态信息、错误信息、调试信息等。在PHP开发中,我们经常需要记录一些日志信息,以便于快速定位和解决问题。在本文中,我们将介绍PHP中的日志开发...
    99+
    2023-10-08
    load 日志 开发技术
  • 日志开发技术:PHP中的最佳实践
    日志开发技术:PHP中的最佳实践 日志记录是一个重要的开发技术,它可以让开发者在开发过程中更好地了解应用程序的运行情况,以及用户的操作行为。在PHP开发中,我们可以使用一些最佳实践来记录应用程序的日志。本文将介绍PHP中的一些最佳实践,并提...
    99+
    2023-10-08
    load 日志 开发技术
  • PHP开发中日志记录的最佳实践
    php 中日志记录的最佳实践是使用 monolog 库,其定义了日志级别(debug、info 等),允许开发人员记录应用程序活动。该库可以安装并添加到项目中,用于记录日志消息并将其发送...
    99+
    2024-05-09
    php 日志 composer
  • 怎么进行Linux 运维最佳实践
    本篇文章为大家展示了怎么进行Linux 运维最佳实践,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。我们面对的是一个不断变化的世界,业务需求在变,技术架构在变,开源工具与商业系统异构部署,新工具和技术...
    99+
    2023-06-19
  • 打包Unix日志的最佳实践:Java的角度。
    打包Unix日志的最佳实践:Java的角度 随着企业应用程序的不断发展,日志文件也变得越来越重要。日志文件可以帮助开发人员和系统管理员查找问题,分析性能和跟踪历史记录。在Unix系统中,通常使用syslogd守护进程来管理系统日志文件。但是...
    99+
    2023-11-14
    unix 日志 打包
  • filebeat采集不到日志如何解决
    以下是一些可能的解决方法:1. 确保Filebeat配置文件正确设置了输入源和输出目标。检查`filebeat.yml`文件中的`p...
    99+
    2023-10-11
    filebeat
  • Java应用程序日志记录的最佳实践
    Java应用程序日志记录的最佳实践 在Java应用程序的开发过程中,日志记录是非常重要的。通过日志记录,我们可以轻松地跟踪应用程序的运行状况,并找出可能存在的问题。本文将介绍Java应用程序日志记录的最佳实践,以及如何在Java应用程序中实...
    99+
    2023-09-04
    日志 javascript django
  • Istio最佳实践:在K8s上通过Istio服务网格进行灰度发布
    Istio是Google继Kubernetes之后的又一开源力作,主要参与的公司包括Google,IBM,Lyft等公司。它提供了完整的非侵入式的微服务治理解决方案,包含微服务的管理、网络连接以及安全管理等关键能力,无需修改任何代码就能够实...
    99+
    2023-06-04
  • 处理大数据日志:PHP和Linux的最佳实践
    随着互联网的飞速发展,数据量的增长速度也在加快。大量的数据需要存储和处理,而日志数据是其中的一种。处理日志数据是一个非常重要的任务,因为它可以帮助企业了解其业务运营情况,发现问题并做出相应的决策。本文将介绍如何使用PHP和Linux来处理...
    99+
    2023-09-10
    linux 日志 大数据
  • Go 日志与 Git 同步的最佳实践是什么?
    Go 语言是一种支持高并发的语言,常用于网络编程和后端开发。在 Go 项目中,日志是一个非常重要的组成部分,它可以帮助我们快速排查问题和了解系统运行状况。然而,日志的管理也是一个比较麻烦的问题,特别是在多人协作的团队中。为了更好地管理日志...
    99+
    2023-07-18
    日志 同步 git
  • SpringCloud中如何进行日志收集Kafka-ELK
    本篇文章给大家分享的是有关SpringCloud中如何进行日志收集Kafka-ELK,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。微服务应用在容器化后,日志的查询就会变成困难的...
    99+
    2023-06-19
  • PHP响应路径日志的最佳实践是什么?
    在现代的Web应用程序中,处理请求和响应是至关重要的。当我们需要调试应用程序或跟踪错误时,路径日志是非常有用的。PHP作为一种流行的服务器端编程语言,有许多方法可以记录路径日志。在本文中,我们将探讨一些PHP响应路径日志的最佳实践。 使...
    99+
    2023-08-03
    响应 path 日志
  • 大数据存储:Python日志记录的最佳实践
    随着大数据技术的发展,数据量的增加,数据存储的方式也在不断地发生变化。对于大数据存储来说,Python日志记录是一个非常重要的方面。在这篇文章中,我们将介绍Python日志记录的最佳实践,帮助您更好地管理和存储大量的数据。 一、Pytho...
    99+
    2023-06-19
    日志 存储 大数据
  • Java日志记录的最佳实践:如何处理并发和大数据?
    Java是一种广泛使用的编程语言,开发人员经常需要记录应用程序运行过程中的事件和错误信息。Java日志记录是一种用于记录应用程序运行过程中的事件和错误信息的技术。Java日志记录的目的是为了帮助开发人员诊断和解决问题。在实际开发中,Jav...
    99+
    2023-09-25
    日志 并发 大数据
  • Java和Apache:构建实时日志分析器的最佳实践
    日志分析是现代软件开发和维护中不可或缺的一环。日志分析可以帮助我们了解应用程序的行为,快速发现和解决问题。在实时日志分析方面,Java和Apache是一对强力组合。本文将介绍如何使用Java和Apache构建实时日志分析器的最佳实践。 ...
    99+
    2023-07-26
    apache 日志 实时
  • 存储同步日志的最佳实践:GO 语言指南
    日志是软件开发中不可或缺的一部分。随着应用程序规模的增长,日志的数量和复杂度也会增加。为了保证程序的可靠性和可维护性,需要将日志存储在可靠的位置并进行同步。在本文中,我们将介绍如何使用 GO 语言实现存储同步日志的最佳实践,并提供示例代码...
    99+
    2023-08-10
    存储 同步 日志
  • ASP日志记录:Linux系统的最佳实践是什么?
    在Linux系统中,ASP日志记录是一项非常重要的任务,它可以帮助我们了解系统的运行情况,并及时发现和解决问题。但是,如果没有一个正确的日志记录策略,日志文件可能会无限增长,导致系统性能下降,甚至磁盘空间耗尽。因此,在这篇文章中,我们将介...
    99+
    2023-09-12
    日志 linux 学习笔记
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作