系列文章:Kubernetes日志采集最佳实践

前言

上一期主要介绍Kubernetes日志输出的一些注意事项,日志输出最终的目的还是做统一的采集和分析。在Kubernetes中,日志采集和普通虚拟机的方式有很大不同,相对实现难度和部署代价也略大,但若使用恰当则比传统方式自动化程度更高、运维代价更低。

Kubernetes日志采集难点

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

例如:

  1. 对于运行时间很短的Job类应用,从启动到停止只有几秒的时间,如何保证日志采集的实时性能够跟上而且数据不丢?
  2. K8s一般推荐使用大规格节点,每个节点可以运行10-100+的容器,如何在资源消耗尽可能低的情况下采集100+的容器?
  3. 在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平台为多个业务方服务的集群使用该方式。

image.png

总结下来: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官方推荐的方式,但大家需要注意这个推荐是基于容器只作为简单应用的场景,实际的业务场景中我们还是建议大家尽可能使用文件的方式,主要的原因有以下几点:

  1. Stdout性能问题,从应用输出stdout到服务端,中间会经过好几个流程(例如普遍使用的JSON LogDriver):应用stdout -> DockerEngine -> LogDriver -> 序列化成JSON -> 保存到文件 -> Agent采集文件 -> 解析JSON -> 上传服务端。整个流程相比文件的额外开销要多很多,在压测时,每秒10万行日志输出就会额外占用DockerEngine 1个CPU核。
  2. Stdout不支持分类,即所有的输出都混在一个流中,无法像文件一样分类输出,通常一个应用中有AccessLog、ErrorLog、InterfaceLog(调用外部接口的日志)、TraceLog等,而这些日志的格式、用途不一,如果混在同一个流中将很难采集和分析。
  3. Stdout只支持容器的主程序输出,如果是daemon/fork方式运行的程序将无法使用stdout。
  4. 文件的Dump方式支持各种策略,例如同步/异步写入、缓存大小、文件轮转策略、压缩策略、清除策略等,相对更加灵活。

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

CICD集成:Logging Operator

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

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

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

Kubernetes日志采集方案

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

  1. 支持各类数据的实时采集,包括容器文件、容器Stdout、宿主机文件、Journal、Event等;
  2. 支持多种采集部署方式,包括DaemonSet、Sidecar、DockerEngine LogDriver等;
  3. 支持对日志数据进行富化,包括附加Namespace、Pod、Container、Image、Node等信息;
  4. 稳定、高可靠,基于阿里自研的Logtail采集Agent实现,目前全网已有几百万的部署实例;
  5. 基于CRD进行扩展,可使用Kubernetes部署发布的方式来部署日志采集规则,与CICD完美集成。

安装日志采集组件

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

  1. 阿里云Kubernetes集群在开通的时候可以勾选安装,这样在集群创建的时候会自动安装上述组件。如果开通的时候没有安装,则可以手动安装。
  2. 如果是自建的Kubernetes,无论是在阿里云上自建还是在其他云或者是线下,也可以使用这样采集方案,具体安装方式参考[自建Kubernetes安装]()。

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

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

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

环境变量是自swarm时代一直使用的配置方式,只需要在想要采集的容器环境变量上声明需要采集的数据地址即可,Logtail会自动将这些数据采集到服务端。这种方式部署简单,学习成本低,很容易上手;但能够支持的配置规则很少,很多高级配置(例如解析方式、过滤方式、黑白名单等)都不支持,而且这种声明的方式不支持修改/删除,每次修改其实都是创建1个新的采集配置,历史的采集配置需要手动清理,否则会造成资源浪费。
image.png
CRD配置方式是非常符合Kubernetes官方推荐的标准扩展方式,让采集配置以K8s资源的方式进行管理,通过向Kubernetes部署AliyunLogConfig这个特殊的CRD资源来声明需要采集的数据。例如下面的示例就是部署一个容器标准输出的采集,其中定义需要Stdout和Stderr都采集,并且排除环境变量中包含COLLEXT_STDOUT_FLAG:false的容器。
基于CRD的配置方式以Kubernetes标准扩展资源的方式进行管理,支持配置的增删改查完整语义,而且支持各种高级配置,是我们极其推荐的采集配置方式。
image.png

采集规则推荐的配置方式

