logging in kubernetes
background
docker
docker的日志输出可以通过指定driver输出到不同的位置,常用的是journald和json-file。 使用journald日志输出可能受限于jourand的throttle作用, 因为journald是node agent, 负责该node上全部容器的日志收集, 当一个用户写入大量日志,就会进行rate limit, 这样导致其他用户也会丢失日志, 并且无法进行单个用户rate-limit 的设置; 而使用json-file log driver, docker是将log以json 格式保存到宿主机的目录之上, 默认是/var/lib/docker/containers/${docker-uid}, 可以通过log-opt参数配置log rotate文件大小和数量, 避免占用太多磁盘空间。 个人比较推荐使用json-file log driver, 不会丢日志, 耦合性较低,日志先格式化输出到磁盘上, 然后后面怎么处理都比较方便。 所有的log driver都需要经过docker daemon, 然后分发到不同的driver里, 这样就会有单点问题,分发和处理(序列化日志等)会有性能问题, 耗费机器资源, 严重情况下会导致整个docker daemon卡死。所以对于这种log较多的应用建议直接输出到文件中,而不是STDOUT, 避免影响docker daemon。
kubernetes
如果docker使用json-filelog driver, kubelet会为所有的容器日志创建一个软链接到/var/log/pods目录下, 包含各个pods所有的日志,文件名称由pod name, namespaces, container name, container Id等组成。kubernetes官方文档Logging Architecture介绍了三种日志收集方式, 并推荐使用daemonset部署log agent 方式收集, 这种方式部署简单, 节约资源, 但是灵活性不够, 无法针对每个pod做一些定制化的需求, 同时因为是一个node上的全局agent, 需要考虑所收集的多个pod的日志隔离, 避免相关影响。 在生产环境中, 我们可以统一由node agent来收集日志, 对于比较特殊的需求则使用sidecar的方式进行收集。
方案实现
日志收集的各种node agent的实现不尽相同, 有些agent是通过docker api获取容器日志的,例如开源的logspout,这种agent适用这种场景比较单一,如果我们还需要收集写到磁盘上的日志, logspout就无法胜任了。我们知道容器如果使用json-file这种log driver, 日志最终会保存在宿主机上的特定目录中的文件里, 所以我们可以归约以上所有的情况都为文件日志收集, 使用类似tail -f功能的程序来实现, 目前这样的开源工具很多, 例如fluentd, filebeat等, 除了基本的tailf功能外, log agent还需要考虑那些功能?
功能
- label添加: 自动添加container name, containerID, node name的label,除了基本的contianer信息外,还应该支持用户自定义的label, 方便收集索引和数据处理。
- 支持多种数据来源: 容器环境下的日志主要分为: 宿主机文件, 容器文件, 容器stdout,这些类型都可以归约为文件,因为容器的stdout也可以先落磁盘,然后由agent收集。
- 自动发现容器创建、删除: 如果场景比较单一的话,比如只收集固定目录的文件,就可以统一使用文件tailf, 自动监视指定目录的变化即可。 如果需要一些高级的功能,例如目录多变,数据来源较多,就需要动态监听docker daemon事件, 并从container的label或者env中解析出动态传递的变量进行定制化。如果某些程序不支持监听docker daemon的事件的话,可以写一个对应的reloader,由reloader监听docker事件生成配置供agent使用。
- 数据处理: 过滤,路由到不同的target,例如输出到kafaka, es等
上述功能对于不同的业务场景可能有不同的需求, 很多现在开源的工具都提供一种插件的方式来扩展功能,以fluend来说,提出Unified Logging Layer,通过各个插件进行日志路由和处理,目前基本插件都能找到开源的,可谓是一个日志收集生态。
性能
除了满足基本的功能之外, 就需要考虑性能问题了:
- 多租户隔离: 容器环境下, 可能多个用户共享一台物理机, 如果一个容器写日志速率较快可能会影响其他用户正常操作, 因为一个node agent的收集速率总会有上限,并且在公有云环境下, 日志收集作为资源提供出去,是需要计费的, 此时就需要考虑限速, 容量调度, 优先级抢占等问题。该部分可以参见:Logtail技术分享(二) : 多租户隔离技术+双十一实战效果
- 性能: 日志速率的速率越快, 单台node收集的日志越多, 可以满足更加丰富的业务场景。
- 资源消耗: node agent往往是需要部署集群中所有的node上面, 所以影响面较广, 如果我们能显著降低资源消耗, 相当于省钱。
- 稳定可靠: 自动降级,就算是异常情况, 程序Bug也不能影响用户, 此时就需要通过cgroup等技术进行容量的限制。 还有就是不能多收集日志或者丢失日志。
日志收集agent原理
这部分可以阅读下面链接的阿里云团队分享的文章, 这里highlight一下:
- 使用polling + inotify发现日志文件
- 使用dev+inode+signatrue标识一个文件
- 通过点位文件保证可靠性, 通过fsync+rename保证点位文件的可靠性
- 通过保持文件打开状态来保证文件采集完整
日志采集中的关键技术分析
Logtail技术分享(一) : Polling + Inotify 组合下的日志保序采集方案
Logtail技术分享(二) : 多租户隔离技术+双十一实战效果
More topic
Logging Architecture
Cluster-level Logging in Kubernetes with Fluentd
阿里PB级Kubernetes日志平台建设实践
logging in kubernetes的更多相关文章
- kubernetes实战(三):k8s v1.11.1 持久化EFK安装
1.镜像下载 所有节点下载镜像 docker pull kibana: docker tag kibana: docker.elastic.co/kibana/kibana: docker pull ...
- Kubernetes 集群日志 和 EFK 架构日志方案
目录 第一部分:Kubernetes 日志 Kubernetes Logging 是如何工作的 Kubernetes Pod 日志存储位置 Kubelet Logs Kubernetes 容器日志格式 ...
- Kubernetes集群初探
上文我们在一台虚机上演示了Kubernetes基于redis和docker的guestbook留言簿案例,本文我们将通过配置Kubernetes集群的方式继续深入研究.集群组件安装如下配置. IP N ...
- kubernetes 1.3 的安装和集群环境部署
简介: Docker:是一个开源的应用容器引擎,可以为应用创建一个轻量级的.可移植的.自给自足的容器. Kubernetes:由Google开源的Docker容器集群管理系统,为容器化的应用提供资源调 ...
- Docker实践(6)—CentOS7上部署Kubernetes
Kubernetes架构 Kubernetes的整体架构如下: Master为主控节点,上面运行apiserver,scheduler,controller-manager等组件.Minion相当于工 ...
- kubernetes学习笔记
docker实现了更便捷的单机容器虚拟化的管理, docker的位置处于操作系统层与应用层之间; 相对传统虚拟化(KVM,XEN): docker可以更加灵活的去实现一些应用层功能, 同时对资源的利用 ...
- 基于kubernetes构建Docker集群管理详解-转
http://blog.liuts.com/post/247/ 一.前言 Kubernetes 是Google开源的容器集群管理系统,基于Docker构建一个容器的调度服务,提供资源调度 ...
- 无网络centos7中部署kubernetes
本文提供的kubernetes1.1实际为kubernetes0.8,最新kubernetes部署方式见下一篇文章:centos下kubernetes+flannel部署. 一.部署环境信息: 1)m ...
- CentOS7 安装kubernetes
2台机器,1台为Master,1台为Node 修改Host Master为dmaster,Node为dslave 安装K8s and Etcd 在Master机器上安装 yum install etc ...
随机推荐
- Install python3
wget https://www.python.org/ftp/python/3.7.4/Python-3.7.4.tgz tar xf Python-3.7.4.tgz cd Python-3.7. ...
- 2019-11-6:ubuntu安装配置JAVA环境
1,下载JAVA,官方java 18下载网站:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-21331 ...
- 新闻实时分析系统-Hadoop2.X分布式集群部署
(一)hadoop2.x版本下载及安装 Hadoop 版本选择目前主要基于三个厂商(国外)如下所示: 1.基于Apache厂商的最原始的hadoop版本, 所有发行版均基于这个版本进行改进. 2.基于 ...
- 【笔记】vue+springboot前后端分离实现token登录验证和状态保存的简单实现方案
简单实现 token可用于登录验证和权限管理. 大致步骤分为: 前端登录,post用户名和密码到后端. 后端验证用户名和密码,若通过,生成一个token返回给前端. 前端拿到token用vuex和lo ...
- C博客作业05--2019-指针
0.展示PTA总分 1.本章学习总结 1.1 学习内容总结 1.2 本章学习体会 2.PTA实验作业 2.16 -7 输出月份英文名 2.1.1 伪代码 char* getmonth(int n) { ...
- iptables简单命令
IPTables是基于Netfilter基本架构实现的一个可扩展的数据报高级管理系统或核外配置工具,利用table.chain.rule三级来存储数据报的各种规则.Netfilter-iptables ...
- 献给那些想自建站搭建博客的新人们(实篇)wordpress
实验材料 windows或者linux(因为我是大学操作系统学的是windows,后来服务器转向了linux,所以我将针对window和linux分别进行开展) xampp(最佳php5.6 在7.1 ...
- Linux常见的Shell命令
1.具体的shell命令用法可以通过help或man命令进入手册来查询其具体的用法.2.终端本质上对应着linux上的/dev/tty设备,linux的多用户登录就是通过不同的/dev/tty设备完成 ...
- Winows下安装RabbitMQ
RabbitMQ的简介 RabbitMQ是一套开源(MPL)的消息队列服务软件,是由 LShift 提供的一个 Advanced Message Queuing Protocol (AMQP) 的开源 ...
- Xamarin.Forms 学习系列之优秀UI收集
1.各种优秀UI例子 https://github.com/jsuarezruiz/xamarin-forms-goodlooking-UI 输入框例子 https://github.com/enis ...