前言html
上一期主要介绍Kubernetes日志输出的一些注意事项,日志输出最终的目的仍是作统一的采集和分析。在Kubernetes中,日志采集和普通虚拟机的方式有很大不一样,相对实现难度和部署代价也略大,但若使用恰当则比传统方式自动化程度更高、运维代价更低。node
Kubernetes日志采集难点web
在Kubernetes中,日志采集相比传统虚拟机、物理机方式要复杂不少,最根本的缘由是Kubernetes把底层异常屏蔽,提供更加细粒度的资源调度,向上提供稳定、动态的环境。所以日志采集面对的是更加丰富、动态的环境,须要考虑的点也更加的多。docker
例如:缓存
Kubernetes传统方式日志种类文件、stdout、宿主机文件、journal文件、journal日志源业务容器、系统组件、宿主机业务、宿主机采集方式Agent(Sidecar、DaemonSet)、直写(DockerEngine、业务)Agent、直写单机应用数10-1001-10应用动态性高低节点动态性高低采集部署方式手动、Yaml手动、自定义运维
采集方式:主动 or 被动异步
日志的采集方式分为被动采集和主动推送两种,在K8s中,被动采集通常分为Sidecar和DaemonSet两种方式,主动推送有DockerEngine推送和业务直写两种方式。ide
总结下来:DockerEngine直写通常不推荐;业务直写推荐在日志量极大的场景中使用;DaemonSet通常在中小型集群中使用;Sidecar推荐在超大型的集群中使用。详细的各类采集方式对好比下:性能
DockerEngine业务直写DaemonSet方式Sidecar方式采集日志类型标准输出业务日志标准输出+部分文件文件部署运维低,原生支持低,只需维护好配置文件便可通常,需维护DaemonSet较高,每一个须要采集日志的POD都须要部署sidecar容器日志分类存储没法实现业务独立配置通常,可经过容器/路径等映射每一个POD可单独配置,灵活性高多租户隔离弱弱,日志直写会和业务逻辑竞争资源通常,只能经过配置间隔离强,经过容器进行隔离,可单独分配资源支持集群规模本地存储无限制,若使用syslog、fluentd会有单点限制无限制取决于配置数无限制资源占用低,dockerengine提供总体最低,省去采集开销较低,每一个节点运行一个容器较高,每一个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只在功能单一的应用或一些K8s系统/运维组件中使用。
CICD集成:Logging Operator
Kubernetes提供了标准化的业务部署方式,能够经过yaml(K8s API)来声明路由规则、暴露服务、挂载存储、运行业务、定义缩扩容规则等,因此Kubernetes很容易和CICD系统集成。而日志采集也是运维监控过程当中的重要部分,业务上线后的全部日志都要进行实时的收集。
原始的方式是在发布以后手动去部署日志采集的逻辑,这种方式须要手工干预,违背CICD自动化的宗旨;为了实现自动化,有人开始基于日志采集的API/SDK包装一个自动部署的服务,在发布后经过CICD的webhook触发调用,但这种方式的开发代价很高。
在Kubernetes中,日志最标准的集成方式是以一个新资源注册到Kubernetes系统中,以Operator(CRD)的方式来进行管理和维护。在这种方式下,CICD系统不须要额外的开发,只需在部署到Kubernetes系统时附加上日志相关的配置便可实现。
Kubernetes日志采集方案
早在Kubernetes出现以前,咱们就开始为容器环境开发日志采集方案,随着K8s的逐渐稳定,咱们开始将不少业务迁移到K8s平台上,所以也基于以前的基础专门开发了一套K8s上的日志采集方案。主要具有的功能有:
安装日志采集组件
目前这套采集方案已经对外开放,咱们提供了一个Helm安装包,其中包括Logtail的DaemonSet、AliyunlogConfig的CRD声明以及CRD Controller,安装以后就能直接使用DaemonSet采集以及CRD配置了。安装方式以下:
安装好上述组件以后,Logtail和对应的Controller就会运行在集群中,但默认这些组件并不会采集任何日志,须要配置日志采集规则来采集指定Pod的各种日志。
采集规则配置:环境变量 or CRD
除了在日志服务控制台上手动配置以外,对于Kubernetes还额外支持两种配置方式:环境变量和CRD。
环境变量是自swarm时代一直使用的配置方式,只须要在想要采集的容器环境变量上声明须要采集的数据地址便可,Logtail会自动将这些数据采集到服务端。这种方式部署简单,学习成本低,很容易上手;但可以支持的配置规则不多,不少高级配置(例如解析方式、过滤方式、黑白名单等)都不支持,并且这种声明的方式不支持修改/删除,每次修改其实都是建立1个新的采集配置,历史的采集配置须要手动清理,不然会形成资源浪费。
CRD配置方式是很是符合Kubernetes官方推荐的标准扩展方式,让采集配置以K8s资源的方式进行管理,经过向Kubernetes部署AliyunLogConfig这个特殊的CRD资源来声明须要采集的数据。例以下面的示例就是部署一个容器标准输出的采集,其中定义须要Stdout和Stderr都采集,而且排除环境变量中包含COLLEXT_STDOUT_FLAG:false的容器。 基于CRD的配置方式以Kubernetes标准扩展资源的方式进行管理,支持配置的增删改查完整语义,并且支持各类高级配置,是咱们极其推荐的采集配置方式。
采集规则推荐的配置方式
实际应用场景中,通常都是使用DaemonSet或DaemonSet与Sidecar混用方式,DaemonSet的优点是资源利用率高,但有一个问题是DaemonSet的全部Logtail都共享全局配置,而单一的Logtail有配置支撑的上限,所以没法支撑应用数比较多的集群。 上述是咱们给出的推荐配置方式,核心的思想是:
实践1-中小型集群
绝大部分Kubernetes集群都属于中小型的,对于中小型没有明确的定义,通常应用数在500之内,节点规模1000之内,没有职能明确的Kubernetes平台运维。这种场景应用数不会特别多,DaemonSet能够支撑全部的采集配置:
实践2-大型集群
对于一些用做PAAS平台的大型/超大型集群,通常业务在1000以上,节点规模也在1000以上,有专门的Kubernetes平台运维人员。这种场景下应用数没有限制,DaemonSet没法支持,所以必须使用Sidecar方式,总体规划以下:
上云就看云栖号:更多云资讯,上云案例,最佳实践,产品入门,访问:https://yqh.aliyun.com/
本文为阿里云原创内容,未经容许不得转载。