Kubernetes日志完全指南与最佳实践

1,620 阅读10分钟

在本 Kubernetes 指南中,我们将通过示例讨论有关 Kubernetes 日志和 kubectl log 命令的所有内容 - 它们如何工作以及如何获取节点、容器、部署等的日志,以及日志记录的最佳实践

kubectl 获取日志、kubernetes 日志

Kubernetes 提供了一组强大的工具来管理容器、pod 和应用程序。在这些工具中,kubectl 是命令行实用程序,充当与 Kubernetes 集群交互的主要界面。

管理 Kubernetes 应用程序的一个重要方面是有效处理日志。

在本指南中,我们将探讨 kubectl get logs 命令、其变体和实际示例,以帮助您掌握 Kubernetes 日志管理。

Kubectl 日志基础知识


kubectl logs 命令是访问 Kubernetes 集群中运行的 Pod 内的容器日志的网关。

它允许您从容器中检索日志,这对于调试、监控和故障排除非常有用。

这是基本语法:

kubectl logs <pod-name>

将替换为您要为其获取日志的 Pod 的名称。默认情况下,此命令从指定 pod 的主容器中检索最新日志。

Kubectl 日志工作原理?


kubectl log 命令(带或不带 -f 标志)利用 Kubernetes 的 API 来访问容器日志。以下是其工作原理的详细说明:

  1. 当您运行 kubectl 日志时,它会使用安装和使用kubectl的系统中的kubeconfig 文件中配置的凭据向 Kubernetes 集群进行身份验证。 Kubernetes基于角色的访问控制 (RBAC)可确保您拥有访问 pod 日志的必要权限。

  2. kubectl 日志通过您作为参数提供的名称来标识目标 pod。

  3. 当您使用-c标志指定容器时kubectl与 Kubernetes API 通信以从 pod 内的指定容器获取日志。

  4. Kubernetes API 服务器与调度 pod 的节点上运行的 Kubelet 进行通信。Kubelet 反过来访问容器运行时Crio-D、Containerd、Docker等)来获取日志。

  5. 如果您使用 -f 或 --follow 标志, kubectl 会建立到 Kubelet 的 WebSocket 连接。此连接允许实时传输日志。 新的日志条目在由容器写入时会不断获取并显示在您的终端上。

  6. kubectl格式化并在您的终端上显示日志条目。日志通常会显示时间戳和其他元数据,以帮助您了解事件发生的时间。

