在开始这篇文章之前,首先要明确一点: Kubernetes 中对容器日志的处理方式,都叫做 cluster-level-logging ,也就是说,这个日志处理系统,与容器, Pod 以及 Node 的生命周期都是完全无关的.其实想想也能知道,这种设计就是为了保证,无论是容器宕了, Pod 被删除甚至是节点宕机的时候,日志处理系统仍然可以被正常获取到,从而可以分析原因所在.

而对于一个容器来说,当应用把日志输出到 stdout 和 stderr 之后,容器项目在默认情况下,就会把这些日志输出到宿主机上的一个 JSON 文件中,这样,我就能够通过 kubectl logs 命令,来查看到这些容器的日志.

但是你要明白一点,那就是 Kubernetes 本身,实际上是不会做容器日志收集工作的,所以为了能够实现上述 cluster-level-logging ,就需要在部署集群的时候,就提前对具体的日志方案进行规划.所幸, Kubernetes 项目本身提供了三种相关方案.

接下来分别讲一讲.

第一种

在 Node 上部署 logging agent ,将日志文件转发到后端存储里保存起来.这个方案的架构图如下所示:



从中我们能够看到,这里的核心在于 logging agent ,它一般都会以 DaemonSet 的方式运行在节点上,然后将宿主机上的容器日志目录挂载进去,最后由 logging-agent 把日志转发出去.那么,这样一来,我只需要在一个节点上部署一个 agent 即可,这样也不会对应用和 Pod 有任何侵入性.

但是这种方案,要求应用输出的日志,都必须是直接输出到容器的 stdout 和 stderr 中.

这也就引出了第二种解决方案.

第二种

第二种情况,主要就是对上面所述缺点的一个处理,即:当容器的日志只能输出到某些文件中时,可以通过一个 sidecar 容器将这些日志文件重新输出到 sidecar 的 stdout 和 stderr 中.

这种解决方案的架构图如下:



因为 sidecar 和主容器之间是共享 Volume 的,所以这里的 sidecar 方案的额外性能损耗并不高,只不过是多用了一点儿 CPU 和内存罢了.

但是要了解一点,这种方案下,宿主机上会存在两份相同的日志文件:一份是应用自己写入的,另外一份则是 sidecar 的 stdout 和 stderr 对应的 JSON 文件.这样就会造成对磁盘的巨大浪费.

所以,如果不是万不得已,也不是应用容器完全不可能被修改,还是建议使用方案一,或者使用下面介绍的方案三.

当然了,土豪随意,毕竟开心才是重要的.

第三种

第三种方案,就是通过 sidecar 容器,直接将应用的日志文件发送到远程存储里面去.也就是,方案一中的 logging agent ,放在应用 Pod 中.继续上一张架构图:



在这种方案下,应用可以直接把日志输出到固定的文件中,而不是 stdout , logging-agent 还可以使用 fluentd ,后端存储还可以是 ElasticSearch .

这种方案,部署简单,对宿主机也非常友好,但是这个 sidecar 容器,很有可能会消耗比较多的资源,甚至会拖垮应用容器,此外,由于日志没有输出到 stdout 上面,所以就算你通过命令 kubectl logs 来查看,也是看不到任何日志输出到.

以上就是关于容器日志的收集与管理的三种方案的介绍了.

有一点需要注意的是,不管到最后选择什么方案,到最后,一定要及时将这些日志文件,从宿主机上清理掉,或者给日志目录文件专门挂载一些容量巨大的远程盘.要不然,一旦磁盘分区被打满,整个系统就可能会陷入崩溃状态,这样造成的损失就大多了.

以上内容来自我学习<深入剖析Kubernetes>专栏文章之后的一些见解,有偏颇之处,还望指出.

感谢您的阅读~

