background

docker

docker的日志输出可以通过指定driver输出到不同的位置,常用的是journaldjson-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一下:

  1. 使用polling + inotify发现日志文件
  2. 使用dev+inode+signatrue标识一个文件
  3. 通过点位文件保证可靠性, 通过fsync+rename保证点位文件的可靠性
  4. 通过保持文件打开状态来保证文件采集完整

日志采集中的关键技术分析
Logtail技术分享(一) : Polling + Inotify 组合下的日志保序采集方案
Logtail技术分享(二) : 多租户隔离技术+双十一实战效果

More topic

Logging Architecture
Cluster-level Logging in Kubernetes with Fluentd
阿里PB级Kubernetes日志平台建设实践

logging in kubernetes的更多相关文章

  1. kubernetes实战(三):k8s v1.11.1 持久化EFK安装

    1.镜像下载 所有节点下载镜像 docker pull kibana: docker tag kibana: docker.elastic.co/kibana/kibana: docker pull ...

  2. Kubernetes 集群日志 和 EFK 架构日志方案

    目录 第一部分:Kubernetes 日志 Kubernetes Logging 是如何工作的 Kubernetes Pod 日志存储位置 Kubelet Logs Kubernetes 容器日志格式 ...

  3. Kubernetes集群初探

    上文我们在一台虚机上演示了Kubernetes基于redis和docker的guestbook留言簿案例,本文我们将通过配置Kubernetes集群的方式继续深入研究.集群组件安装如下配置. IP N ...

  4. kubernetes 1.3 的安装和集群环境部署

    简介: Docker:是一个开源的应用容器引擎,可以为应用创建一个轻量级的.可移植的.自给自足的容器. Kubernetes:由Google开源的Docker容器集群管理系统,为容器化的应用提供资源调 ...

  5. Docker实践(6)—CentOS7上部署Kubernetes

    Kubernetes架构 Kubernetes的整体架构如下: Master为主控节点,上面运行apiserver,scheduler,controller-manager等组件.Minion相当于工 ...

  6. kubernetes学习笔记

    docker实现了更便捷的单机容器虚拟化的管理, docker的位置处于操作系统层与应用层之间; 相对传统虚拟化(KVM,XEN): docker可以更加灵活的去实现一些应用层功能, 同时对资源的利用 ...

  7. 基于kubernetes构建Docker集群管理详解-转

    http://blog.liuts.com/post/247/ 一.前言        Kubernetes 是Google开源的容器集群管理系统,基于Docker构建一个容器的调度服务,提供资源调度 ...

  8. 无网络centos7中部署kubernetes

    本文提供的kubernetes1.1实际为kubernetes0.8,最新kubernetes部署方式见下一篇文章:centos下kubernetes+flannel部署. 一.部署环境信息: 1)m ...

  9. CentOS7 安装kubernetes

    2台机器,1台为Master,1台为Node 修改Host Master为dmaster,Node为dslave 安装K8s and Etcd 在Master机器上安装 yum install etc ...

随机推荐

  1. 20191107-5 beta week 2/2 Scrum立会报告+燃尽图 04

    此作业的要求参见https://edu.cnblogs.com/campus/nenu/2019fall/homework/9957 一.小组情况 队名:扛把子 组长:孙晓宇 组员:宋晓丽 梁梦瑶 韩 ...

  2. beta week 1/2 Scrum立会报告+燃尽图 02

    此作业要求参见https://edu.cnblogs.com/campus/nenu/2019fall/homework/9912 一.小组情况 队名:扛把子 组长:孙晓宇 组员:宋晓丽 梁梦瑶 韩昊 ...

  3. day48天jQuary

    今日内容 jQuery jQuery引入 下载链接:[jQuery官网](https://jquery.com/),首先需要下载这个jQuery的文件,然后在HTML文件中引入这个文件,就可以使用这个 ...

  4. Git同步本地项目文件到github

    1.登录自己的github账号,并创建一个存放项目代码的仓库 输入仓库名称后,点击create,然后来到完成后的页面,copy下以下内容,后面会用到 2.打开本地的git 安装好git后,打开git的 ...

  5. Identityserver4配置证书

    IS4中如果token的类型是JWT,则需要使用RS256算法生成非对称签名,这意味着必须使用私钥来签名JWT token,并且必须使用对应的公钥来验证token签名,即验证token是否有效.使用R ...

  6. 程序员的算法课(11)-KMP算法

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/m0_37609579/article/de ...

  7. Docker部署Mysql集群

    单节点数据库的弊病 大型互联网程序用户群体庞大,所以架构必须要特殊设计 单节点的数据库无法满足性能上的要求 单节点的数据库没有冗余设计,无法满足高可用 单节点MySQL的性能瓶领颈 2016年春节微信 ...

  8. 腾讯面试官问我Java中boolean类型占用多少个字节?我说一个,面试官让我回家等通知

    本文首发于微信公众号:程序员乔戈里 什么是boolean类型,根据官方文档的描述: boolean: The boolean data type has only two possible value ...

  9. 2019-2020-1 20199304《Linux内核原理与分析》第二周作业

    计算机工作原理 存储程序计算机模型 冯·诺依曼体系结构 冯·诺依曼体系结构如图所示: 冯·诺依曼体系结构包含五大部分 运算器:在控制器的统一控制下,负责对数据进行加工.完成各种运算,如算术运算.逻辑运 ...

  10. 【Python3网络爬虫开发实战】6.4-分析Ajax爬取今日头条街拍美图【华为云技术分享】

    [摘要] 本节中,我们以今日头条为例来尝试通过分析Ajax请求来抓取网页数据的方法.这次要抓取的目标是今日头条的街拍美图,抓取完成之后,将每组图片分文件夹下载到本地并保存下来. 1. 准备工作 在本节 ...