本文转自Rancher Labs

Kubernetes可以帮助管理部署在Pod中的上百个容器的生命周期。它是高度分布式的并且各个部分是动态的。一个已经实现的Kubernetes环境通常涉及带有集群和节点的几个系统,这些系统托管着几百个容器,而这些容器不断地基于工作负载启动、毁灭。

当在Kubernetes中处理大量的容器化应用和工作负载时,主动进行监控和调试错误十分重要。在容器、节点或集群级别,这些错误都能在容器中看到。Kubernetes的日志机制是一个十分重要的组件,可以用来管理和监控服务以及基础设施。在Kubernetes中,日志可以让你跟踪错误甚至可以调整托管应用程序的容器的性能。

配置stdout(标准输出)和stderr(标准错误)数据流

图片来源:kubernetes.io

第一步是理解日志是如何生成的。通过Kubernetes,日志会被发送到两个数据流——stdout和stderr。这些数据流将写入JSON文件,并且此过程由Kubernetes内部处理。你可以配置将哪个日志发送到哪个数据流中。而一个最佳实践的建议是将所有应用程序日志都发送到stdout并且所有错误日志都发送到stderr。

决定是否使用Sidecar模型

Kubernetes建议使用sidecar容器来收集日志。在这一方法中,每个应用程序容器将有一个邻近的“streaming容器”,该容器将会将所有日志流传输到stdout和stderr。Sidecar模型可以帮助避免在节点级别公开日志,并且它可以让你控制容器级别的日志。

然而,这一模型的问题是它能够适用于小容量的日志记录,如果面对大规模的日志记录,可能会造成大量资源被占用。因此,你需要为每个正在运行的应用程序容器单独运行一个日志容器。在Kubernetes文档中,将sidecar模型形容为“几乎没有很大的开销”。需要由你决定是否尝试这一模型并在选择它之前查看它所消耗的资源类型。

替代方法是使用日志代理,该代理在节点级别收集日志。这样可以减少开销,并确保安全地处理日志。Fluentd已成为大规模聚合Kubernetes日志的最佳选择。它充当Kubernetes与你要使用Kubernetes日志的任意数量的端点之间的桥梁。你也可以选择像Rancher这样的Kubernetes管理平台,在应用商店已经集成了Fluentd,无需从头开始安装配置。

确定Fluentd可以更好地汇总和路由日志数据后,下一步就是确定如何存储和分析日志数据。

选择日志分析工具:EFK或专用日志记录

传统上,对于以本地服务器为中心的系统,应用程序日志存储在系统中的日志文件中。这些文件可以在定义的位置看到,也可以移动到中央服务器。但是对于Kubernetes,所有日志都发送到磁盘上/var/log的JSON文件中。这种类型的日志聚合并不安全,因为节点中的Pod可以是临时的也可以是短暂的。删除Pod时,日志文件将丢失。如果你需要尝试对部分日志数据丢失进行故障排除时,这可能很难。

Kubernetes官方推荐使用两个选项:将所有日志发送到Elasticsearch,或使用你选择的第三方日志记录工具。同样,这里存在一个潜在的选择。采用Elasticsearch路线意味着你需要购买一个完整的堆栈,即EFK堆栈,包括Elasticsearch、Fluentd和Kibana。每个工具都有其自己的作用。如上所述,Fluentd可以聚合和路由日志。Elasticsearch是分析原始日志数据并提供可读输出的强大平台。Kibana是一种开源数据可视化工具,可以从你的日志数据创建漂亮的定制dashboard。这是一个完全开源的堆栈,是使用Kubernetes进行日志记录的强大解决方案。

尽管如此,有些事情仍然需要牢记。Elasticsearch除了由名为Elastic的组织构建和维护,还有庞大的开源社区开发人员为其做贡献。尽管经过大量的实践检验,它可以快速、强大地处理大规模数据查询,但在大规模操作时可能会出现一些问题。如果采用的是自我管理(Self-managed)的Elasticsearch,那么需要有人了解如何构建大规模平台。

替代方案是使用基于云的日志分析工具来存储和分析Kubernetes日志。诸如Sumo Logic和Splunk等工具都是很好的例子。其中一些工具利用Fluentd来将日志路由到他们平台,而另一些可能有它们自己的自定义日志代理,该代理位于Kubernetes中的节点级别。这些工具的设置十分简单,并且使用这些工具可以花费最少的时间从零搭建一个可以查看日志的dashboard。

使用RBAC控制对日志的访问

在Kubernetes中身份验证机制使用的是基于角色访问控制(RBAC)以验证一个用户的访问和系统权限。根据用户是否具有特权(authorization.k8s.io/decision )并向用户授予原因(authorization.k8s.io/reason ),对在操作期间生成的审核日志进行注释。默认情况下,审核日志未激活。建议激活它以跟踪身份验证问题,并可以使用kubectl进行设置。

保持日志格式一致

Kubernetes日志由Kubernetes架构中不同的部分生成。这些聚合的日志应该格式一致,以便诸如Fluentd或FluentBit的日志聚合工具更易于处理它们。例如,当配置stdout和stderr或使用Fluentd分配标签和元数据时,需要牢记这一点。这种结构化日志提供给Elasticsearch之后,可以减少日志分析期间的延迟。

