Kubernetes 容器编排工具日志收集方案讨论

2021-01-05 0 By admin

容器化服务为应用部署和管理提供了方便,同时为工作人员带来了新的困难。使用 Kubernetes 容器化编排工具,我们需要新的网络技能、分布式网络文件系统技能、微服务架构技能、CI/CD技能和日志统一收集技能等。

一、Kubernetes 集群中应用日志收集方案说明

1.1、前提说明

容器化服务中每个应用(开发写的程序)以容器形式运行,每个容器只能运行一个进程。

容器间是彼此隔离的–容器的网络、文件、进程、内存等资源彼此隔离;相互访问有限制。

1.2、概述

Kubernetes 应用容器的日志采集方式主要可以分为四种;虽然其中使用到的采集组件可能不同,但是原理是在这四种方式以内的。

  1. DockerEngine 方式
  2. Kubernetes DaemonSet 方式
  3. 应用容器中 Sidecar 方式
  4. 应用程序直接提交日志 logback

二、DockerEngine 方式说明

在容器中,标准输出将日志直接输出到 stdout 或 stderr,而 DockerEngine 接管 stdout 和 stderr 文件描述符,将日志接收后按照 DockerEngine 配置的 LogDriver 规则进行处理。
日志打印到文件的方式和虚拟机/物理机基本类似,只是日志可以使用不同的日志驱动;有journald、json-file、syslog等。

2.1、特性介绍

  1. 应用程序需要将日志输出到stdout/stderr 中。如果应用程序将日志输出到文件中,则不能收集。
  2. 经过DockerEngine 的封装,应用日志中会多出一些附加内容;在日志处理过程中需要删除掉。
  3. 多行日志收集有困难,日志内容解析比较麻烦。
  4. 一些不需要收集日志的容器,其日志内容也会收集到日志平台中;需要将这些日志过滤掉。
  5. 不同的日志驱动,功能点不同,特性也不一样;具体使用方式,需要根据使用方式进行调研。

2.2、实现步骤

  1. 应用程序配置日志文件:设置字段、标准输出(console 终端)的日志才能生效;写入到文件中的日志不能收集。
  2. 调研和配置合适的日志驱动:需要考虑日志收集、汇总、解析、存储、分析等功能。

三、Kubernetes DaemonSet 方式说明

应用容器将日志写入到具体文件中,在Kubernetes编排工具中对此日志文件做持久化存储共享,配置日志收集服务(Logstash、flume、filebeat等)读取日志进行日志收集。

3.1、特性介绍

  1. 日志持久化存储对网络文件系统有压力;日志写入慢,会影响业务应用的响应。使用本地存储的方式,可以提高日志写入速度,但需要注意磁盘容量。
  2. 应用程序需要将日志写入特定的目录中,Kubernetes 编排工具设置持久化存储目录要与之对应。
  3. 多行日志收集有困难,日志内容解析比较麻烦。
  4. 日志收集服务(logstash\flume\filebeat等)收集的日志格式要统一,否则无法做初步解析。对集群中所有容器有的日志格式有统一规范的要求。

3.2、实现步骤

  1. 制定日志规范:限定日志格式、字段、存储目录等;提供给开发人员执行。
  2. 调研和配置合适的日志收集服务(Logstash、flume、filebeat等):需要考虑日志的汇总、解析、存储、分析等功能。

四、应用容器中 Sidecar 方式

为每个应用容器配置一个专门收集日志和状态的附属容器。应用容器将日志内容写入到文件中,附属容器通过读取日志文件内容并转发到日志收集服务中;实现日志收集和汇总的功能。

4.1、特性介绍

  1. 每个应用容器配置一个 Sidecar 容器,占用资源高;对集群资源有较高要求。
  2. 应用容器需要规划好日志存储位置、日志存储格式等信息;否则维护各种各样的 Sidecar 配置就很困难;非常增加运维成本。
  3. 多行日志收集有困难,日志内容解析比较麻烦。

4.2、实现步骤

  1. 制定日志规范:限定日志格式、字段、存储目录等;提供给开发人员执行。
  2. 调研和配置合适的 Sidecar 服务;需要考虑日志的汇总、解析、存储、分析等功能。

五、应用程序直接提交日志 logback

应用程序自行将日志输出到日志汇总服务中,日志大数据提供可用的日志汇总服务。应用容器不依赖日志文件,而是直接进行日志网络汇总。数据流清晰,增加开发人员的自主可控能力。

5.1、特性介绍

  1. 应用程序中配置网络日志传输组件;Java 应用中有完善的解决方案。其他开发语言待确认。
  2. 日志大数据提供的日志汇总服务需要可信,如果不稳定会造成应用服务启动失败。
  3. 减少日志解析的难度,避免多行日志解析工作。

5.2、实现步骤

  1. 日志大数据提供可信的日志收集服务;推荐Kafka 中间件。
  2. 规划好应用日志的字段、网络传输方式;提供给开发人员执行。
  3. 完善日志汇总服务的后续工作:日志的分析、存储和展示功能。