image.png

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

  1. 一个配置尽可能多的采集同类数据,减少配置数,降低DaemonSet压力;
  2. 核心的应用采集要给予充分的资源,可以使用Sidecar方式;
  3. 配置方式尽可能使用CRD方式;
  4. Sidecar由于每个Logtail是单独的配置,所以没有配置数的限制,这种比较适合于超大型的集群使用。

实践1-中小型集群

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

  1. 绝大部分业务应用的数据使用DaemonSet采集方式
  2. 核心应用(对于采集可靠性要求比较高,例如订单/交易系统)使用Sidecar方式单独采集

实践2-大型集群

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

  1. Kubernetes平台本身的系统组件日志、内核日志相对种类固定,这部分日志使用DaemonSet采集,主要为平台的运维人员提供服务;
  2. 各个业务的日志使用Sidecar方式采集,每个业务可以独立设置Sidecar的采集目的地址,为业务的DevOps人员提供足够的灵活性。

原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/516665.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JFrog Container Registry 搭建Docker镜像仓库 (tar.gz 版本)

文章目录1. 下载安装包2. 解压3. 启动软件4. 防火墙5. 效果验证1. 下载安装包 https://www.jfrog.com/ 2. 解压 tar -zxvf jfrog-artifactory-jcr-7.27.10-linux.tar.gz3. 启动软件 前台启动 cd /app/artifactory-jcr-7.27.10/app/bin./artifactory.sh4. 防火墙 关闭防…

智领云荣登“中国大数据企业50强” | 2020大数据产业生态大会盛大召开 智领云斩获多项殊荣

近年来,我国大数据生态环境不断向好,产业发展维持高增长态势,大数据技术在与政府、企业核心业务的融合中,释放出了更多创新活力和应用潜能。 8月27日,2020(第五届)大数据产业生态大会在京隆重召…

性能提升约7倍!Apache Flink 与 Apache Hive 的集成

导读:随着 Flink 在流式计算的应用场景逐渐成熟和流行,如果 Flink 能同时把批量计算的应用场景处理好,就能减少用户在使用 Flink 时开发和维护的成本,并且能够丰富 Flink 的生态。SQL 是批计算中比较常用的工具,所以 Flink 针对于…

日均万亿条数据如何处理?爱奇艺实时计算平台这样做

摘要:本文由爱奇艺大数据服务负责人梁建煌分享,介绍爱奇艺如何基于 Apache Flink 技术打造实时计算平台,并通过业务应用案例分享帮助用户了解 Apache Flink 的技术特点及应用场景。提纲如下: 爱奇艺 Flink 服务现状Flink 改进实时…

进入编译器后,一个函数经历了什么?

