Kubernetes日志收集最佳实践及开源工具盘点

Selvam R 2023-08-25 09:50:47
Kubernetes是一种流行的开源容器编排平台,被开发人员和DevOps团队广泛用于部署和管理容器化应用程序。在Kubernetes上运行任何应用程序的一个关键方面是日志收集,它有助于监控应用程序的健康和性能,并快速解决问题。

 

在本文中,我们将讨论Kubernetes日志收集以及Kubernetes环境中的最佳实践。

 

什么是Kubernetes日志收集?

 

Kubernetes日志收集是指捕获和存储由Kubernetes集群和其中运行的应用程序生成的日志数据的过程。这些数据包括有关应用程序性能、错误、警告和其他事件的信息。

 

Kubernetes日志对于调试和解决分布式系统中的问题至关重要,并被开发人员、运营人员和安全团队用于监视和维护应用程序的健康。

 

Kubernetes日志收集的工作原理是什么?

 

Kubernetes日志由Kubernetes集群的各个组件生成,包括Kubernetes API服务器、kubelet、容器运行时以及集群上运行的应用程序。这些日志由作为Kubernetes Pod运行的日志收集代理收集和聚合,并发送到一个中央位置进行存储和分析。

 

在Kubernetes中最常用的日志收集代理是Fluentd,它是一个开源的数据收集器,可以收集、转换和转发日志数据到各种目标,包括Elasticsearch、Splunk和Kafka。其他流行的日志收集代理包括Logstash和Fluent Bit。

 

下面是使用Fluentd进行日志收集的示意图。

 

图片

 

示意图显示使用Fluentd进行日志收集的流程。

 

Kubernetes日志收集的最佳实践

 

以下是Kubernetes环境中的一些日志收集最佳实践:

 

  • 使用集中式日志收集解决方案

 

集中式日志收集解决方案允许您将日志存储和分析在一个中央位置,这样可以更容易地解决问题和监视应用程序性能。Elasticsearch、Splunk和Loggly是一些在Kubernetes中使用的流行的集中式日志收集解决方案。

 

  • 实施日志轮换

 

日志轮换是删除或归档旧日志以防止磁盘空间被填满的过程。为了避免磁盘空间不足,对Kubernetes日志进行配置日志轮换是必不可少的。

 

  • 使用结构化日志收集

 

结构化日志以结构化方式格式化日志消息,使得更容易搜索、过滤和分析日志数据。使用JSON或其他结构化日志收集格式代替纯文本,以便更容易从日志中提取信息。

 

  • 避免记录敏感信息

 

避免在Kubernetes日志中记录诸如密码、API密钥和其他凭据等敏感信息。而是使用环境变量或密钥管理工具来安全地存储这些信息。

 

  • 包括上下文信息

 

在日志中包括时间戳、主机名和请求ID等上下文信息,可以更容易地关联日志事件并解决问题。

 

  • 标记隐私信息

 

为了确保敏感数据的安全和隐私,建议在日志中标记或屏蔽任何敏感信息。您可以使用“priv”或“****”等标准格式来识别和屏蔽诸如密码、信用卡号码或个人身份信息(PII)等敏感数据。

 

  • 使用不同的日志级别

 

利用不同的日志级别,可以根据严重程度或重要性对日志消息进行分类。常见的日志级别包括DEBUG、INFO、WARNING、ERROR和CRITICAL。通过使用适当的日志级别,可以根据其在故障排除和调试过程中的重要性筛选和优先处理日志消息。

 

  • 将日志实时流式传输到日志服务器:与其仅依赖本地日志文件,建议将日志实时流式传输到集中式日志服务器或日志管理系统。这样可以确保日志集中收集和存储,更容易搜索、分析和长时间保留日志。流行的日志服务器和管理系统包括Elasticsearch、Splunk和Graylog。

 

  • 启用日志轮换:配置日志轮换以防止日志文件无限增长并占用过多的磁盘空间。通过设置日志轮换参数,可以控制日志文件的大小、保留的日志文件数量以及轮换的频率。这种做法可以高效管理日志,避免磁盘空间问题。

 

其他工具介绍

 

虽然kubectl logs是在Kubernetes中检索日志的标准命令,但也有一些开源的CLI工具可用,提供了额外的功能和增强的日志收集能力。其中一个工具是kubetail,它允许您同时查看多个Pod的日志。以下是一些可用于Kubernetes日志收集的开源CLI工具:

 

  • Kubetail: Kubetail是一个简单的实用程序,可以在Kubernetes集群中从多个Pod中查看日志。它将来自多个Pod的日志聚合并流式传输到终端,让您可以同时查看来自不同来源的实时日志。Kubetail在调试分布式系统或监视多个Pod中的应用程序行为时特别有用。

     

  • Stern:Stern是另一个专为Kubernetes设计的功能强大的日志尾随工具。它允许您从Kubernetes集群中的多个Pod和容器中查看日志,并提供颜色编码的输出以便于识别。Stern还支持基于正则表达式的过滤,便于专注于特定的日志消息或模式。

     

  • Kail: Kail是一个CLI工具,可以从Kubernetes集群中的多个Pod中进行日志流式传输和尾随。它支持原始和JSON格式的日志输出,适用于不同的用例。Kail还提供了基于标签或命名空间的日志过滤选项,允许您根据需要缩小日志输出范围。

     

  • Logcli: Logcli是Loki生态系统的一部分,提供了一个命令行界面,用于查询存储在Loki中的日志,这是一个水平可扩展的日志聚合系统。它允许您根据标签、时间范围和日志级别等各种参数搜索和检索日志。当您拥有基于Loki的集中式日志收集解决方案,并希望高效地查询和分析日志时,Logcli非常有用。

 

