在kubernetes中对日志的处理方式叫做cluster-level-logging,即这个日志处理系统跟容器,Pod,Node的生命周期无关,也就是无论是容器挂了,Pod被删除了还是Node宕机了,应用的日志应该被正常获取到。

对于容器来说,当应用把日志输出到stdout和stderr中时,容器默认情况下就会把这些日志输出到宿主机上的一个 JSON 文件之中,同样我们也可以通过 docker logs 或者 kubectl logs 来查看到对应的日志信息。

但是kubernetes本身并不提供日志收集工作,但是它提供了三种方案。

一、在Node上部署logging agent

这种方案的架构如下:

这种架构的核心点就在logging-agent,通常情况下它会以DS的方式运行在节点上,然后将宿主机的容器日志目录挂载进去,然后由logging-agent将日志收集转发出去。常用的方案有EFK,即用fluentd作为上面的logging-agent,然后将日志转发到远端的ElasticSearch中,然后由kibana进行展示。

这种方案的优点是只需要在节点部署一个logging-agent,而且不会对应用和Pod有任何侵入性,但是其缺点就是必须要应用的日志输出必须输出到stdout和stderr中去。

二、sidecar收集日志

由于第一种方式无法收集一些没有标准输出到stdout和stderr中,所以就有了第二种方式对这种特殊情况进行处理:当容器的日志只能输出到某些文件的时候,就可以通过一个sidecar容器把这些日志重新输出到sidecar的stdout和stderr中去,这样就可以继续使用第一种方案进行日志再处理。

其架构如下:

比如我有一个pod,它会把日志输出到1.log和2.log的文件中,这个Pod的YAML文件如下:

apiVersion: v1kind: Podmetadata:  name: counterspec:  containers:  - name: count    image: busybox    args:    - /bin/sh    - -c    - >      i=0;      while true;      do        echo "$i: $(date)" >> /var/log/1.log;        echo "$(date) INFO $i" >> /var/log/2.log;        i=$((i+1));        sleep 1;      done    volumeMounts:    - name: varlog      mountPath: /var/log  volumes:  - name: varlog    emptyDir: {}

这种情况下,用kubectl logs是看不到任何日志的,所以第一种方法就没办法使用,那么这个时候我们就可以创建两个sidecar容器,分别将这两个日志输出到stdout和stderr中,这个sidecar的YAML文件如下:

apiVersion: v1kind: Podmetadata:  name: counterspec:  containers:  - name: count    image: busybox    args:    - /bin/sh    - -c    - >      i=0;      while true;      do        echo "$i: $(date)" >> /var/log/1.log;        echo "$(date) INFO $i" >> /var/log/2.log;        i=$((i+1));        sleep 1;      done    volumeMounts:    - name: varlog      mountPath: /var/log  - name: count-log-1    image: busybox    args: [/bin/sh, -c, 'tail -n+1 -f /var/log/1.log']    volumeMounts:    - name: varlog      mountPath: /var/log  - name: count-log-2    image: busybox    args: [/bin/sh, -c, 'tail -n+1 -f /var/log/2.log']    volumeMounts:    - name: varlog      mountPath: /var/log  volumes:  - name: varlog    emptyDir: {}

这时候分别通过kubectl logs查看这两个sidecar容器,就可以看到相应的日志内容了。

由于sidecar跟主容器是共享volume的,所以这里的sidecar方案其实并不会占用太多的资源。但是这种办法实际上是会存在两份文件,一份是系统自己写的文件,第二份是通过sidecar输出到stdout和stderr中所对应的JSON文件,多以对磁盘来说是一个大的开销。

三、以sidecar运行logging-agent

这种方案就是直接在sidecar中运行logging-agent,直接将日志转发到后端存储,也就是相当于在方案一中将logging-agent放到一个Pod中了,其架构如下:

在这个方案中,应用可以直接把日志输出到一个文件中,我们的logging-agent可以使用fluentd收集日志转发到后端ElasticSearch中,不过这里的输入源变成了日志文件。

一般来说,我们会把fluentd的输入源配置保存在ConfigMap中,如下:

apiVersion: v1kind: ConfigMapmetadata:  name: fluentd-configdata:  fluentd.conf: |          type tail      format none      path /var/log/1.log      pos_file /var/log/1.log.pos      tag count.format1          type tail      format none      path /var/log/2.log      pos_file /var/log/2.log.pos      tag count.format2          type google_cloud    

然后我们在Pod的定义里,就可以声明一个Fluentd的sidecar,专门负责将日志转发到后端ElasticSearch中去。

apiVersion: v1kind: Podmetadata:  name: counterspec:  containers:  - name: count    image: busybox    args:    - /bin/sh    - -c    - >      i=0;      while true;      do        echo "$i: $(date)" >> /var/log/1.log;        echo "$(date) INFO $i" >> /var/log/2.log;        i=$((i+1));        sleep 1;      done    volumeMounts:    - name: varlog      mountPath: /var/log  - name: count-agent    image: k8s.gcr.io/fluentd-gcp:1.30    env:    - name: FLUENTD_ARGS      value: -c /etc/fluentd-config/fluentd.conf    volumeMounts:    - name: varlog      mountPath: /var/log    - name: config-volume      mountPath: /etc/fluentd-config  volumes:  - name: varlog    emptyDir: {}  - name: config-volume    configMap:      name: fluentd-config