[Kubernetes]容器日志的收集与管理的更多相关文章

  1. Kubernetes容器日志收集

    日志采集方式 日志从传统方式演进到容器方式的过程就不详细讲了,可以参考一下这篇文章Docker日志收集最佳实践,由于容器的漂移.自动伸缩等特性,日志收集也就必须使用新的方式来实现,Kubernetes ...

  2. 阿里云ilogtail收集自建Kubernetes容器日志文件

    背景 1,k8s属于自建. 2,需要收集应用服务容器里面指定目录的日志. 3,计划收集所有私有云php和nginx日志. 4,日志格式化处理. 思考 1,一个私有云一个Project,还是统一放入一个 ...

  3. Kubernetes部署ELK并使用Filebeat收集容器日志

    本文的试验环境为CentOS 7.3,Kubernetes集群为1.11.2,安装步骤参见kubeadm安装kubernetes V1.11.1 集群 1. 环境准备 Elasticsearch运行时 ...

  4. Kubernetes容器集群管理环境 - Prometheus监控篇

    一.Prometheus介绍之前已经详细介绍了Kubernetes集群部署篇,今天这里重点说下Kubernetes监控方案-Prometheus+Grafana.Prometheus(普罗米修斯)是一 ...

  5. ACK容器服务虚拟节点使用阿里云日志服务来收集业务容器日志

    按照这篇博文的介绍,可以在ACK集群上通过Helm的方式部署虚拟节点,提升集群的弹性能力.现在,通过虚拟节点部署的ECI弹性容器实例也支持将stdout输出.日志文件同步到阿里云日志服务(SLS)进行 ...

  6. ELK:收集k8s容器日志最佳实践

    简介 关于日志收集这个主题,这已经是第三篇了,为什么一再研究这个课题,因为这个课题实在太重要,而当今优秀的开源解决方案还不是很明朗: 就docker微服务化而言,研发有需求标准输出,也有需求文件输出, ...

  7. EFK收集Kubernetes应用日志

    本节内容: EFK介绍 安装配置EFK 配置efk-rbac.yaml文件 配置 es-controller.yaml 配置 es-service.yaml 配置 fluentd-es-ds.yaml ...

  8. Kubernetes容器集群管理环境 - 完整部署(中篇)

    接着Kubernetes容器集群管理环境 - 完整部署(上篇)继续往下部署: 八.部署master节点master节点的kube-apiserver.kube-scheduler 和 kube-con ...

  9. Kubernetes容器集群管理环境 - 完整部署(上篇)

    Kubernetes(通常称为"K8S")是Google开源的容器集群管理系统.其设计目标是在主机集群之间提供一个能够自动化部署.可拓展.应用容器可运营的平台.Kubernetes ...

随机推荐

  1. JS 设计模式五 -- 命令模式

    概念 命令模式中的命令(command) 指的是 一个执行某些待定事情的指令. 用一种松耦合的方式来设计程序,使得请求发送者和请求接收者能够消除彼此之间的耦合关系. 例子 假设html结构如下: &l ...

  2. springboot mybatis 整合

    新建项目在上一篇. 第二步:创建表和相应的实体类 实体类:user.java package com.qtt.im.entity; import java.io.Serializable; publi ...

  3. C#技巧记录——持续更新

    作为一名非主修C#的程序员,在此记录下学习与工作中C#的有用内容,持续更新 对类型进行约束,class指定了类型必须是引用类型,new()指定了类型必须具有一个无参的构造函数 where T : cl ...

  4. MarkdownPad

    MarkdownPad Markdown编辑器,只能在windows下使用 下载地址 :http://markdownpad.com/ 破解: 邮箱:Soar360@live.com 授权证书 GBP ...

  5. 关于String的一些基础小题目

    需求一:从键盘输入一串字符串,统计数字,字母,空格,其它字符的个数 import java.util.Scanner; public class Q1 { public static void mai ...

  6. Xcode 打包(Shell)

    1. xcodebuild 1.1 查当前可用的 sdk $xcodebuild -showsdks 1.2 查看所支持的target $xcodebuild -target 1.2 清空当前编译的a ...

  7. 偏差-方差均衡(Bias-Variance Tradeoff)

    众所周知,对于线性回归,我们把目标方程式写成:. (其中,f(x)是自变量x和因变量y之间的关系方程式,表示由噪音造成的误差项,这个误差是无法消除的) 对y的估计写成:. 就是对自变量和因变量之间的关 ...

  8. api跨域

    1.找方法名称是get开头的2.找get请求类型的 自定义webapi的路由规则,控制到action 1.跨域设置:(服务端)webconfig文件中,system.webServer节点下添加 &l ...

  9. 给dataframe添加一列索引

    测试数据自己瞎编的 需求:给现在df数据添加一列sid,要求这一列是和stock一一对应的整数 代码如下: import pandas as pd test_data = {'stock': ['AA ...

  10. Logstash处理json格式日志文件的三种方法

    假设日志文件中的每一行记录格式为json的,如: {"Method":"JSAPI.JSTicket","Message":"JS ...