这些开源CLI工具为Kubernetes中的日志收集和分析提供了额外的功能和灵活性。根据您的具体需求,您可以选择最适合您需求并与现有的日志基础设施良好集成的工具。

 

请注意,在使用任何第三方工具时,请确保它们来自可信的来源,并查阅其文档以获取安装和使用说明。

 

在Kubernetes环境中,有各种命令可用于检查日志。下面是您可以与kubetail一起使用的一些命令来检查Kubernetes日志:

 

  • 从特定的Pod中尾随日志:

 

  •  
kubectl logs -f <pod-name>

 

此命令将流式传输并显示指定Pod的日志。您可以包含多个Pod名称以同时尾随多个Pod的日志。

 

  • 从与标签选择器匹配的Pod中尾随日志:

 

  •  
kubectl logs -f -l <label-selector>

 

此命令将流式传输并显示与指定的标签选择器匹配的所有Pod的日志。

 

  • 从特定命名空间中的所有Pod中尾随日志:

 

  •  
kubectl logs -f -n <namespace>

 

此命令将流式传输并显示指定命名空间中所有Pod的日志。

 

  • 使用通配符表达式从多个Pod中尾随日志:

 

  •  
kubectl logs -f <pod-name-pattern>

 

此命令允许您指定多个Pod名称或使用通配符表达式从多个Pod中尾随日志。例如:

 

  •  
kubectl logs -f my-app-*

 

这将从以“my-app-”开头的所有Pod中尾随日志。

 

  • 在日志输出中包含时间戳:

 

  •  
kubectl logs -f --timestamps <pod-name>

 

此命令将显示带有时间戳的日志,以便您可以查看日志消息生成的时间。

 

  • 停止从特定Pod中尾随日志:

 

  •  
Ctrl + C

 

此命令将停止流式传输和显示指定Pod的日志。

 

这些是您可以使用kubetail高效尾随Kubernetes集群中多个Pod的常用命令。在使用这些命令之前,请确保安装和设置kubetail。有关安装说明和其他功能,请参阅kubetail的文档。

 

在使用kubetail时,您还可以通过指定其Pod名称来查看Kubernetes控制平面组件的日志。下面是如何查看一些常用控制平面组件的日志:

 

  • 查看Kubernetes API服务器的日志:

 

  •  
kubectl logs -f -n kube-system <api-server-pod-name>

 

将替换为API服务器Pod所在的节点的实际名称。此命令将尾随API服务器的日志。

 

  • 查看Kubernetes控制器管理器的日志:

 

  •  
kubectl logs -f -n kube-system <controller-manager-pod-name>

 

将替换为控制器管理器Pod所在的节点的名称。此命令将尾随控制器管理器的日志。

 

  • 查看Kubernetes调度器的日志:

 

  •  
kubectl logs -f -n kube-system <scheduler-pod-name>

 

将替换为调度器Pod所在的节点的名称。此命令将尾随调度器的日志。

 

  • 查看etcd集群的日志:

 

  •  
kubectl logs -f -n kube-system <etcd-pod-name>

 

将替换为etcd Pod所在的节点的名称。此命令将尾随etcd集群的日志。

 

记得用实际运行相应控制平面组件Pod的节点名称替换。-n kube-system标志用于指定控制平面组件通常部署的命名空间。

 

通过 tail 这些控制平面组件的日志,您可以监视它们的活动,检测任何问题或错误,并深入了解您的Kubernetes集群的行为。

 

总结

 

Kubernetes日志收集是在Kubernetes上运行应用程序的关键方面。在Kubernetes环境中,集中式日志收集解决方案、日志轮换、结构化日志收集、避免敏感信息以及包括上下文信息等是一些日志收集的最佳实践。

 

遵循这些最佳实践,可以确保您的Kubernetes日志安全存储、易于搜索和分析,并快速帮助您解决问题。

 

作者丨Selvam R     编译丨公众号:云原生架构之美(ID:wangqsh999)
来源丨https://www.cncf.io/blog/2023/07/03/kubernetes-logging-best-practices/
dbaplus社群欢迎广大技术人员投稿,投稿邮箱:editor@dbaplus.cn
最新评论
访客 2023年08月20日

230721

访客 2023年08月16日

1、导入Mongo Monitor监控工具表结构(mongo_monitor…

访客 2023年08月04日

上面提到: 在问题描述的架构图中我们可以看到,Click…

访客 2023年07月19日

PMM不香吗?

访客 2023年06月20日

如今看都很棒

活动预告