在日志收集守护进程上设置资源限制

由于生成了大量日志,因此很难在集群级别上管理日志。DaemonSet在Kubernetes中的使用方式与Linux类似。它在后台运行以执行特定任务。Fluentd和filebeat是Kubernetes支持的用于日志收集的两个守护程序。我们必须为每个守护程序设置资源限制,以便根据可用的系统资源来优化日志文件的收集。

结 论

Kubernetes包含多个层和组件,因此对其进行良好地监控和跟踪能够让我们在面对故障时从容不迫。Kubernetes鼓励使用无缝集成的外部“Kubernetes原生”工具进行日志记录,从而使管理员更轻松地获取日志。文章中提到的实践对于拥有一个健壮的日志记录体系结构很重要,该体系结构在任何情况下都可以正常工作。它们以优化的方式消耗计算资源,并保持Kubernetes环境的安全性和高性能。

Kubernetes日志的6个最佳实践的更多相关文章

  1. paip.log4j 日志系统 参数以及最佳实践

    paip.log4j 日志系统 参数以及最佳实践   %d{yyyy-MM-dd HH:mm:ss} [thrd:%t] %5p   loger:%c   (%C.%M.%L)  - %m%n 201 ...

  2. 可能是Asp.net Core On host、 docker、kubernetes(K8s) 配置读取的最佳实践

    写在前面 为了不违反广告法,我竭尽全力,不过"最佳实践"确是标题党无疑,如果硬要说的话 只能是个人最佳实践. 问题引出 ​ 可能很多新手都会遇到同样的问题:我要我的Asp.net ...

  3. 基于kubernetes集群的Vitess最佳实践

    概要 本文主要说明基于kubernetes集群部署并使用Vitess; 本文假定用户已经具备了kubernetes集群使用环境,如果不具备请先参阅基于minikube的kubernetes集群搭建, ...

  4. kubernetes发布解释型语言应用的最佳实践

    说明 k8s在发布编译型语言的应用时,几乎不用多考虑,就会选择将编译好jar/war包(java语言)或者二进制文件(golang/c++)直接打到镜像当中,生成新的应用镜像,然后将镜像推到镜像仓库, ...

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

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

  6. Atitit.log日志技术的最佳实践attilax总结

    Atitit.log日志技术的最佳实践attilax总结 1. 日志的意义与作用1 1.1. 日志系统是一种不可或缺的单元测试,跟踪调试工具1 2. 俩种实现[1]日志系统作为一种服务进程存在 [2] ...

  7. SpringBoot系列: Spring项目异常处理最佳实践

    ===================================自定义异常类===================================稍具规模的项目, 一般都要自定义一组异常类, 这 ...

  8. Kubernetes集群的监控报警策略最佳实践

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/M2l0ZgSsVc7r69eFdTj/article/details/79652064 本文为Kub ...

  9. Kubernetes生产环境最佳实践

    点击上方"开源Linux",选择"设为星标" 回复"学习"获取独家整理的学习资料! 众所周知,Kubernetes很难! 以下是在生产中使用 ...

随机推荐

  1. 【雕爷学编程】Arduino动手做(57)---四档矩形波模块

    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里 ...

  2. RabbitMQ应用示例

    更多详情参考官方文档:https://www.rabbitmq.com/tutorials/tutorial-six-python.html 参考博客:https://blog.csdn.net/we ...

  3. 基于Netty包中的Recycler实现的对象池技术详解

    一.业务背景 当项目中涉及到频繁的对象的创建和回收的时候,就会出现频繁GC的情况,这时就出现了池化的技术来实现对象的循环使用从而避免对象的频繁回收,Netty包下的Recycler就实现了这一功能.当 ...

  4. zoj3997网络流+数学

    题目大意就是每个人都有自己喜欢的座位编号,喜欢的编号是要x的倍数就好,(1<=x<=10)一共10种情况,每种情况的人的数目不一样. 给你一个n,代表有编号1-n这n个座位,问最多能满足多 ...

  5. poj2455 k条路最小化最长边

    Secret Milking Machine Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12414   Accepted ...

  6. 【c#】Visual Studio 的下载及安装

    “工欲善其事,必先利其器” 这篇博文我们介绍一下如何正确的安装基于c#使用的vs 2017. 1.首先在官网下载Visual Studio,下载地址:https://www.visualstudio. ...

  7. Element-UI自定义主题

    Element-UI自定义主题 1.介绍:我们可以自定义样式去覆盖element-ui的默认样式 // 在项目目录中新建 element-variables.scss 文件 // 上面为修改的变量 $ ...

  8. MAC 下SFT环境搭建及使用

    基本环境的搭建就不说了,网上一搜就是一堆 记录下正常的使用过程,主机-服务器是MAC机,从机-Windows机子 1.STF服务启动(挂后台的服务,启动后输入 exit退出进程即可) 后台启动DB:n ...

  9. Nginx 的过滤模块是干啥用的?

    上一篇文章我写了 Nginx 的 11 个阶段,很多人都说太长了.这是出于文章完整性的考虑的,11 个阶段嘛,一次性说完就完事了.今天这篇文章比较短,看完没问题. 过滤模块的位置 之前我们介绍了 Ng ...

  10. [Android应用开发] 05.广播和服务

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...