这样虽然更加灵活,但是在 sidecar 容器中运行日志采集代理程序会导致大量资源消耗,因为你有多少个要采集的 Pod,就需要运行多少个采集代理程序,另外还无法使用 kubectl logs 命令来访问这些日志,因为它们不受 kubelet 控制。

看不到日志_Kubernetes中常用的日志收集方案相关推荐

  1. 查看centos中mysql的日志的命令_CentOS系统中常用查看日志命令

    cat tail -f 日 志 文 件 说    明 /var/log/message 系统启动后的信息和错误日志,是Red Hat Linux中最常用的日志之一 /var/log/secure 与安 ...

  2. JAVA日常开发中常用的日志记录方式,攒个赞好不好?

    引言: 日志大家都再熟悉不过了,日常开发中经常要用到,甲方接口人最喜欢对我说的话就是"赶紧去查一下日志,快点!",说话的同时瞪着个铜铃大的眼睛. 就你接口人知道日志吗?还要你指挥啊 ...

  3. php输出mysql错误日志_PHP_PHP中把错误日志保存在系统日志中(Windows系统),【将错误记录到系统日志中】 - phpStudy...

    PHP中把错误日志保存在系统日志中(Windows系统) [将错误记录到系统日志中] 在 php.ini 中将 error_log 设置为: error_log = syslog 或者在运行时使用 i ...

  4. php 保存错误日志,PHP中把错误日志保存在系统日志中_PHP教程

    PHP中把错误日志保存在系统日志中 这篇文章主要介绍了PHP中把错误日志保存在系统日志中(Windows系统),本文讲解了设置方法和查看方法,需要的朋友可以参考下 [将错误记录到系统日志中] 在 ph ...

  5. 一文看懂NumPy的切片中常用的冒号

    NumPy是Python语言的一个扩展程序库.支持高阶大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库.在进行大量数据计算中,NumPy会为我们提供很多的方便.最近我在学习CV方面的知 ...

  6. oracle 命令日志输出,ORACLE常用命令日志

    第一章:日志管理 1.forcing log switches sql> alter system switch logfile; 2.forcing checkpoints sql> a ...

  7. MySQL 项目中常用的优化索引方案

    声明一下:下面的优化方案都是基于 " Mysql-索引-BTree类型 " 的 一.EXPLAIN 做MySQL优化,我们要善用 EXPLAIN 查看SQL执行计划. 下面来个简单 ...

  8. Java中常见的日志框架

    可能是太过于常见了,所以使得大家很少关注,只是要用到的时候复制粘贴一份就行,甚至连日志配置文件中的配置语法都不清楚.另外一方面,Java中提供的日志组件太多了,一会儿log4j,一会儿logback, ...

  9. 第17周翻译:SQL Server中的事务日志管理的阶梯:第5级:在完全恢复模式下管理日志...

    来源:http://www.sqlservercentral.com/articles/Stairway+Series/73785/ 作者:Tony Davis, 2012/01/27 翻译:刘琼滨. ...

最新文章

  1. 王茂霖:数据挖掘提分三板斧!(附PPT下载)
  2. 函数式编程语言python-10分钟学会python函数式编程
  3. 计算机维修队,浙江万里学院计算机维修队
  4. 什么是mybatis,mybatis有什么特点
  5. 从Linux终端管理进程:10个你必须知道的命令
  6. dropbox免费容量_免费课程:使用ES6和Dropbox构建费用管理器
  7. python中side什么意思_python – 在PySide中区分信号源
  8. Linux下挂载NTFS格式文件系统
  9. 机器学习实现计算不规则图形面积_【名师课堂】苏教数学五年级上2.11校园绿地面积...
  10. less,sass,stylus配置和应用教程及三者比较
  11. jsp中使用jsp:include /在切换tomcat版本时遇到的问题
  12. IDEA导入JDK源码
  13. vue 滑动置顶功能_CSS3 移动端 滚动置顶 吸顶
  14. 1292:宠物小精灵之收服
  15. CSS 字体粗细 font-weight属性
  16. 什么是计算机网络 它有哪些主要功能,什么是计算机网络及主要功能有哪些?...
  17. GTX1650 搭建TensorFlow-GPU 2.4框架(CUDA11.0 + cudnn 8.04 + anaconda 3.8)
  18. iOS1.0到iOS7,iOS七大版本特性回顾
  19. 阿里云国际版设置DNS托管和智能分流教程详解
  20. 【光学】发散角的奥秘

热门文章

  1. 登录DMOZ/如何登录DMOZ分类目录
  2. tfjob的一篇文章,跟公司内使用方式类似
  3. VSCode 设置中文语言
  4. asp.net mvc 使用ajax请求 控制器 (PartialViewResult)分部的action,得到一个分部视图(PartialView)的HTML,进行渲染...
  5. Mybatis 工作总结 持续更新
  6. fedora,linux mint 命令行(终端)打开目录
  7. 国际C语言乱码大赛(IOCCC)经典之作
  8. 网管员应掌握好的学习方法
  9. Windows中如何正确认识和安装驱动程序
  10. 采集虚拟机_系列文章:Kubernetes日志采集最佳实践