本文转自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. react-router 4v 路由嵌套问题

    嵌套的路由中,子级的Link跳转到父级时,页面无法整个渲染到父级. 原因:某一级的路由用了Router组件,导致内部Link的时候无法将整个页面渲染到“/” 解决方法:全局一个Router. 子级的兄 ...

  2. Codeforces1144C(C题)Two Shuffled Sequences

    C. Two Shuffled Sequences Two integer sequences existed initially — one of them was strictly increas ...

  3. SpringBoot2.x整合quartz实现多任务定时执行

    一.pom文件中导入相关依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifa ...

  4. 【MySQL】剖析MySQL读写分离技术

    主从技术的一个基本流程图: 如何实现主从复制的呢: MySQL  Master(主节点) 1>当一个请求来时,首先由[mysqld]写入到我们的主[data]中 2>然后[mysqld]将 ...

  5. 【C#图解教程学习笔记】第13章 委托

    13.1 什么是委托 委托是持有一个或多个方法的对象,可将一个方法传递到另一个方法. 委托是用户自定义的引用类型. 13.2 委托概述 类表示的是数据和方法的集合,而委托持有一个或多个方法,以及一系列 ...

  6. Flask搭建个人博客网站(1)—项目规划--李渣渣(lizaza.cn)

    Flask搭建个人博客网站(1)—项目规划--李渣渣(lizaza.cn) 发布时间:2020-05-2413次浏览 前言 现在市面上又许多比较成熟的博客平台,例如:CSDN,博客园,新浪博客等!对于 ...

  7. 关于 conda中的 lxml 无法导入 etree 问题

    找到你conda的安装目录下\Lib\site-packages下的两个文件夹lxml和lxml-4.3.4.dist-info,将这两个文件夹删除. 执行命令pip install lxml 重新安 ...

  8. httpclient介绍与请求方式详解

    httpClient工具介绍 HTTP协议可能是现在lntemet上使用得最多.最重要的协议了,越来越多的Java应用程序需要直接通过HTTP协议来访问网络资源.虽然在JDK的java.net包中已经 ...

  9. [SD心灵鸡汤]003.每月一则 - 2015.07

    乔布斯去世了,但他留给世人的财富却很多,值得每个人学习.他是个精力充沛魅力无限的家伙,同时也是一个很会鼓动人心的激励大师,甚至在他的平常对话中,经典的语句也常常脱口而出. 这里摘取了一些他的经典语录, ...

  10. 性能测试之Docker监控

    微服务.大中台盛行的当下,容器化已经被广泛使用.在性能测试过程中,对容器的监控模型构建也是必不可少的. 我们性能测试监控模型的构建一直是围绕着Prometheus和Grafana来展开的.她们可以快速 ...