来源 | 编程技术宇宙责编 | Carol封图 | CSDN 付费下载自视觉中国我是一个函数我是一个函数,名叫str_upper,我可以把输入的字符串从小写变成大写。不信你看,我长这样:char* str_upper(char* str, int len) {char upper[256];if (l…

docker sonarqube 7.7 sonar-scanner-4.6.2 maven 安装、搭建+实战

文章目录一、docker安装Mysql1. 映射目录2. 赋予权限3. 镜像拉取4. 运行容器5. 查看日志6. 创建数据库二、docker安装sonarqube2.1. 映射目录2.2.赋予权限2.3. 镜像拉取2.4. 运行容器2.5. 查看日志二、中文简体2.1. 版本对照2.2. download2.3. 重启容器三、规则添加3.1. 规则无…

使用CLONE TABLE方式实现同region不同可用区的MaxCompute

该文章主要针对于用户同region不同账户之间的MaxCompute数据迁移方式,属于迁移的方式可以有三种方式,一、添加MaxCompute数据源的方式进行数据迁移(该方式针对多个表配置同步节点较为繁琐);二、使用tunnel方式结合代码…

Fabric中的Transient Data与Private Data

在Hyperledger Fabric中有两个相关的概念:私有数据(Private Data)和暂态数据(Transient Data)。本文提供四个示例程序,分别对应私有数据和暂态数据的四种组合使用方式,并通过观察账本的交易以及…

窃隐私、放高利贷,输入法的骚操作真不少!

来源 | 编程技术宇宙责编 | 李雪敬封图 | CSDN 付费下载自视觉中国光说隐私泄露,人们总觉得似乎离自己很远,然而它早已像一个“地雷”,悄悄埋进了我们的生活中,不是不爆,时候未到。别认为自己只是社会中的一个小透明&a…

快速迁移 Next.js 应用到函数计算

首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源&#xff…

为什么字节跳动、腾讯、阿里都在用Python??

Python 作为一种解释型技术脚本语言,越来越被认可为程序员新时代的风口语言。 无论是刚入门的程序员,还是年薪百万的 BATJ 的技术大牛都无可否认:Python的应用能力是成为一名码农大神的必要项。 而作为Python初学者来讲,最大的问题…

Need to upgrade docker package to 17.06.0+. Docker升级到最新版本

文章目录1. 现象2. 查找3. 在线卸载4. 升级docker5. 重启Docker6. 设置Docker开机自启7. 查看版本背景: 在搭建docker私有仓库的时候出现以下错误,版本太低 1. 现象 Need to upgrade docker package to 17.06.0.2. 查找 查找主机上关于Docker的软件包 …

云数据库RDS基础版的优势及适用场景

云栖号快速入门:【点击查看更多云产品快速入门】 不知道怎么入门?这里分分钟解决新手入门等基础问题,可快速完成产品配置操作! 阿里云的产品系列包括基础版、高可用版、集群版、三节点企业版,本文介绍基础版的相关信息…

docker Harbor2.3.4 http 搭建镜像仓库

文章目录一、环境准备1. 环境要求2. 节点总览3. 安装docker-compose二、安装harbor2.1. 下载2.2. 解压2.3. 调整配置2.5. 安装 harbor2.6. 效果验证三、Docker开启远程API3.1. 修改配置3.2. 支持http3.3. 重新启动Docker服务3.4. 防火墙管理3.5. 重新启动3.6. 监控状态四、测试…

下一代 IDE:Eclipse Che 究竟有什么奥秘?

来源 | CSDN(ID:CSDNnews)Eclipse Che被Eclipse官方称为下一代IDE,作为老牌的IDE,被其寄予厚望的Eclipse Che到底有什么特点,在这篇文章中我们来一探究竟。开发团队的Kuberentes原生IDEEclipse Che对开发团…

【开发者成长】阿里代码缺陷检测探索与实践

目前PRECFIX技术已经在阿里巴巴集团内部落地并获得好评;关于“PRECFIX”技术的论文被国际软件工程大会(ICSE)收录。 张昕东(别象) 阿里巴巴 云研发事业部 算法工程师 【以下为别象分享实录】 阿里巴巴在缺陷检测技术方面遇到的三个挑战 编码…

docker Harbor2.3.4 https 搭建镜像仓库

文章目录一、环境准备1. 环境要求2. 节点总览3. 安装docker-compose二、安装harbor2.1. 下载2.2. 解压2.3. 认证2.4. 调整配置2.5. 安装 harbor2.6. 配置host2.7. 效果验证三、客户端3.1. 证书保存3.2. 新建配置3.3. 登录harbor四、基本操作4.1. 下线4.2. 监控状态4.3. 重新部署…

OPPO实时数仓揭秘:从顶层设计实现离线与实时的平滑迁移

一、建设背景 关于 OPPO 移动互联网业务 大家都认为 OPPO 是一家手机公司,但大家可能并不清楚,其实 OPPO 也会做与移动互联网相关的业务。在 2019 年 12 月,OPPO 发布了自己定制的手机操作系统 ColorOS 7.0 版本。目前包括海外市场在内&…

十年技术骨干面试被开出一万五薪资,直呼 “这是对我的侮辱”

老周是我十多年前认识的同事,2012年前后,老周到北京工作的第一个任务就是为公司的产品开发IOS APP。2012年底,老周已经能熟练的驾驭苹果的cocoatouch和android核心组件。也正因为如此,老周的薪水直接翻倍,当时已经拿到…

登录 Harbor response from daemon: Get “https://192.168.92.129/v2/“: x509: cannot validate certificate

文章目录1. 现象2. 解决方案3. 重新登陆1. 现象 [rootlocalhost harbor]# docker login 192.168.92.129 Username: admin Password: Error response from daemon: Get "https://192.168.92.129/v2/": x509: cannot validate certificate for 192.168.92.129 becaus…