本质上,kubectl日志充当本地终端和[Kubernetes集群](https://humalect.com/docs/cluster-overview)之间的桥梁,以用户友好的方式促进日志流。

如何查看 Kubectl Pod 日志?


在管理 Kubernetes 集群时,检查 pod 日志是出于调试和监控目的的常见任务。

如前所述, kubectl logs命令是执行此操作的主要工具。在本节中,我们将重点介绍如何使用_kubectl_有效检查 pod 日志。

检索 Pod 日志

要从特定 pod 检索日志,您只需使用_kubectl messages_命令,后跟 pod 的名称:

kubectl log <pod name>

此命令为您提供指定 Pod 中主容器生成的最新日志条目。

假设您有一个名为my-app-pod的 pod 。要从此 pod 检索日志,您可以执行:

kubectl log my-app-pod

此命令显示my-app-pod pod主容器生成的最新日志条目。

获取Pod内的特定容器中的日志

在 Kubernetes 中,一个 Pod 可以托管多个容器。

当您想要从 pod 内的特定容器检索日志时,可以将-c 或 --container标志与kubectl messages结合使用。

它的工作原理如下:

kubectl logs <pod-name> -c <container-name>

这在处理托管多个容器的 Pod 时特别有用,每个容器负责应用程序的不同方面。

想象一下您的 pod my-app-pod 有两个容器: app-container 和 sidecar-container 。要从 sidecar-container 获取日志,您可以运行:

kubectl log my-app-pod -c sidecar-container

此命令获取并显示my-app-pod 中 sidecar-container 生成的日志。

获取较早的日志

如果您需要访问特定时间点的日志或查看历史日志条目,可以使用-n--tail标志从日志流末尾获取特定数量的行:

kubectl log <pod name> -n <line count>

将__替换为您要从日志流末尾检索的行数。

假设您想要从 my-app-pod 检索最后 50 行日志行。

你会执行:

kubectl log my-app-pod -n 50

此命令提供指定 Pod 中最新的 50 条日志条目。

实时流式传输日志

默认情况下,kubectl log将检索并显示日志作为一次性操作。

但是,您可以使用-f--follow标志实时流式传输日志,类似于本地系统上的 tail -f 命令:

kubectl log -f <pod name>

此命令连续显示容器生成的新日志条目。它对于监视应用程序和捕获实时调试信息特别有用。

要从my-app-pod 实时流式传输日志,您可以执行:

kubectl log -f <pod name>

此命令使连接保持打开状态,并允许您在新日志条目写入日志流时查看它们。

Kubectl 节点级日志的局限性

虽然 kubectl 可以提供对节点级活动的基本洞察,但与专用的节点级监控解决方案相比,它有一些局限性。

以下是需要考虑的一些限制:

  1. 有限的容器洞察: 来自节点的 kubectl 日志主要从 kubelet 进程检索日志,该进程管理节点上的 pod。它可能不会提供 Pod 内各个容器的详细日志。

  2. 缺乏上下文:节点级日志缺乏 Pod 和容器详细信息的上下文。您不会看到哪些 Pod 或容器生成了特定的日志条目。

  3. 无聚合:kubectl不会聚合来自多个节点的日志。您需要在每个节点上单独运行该命令才能访问日志,这在较大的集群中可能不切实际。

如何查看Kubectl 容器日志

在 Kubernetes 中,一个 Pod 可以托管一个或多个容器,每个容器负责应用程序中的特定任务。为了有效地管理这些容器并对其进行故障排除,您需要单独访问它们的日志。

这就是 kubectl log 命令的闪光点。

访问容器日志

要访问 Pod 中特定容器的日志,您可以使用 kubectl logs 命令,并使用_-c_或_--container_标志,后跟容器名称:

kubectl logs <pod-name> -c <container-name>

定制容器日志输出

kubectl log提供了多个选项来定制日志输出,使其更方便地进行故障排除和监控。

您可以获取较早的日志、实时流式传输日志,或者在 pod 重新启动时从以前的容器中检索日志。

获取较早的容器日志

如果您需要查看历史日志条目或特定时间点的访问日志,可以将-n或--tail标志与kubectl log一起使用:

kubectl 日志 <pod name> -c <container name> -n <line count>

实时流式传输容器日志

对于实时监控和调试,您可以将-f或--follow标志与 kubectl 日志一起使用,以实时流式传输来自特定容器的日志:

kubectl logs -f <pod-name> -c <container-name>

此命令会持续显示容器生成的新日志条目,使您可以实时监控容器的行为。

要从my-app-pod中的 sidecar-container 实时流式传输日志,您可以执行:

kubectl log -f my-app-pod -c sidecar-container

此命令保持连接打开,并为您提供指定容器中日志条目的实时更新。

从之前的容器中获取日志(Pod重启)

在 pod 重新启动的情况下,您仍然可以通过使用-p或--previous标志和kubectl logs来访问 pod 中以前的容器中的日志:

kubectl log -p <pod name> -c <container name>

假设您的 my-app-pod 已重新启动,并且您想要访问之前的 sidecar-container 中的日志。你会运行:

kubectl log -p my-app-pod -c container1

此命令从Pod 重新启动之前运行的sidecar-container检索日志。

如何查看 Kubectl 部署日志

在 Kubernetes 中,部署是用于管理容器化应用程序的部署和扩展的公共资源。

监视部署日志对于确保更新成功、跟踪更改和诊断问题至关重要。

在本节中,我们将探讨如何使用 kubectl 访问部署日志。

获取部署日志的命令是:

kubectl logs deployment/<name-of-deployment>

假设部署了一个部署blue-app 。要访问其日志,您将使用:

kubectl logs deployment/blue-app

要获取此部署的实时日志,请像其他命令一样使用-f命令:

kubectl logs -f deployment/<name-of-deployment>

其他常见问题

1. 如何查看我的Kubelet日志?

要检查 Kubernetes 节点中的 kubelet 日志,通常可以在/var/log/kubelet.log文件中找到它们。您可以使用标准文本编辑器或 cat、less 或 tail 等命令查看这些日志,以进行故障排除和监控节点级活动和容器相关事件。

2.如何获取Kubernetes中所有Pod的日志?

您可以使用带有 kubectl 日志的标签选择器从 Kubernetes 中的所有 Pod 检索日志。例如,要从所有标有app=my-app 的 pod 中获取日志,您可以运行kubectl messages -l app=my-app。此命令将聚合并显示与指定标签选择器匹配的所有 Pod 的日志。

Kubernetes 日志记录最佳实践

Kubernetes有很多最佳实践;这里有一些用于记录。

正确构建您的日志

使用标准格式(例如 JSON)构建日志消息。结构化日志更容易使用日志聚合工具进行分析,从而更轻松地从日志中提取有价值的信息。

切勿记录敏感数据

切勿记录密码等敏感信息。相反,依靠环境变量或密钥保管库等秘密管理工具来处理敏感数据。

集中记录系统

将来自所有 Pod 和容器的日志发送到集中式日志系统。流行的选择包括 EFK、LFG 或 AWS CloudWatch、Google Cloud Logging 或 Azure Monitor 等托管服务。

使用日志轮换策略

配置日志轮换策略以管理日志文件大小。这可以防止日志占用节点中的所有磁盘空间,并为重要数据提供一些空间。

资源的可用性

确保您的 Pod 拥有大量资源。这可以通过为进入集群的每个 Pod 分配有限数量的请求和限制来确保。

如果没有资源限制,它可能会影响集群的性能。

元数据是必须的

在日志条目中包含元数据,例如时间戳、pod 和容器名称以及命名空间信息。在诊断问题时,这些上下文信息非常宝贵。

包括特定于应用程序的指标

不仅记录错误,还记录重要的特定于应用程序的指标和事件。这些数据可以帮助识别性能瓶颈并跟踪用户行为。

此外,还可以根据组织的要求和合规性法规定义日志保留策略。自动删除或归档不再需要的日志。

**

监控您的日志

定期监控日志记录基础设施的运行状况和性能。 这包括日志记录组件本身,例如 Fluentd、Fluent Bit 或 Logstash,以及存储后端。

正确设置警报

根据日志模式和异常情况设置警报。定期测试这些警报以确保它们在需要时触发。

例如,每当 pod 请求的 pod 数量超出预期或频繁进入挂起状态时,您应该尽早收到通知,以便您可以在生产完全受到影响之前解决问题。

通过遵循这些最佳实践,您可以有效地管理和利用 Kubernetes 环境中的日志,从而更轻松地诊断问题、监控应用程序运行状况并确保集群的安全。