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

Kubernetes 提供了一组强大的工具来管理容器、pod 和应用程序。在这些工具中,kubectl 是命令行实用程序,充当与 Kubernetes 集群交互的主要界面。
管理 Kubernetes 应用程序的一个重要方面是有效处理日志。
在本指南中,我们将探讨 kubectl get logs 命令、其变体和实际示例,以帮助您掌握 Kubernetes 日志管理。
Kubectl 日志基础知识
kubectl logs 命令是访问 Kubernetes 集群中运行的 Pod 内的容器日志的网关。
它允许您从容器中检索日志,这对于调试、监控和故障排除非常有用。
这是基本语法:
xml
kubectl logs <pod-name>
将替换为您要为其获取日志的 Pod 的名称。默认情况下,此命令从指定 pod 的主容器中检索最新日志。
Kubectl 日志工作原理?
kubectl log 命令(带或不带 -f 标志)利用 Kubernetes 的 API 来访问容器日志。以下是其工作原理的详细说明:
-
当您运行 kubectl 日志时,它会使用安装和使用kubectl的系统中的kubeconfig 文件中配置的凭据向 Kubernetes 集群进行身份验证。 Kubernetes基于角色的访问控制 (RBAC)可确保您拥有访问 pod 日志的必要权限。
-
kubectl 日志通过您作为参数提供的名称来标识目标 pod。
-
当您使用
-c
标志指定容器时kubectl与 Kubernetes API 通信以从 pod 内的指定容器获取日志。 -
Kubernetes API 服务器与调度 pod 的节点上运行的 Kubelet 进行通信。Kubelet 反过来访问容器运行时(Crio-D、Containerd、Docker等)来获取日志。
-
如果您使用
-f 或 --follow
标志, kubectl 会建立到 Kubelet 的 WebSocket 连接。此连接允许实时传输日志。 新的日志条目在由容器写入时会不断获取并显示在您的终端上。 -
kubectl
格式化并在您的终端上显示日志条目。日志通常会显示时间戳和其他元数据,以帮助您了解事件发生的时间。
本质上,kubectl日志充当本地终端和[Kubernetes集群](https://humalect.com/docs/cluster-overview)之间的桥梁,以用户友好的方式促进日志流。
如何查看 Kubectl Pod 日志?
在管理 Kubernetes 集群时,检查 pod 日志是出于调试和监控目的的常见任务。
如前所述, kubectl logs
命令是执行此操作的主要工具。在本节中,我们将重点介绍如何使用_kubectl_有效检查 pod 日志。
检索 Pod 日志
要从特定 pod 检索日志,您只需使用_kubectl messages_命令,后跟 pod 的名称:
bash
kubectl log <pod name>
此命令为您提供指定 Pod 中主容器生成的最新日志条目。
假设您有一个名为my-app-pod
的 pod 。要从此 pod 检索日志,您可以执行:
perl
kubectl log my-app-pod
此命令显示my-app-pod pod主容器生成的最新日志条目。
获取Pod内的特定容器中的日志
在 Kubernetes 中,一个 Pod 可以托管多个容器。
当您想要从 pod 内的特定容器检索日志时,可以将-c 或 --container
标志与kubectl messages
结合使用。
它的工作原理如下:
xml
kubectl logs <pod-name> -c <container-name>
这在处理托管多个容器的 Pod 时特别有用,每个容器负责应用程序的不同方面。
想象一下您的 pod my-app-pod 有两个容器: app-container 和 sidecar-container 。要从 sidecar-container 获取日志,您可以运行:
perl
kubectl log my-app-pod -c sidecar-container
此命令获取并显示my-app-pod 中 sidecar-container 生成的日志。
获取较早的日志
如果您需要访问特定时间点的日志或查看历史日志条目,可以使用-n
或--tail
标志从日志流末尾获取特定数量的行:
xml
kubectl log <pod name> -n <line count>
将__替换为您要从日志流末尾检索的行数。
假设您想要从 my-app-pod 检索最后 50 行日志行。
你会执行:
perl
kubectl log my-app-pod -n 50
此命令提供指定 Pod 中最新的 50 条日志条目。
实时流式传输日志
默认情况下,kubectl log
将检索并显示日志作为一次性操作。
但是,您可以使用-f
或--follow
标志实时流式传输日志,类似于本地系统上的 tail -f 命令:
bash
kubectl log -f <pod name>
此命令连续显示容器生成的新日志条目。它对于监视应用程序和捕获实时调试信息特别有用。
要从my-app-pod 实时流式传输日志,您可以执行:
bash
kubectl log -f <pod name>
此命令使连接保持打开状态,并允许您在新日志条目写入日志流时查看它们。
Kubectl 节点级日志的局限性
虽然 kubectl 可以提供对节点级活动的基本洞察,但与专用的节点级监控解决方案相比,它有一些局限性。
以下是需要考虑的一些限制:
-
有限的容器洞察
: 来自节点的 kubectl 日志主要从 kubelet 进程检索日志,该进程管理节点上的 pod。它可能不会提供 Pod 内各个容器的详细日志。 -
缺乏上下文
:节点级日志缺乏 Pod 和容器详细信息的上下文。您不会看到哪些 Pod 或容器生成了特定的日志条目。 -
无聚合
:kubectl不会聚合来自多个节点的日志。您需要在每个节点上单独运行该命令才能访问日志,这在较大的集群中可能不切实际。
如何查看Kubectl 容器日志
在 Kubernetes 中,一个 Pod 可以托管一个或多个容器,每个容器负责应用程序中的特定任务。为了有效地管理这些容器并对其进行故障排除,您需要单独访问它们的日志。
这就是 kubectl log 命令的闪光点。
访问容器日志
要访问 Pod 中特定容器的日志,您可以使用 kubectl logs 命令,并使用_-c_或_--container_标志,后跟容器名称:
xml
kubectl logs <pod-name> -c <container-name>
定制容器日志输出
kubectl log提供了多个选项来定制日志输出,使其更方便地进行故障排除和监控。
您可以获取较早的日志、实时流式传输日志,或者在 pod 重新启动时从以前的容器中检索日志。
获取较早的容器日志
如果您需要查看历史日志条目或特定时间点的访问日志,可以将-n或--tail标志与kubectl log一起使用:
xml
kubectl 日志 <pod name> -c <container name> -n <line count>
实时流式传输容器日志
对于实时监控和调试,您可以将-f或--follow标志与 kubectl 日志一起使用,以实时流式传输来自特定容器的日志:
xml
kubectl logs -f <pod-name> -c <container-name>
此命令会持续显示容器生成的新日志条目,使您可以实时监控容器的行为。
要从my-app-pod中的 sidecar-container 实时流式传输日志,您可以执行:
perl
kubectl log -f my-app-pod -c sidecar-container
此命令保持连接打开,并为您提供指定容器中日志条目的实时更新。
从之前的容器中获取日志(Pod重启)
在 pod 重新启动的情况下,您仍然可以通过使用-p或--previous标志和kubectl logs来访问 pod 中以前的容器中的日志:
r
kubectl log -p <pod name> -c <container name>
假设您的 my-app-pod 已重新启动,并且您想要访问之前的 sidecar-container 中的日志。你会运行:
perl
kubectl log -p my-app-pod -c container1
此命令从Pod 重新启动之前运行的sidecar-container检索日志。
如何查看 Kubectl 部署日志
在 Kubernetes 中,部署是用于管理容器化应用程序的部署和扩展的公共资源。
监视部署日志对于确保更新成功、跟踪更改和诊断问题至关重要。
在本节中,我们将探讨如何使用 kubectl 访问部署日志。
获取部署日志的命令是:
xml
kubectl logs deployment/<name-of-deployment>
假设部署了一个部署blue-app 。要访问其日志,您将使用:
bash
kubectl logs deployment/blue-app
要获取此部署的实时日志,请像其他命令一样使用-f命令:
xml
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 环境中的日志,从而更轻松地诊断问题、监控应用程序运行状况并确保集群的安全。