如何实现 Kubernetes 可观察性:原则和最佳实践

一群女性软件工程师共同开发项目

Kubernetes (K8s) 容器和环境是大规模打包、部署和管理容器化应用程序的主流方法。Kubernetes 的动态、开源、基于微服务的配置,非常适合那些希望更大限度提高基础设施敏捷性的企业。然而,Kubernetes 备受欢迎的分布式灵活性也给 Kubernetes 监测和可观察性实践的实施带来了挑战。

可观察性包含一系列流程和指标,可帮助团队通过检查系统输出来获得对系统内部状态的可操作洞察。它是维护任何 IT 基础架构的重要组成部分。然而,Kubernetes 环境包含了海量的数据、节点、Pod、服务和端点,有效管理这些元素需要采用适当的可观察性实践。

在这篇博客文章中,我们将讨论 Kubernetes 可观察性的工作原理,以及组织如何使用它来优化云原生 IT 架构。

可观察性如何工作?

就广义而言,可观察性描述了可从外部输出推断出内部系统状态的程度。它涉及诊断和了解系统为何会以特定方式来运行的能力,而这对于故障排除、破译性能问题和改进系统设计均至关重要。

DevOps 中,可观察性的概念已发展为指代遥测数据所指示的系统状态的端到端可见性。其中使用的主要数据类别(被称为“可观察性的三大支柱”)分别为日志、指标和跟踪。

日志

日志包括系统中每次出现某些情况时所记录的离散事件;例如,状态或错误消息,或是事务详细信息。Kubernetes 日志可用结构化与非结构化文本来编写。

指标

CPU 使用率、内存消耗、网络 I/O、请求延迟或任何业务特定指标。Kubernetes 指标常常被汇总成时间序列可观察性数据,这些数据可以帮助团队发现趋势和识别模式。

跟踪

跟踪帮助团队追踪一个请求或事务在分布式系统的各种服务和组件之间的流动路径。跟踪还能帮助团队以可视化方式直观地了解基础架构不同组件之间的依赖关系,一旦出现延迟或错误,就能迅速找到问题所在。

成功实现可观察性需部署适当的 Kubernetes 监控工具,同时实施有效的流程来收集、存储和分析这三项主要输出。其中可能包括建立并维护监控系统、应用程序日志聚合器、应用性能管理 (APM) 工具或其他可观察性平台。

然而,Kubernetes 环境还要求对标准指标进行更全面的检查。Kubernetes 系统是一个由互连容器、微服务和其他组件组成的庞大环境,所有这些组件会生成大量数据。Kubernetes 在应用程序生命周期中调度和自动执行与容器相关的任务,包括:

部署

Kubernetes 可以将指定数量的容器部署到指定主机上,并让容器以期望状态保持运行。

发布

“发布”是一种 Kubernetes 部署修改。Kubernetes 允许团队启动、暂停、恢复和回滚发布。

服务发现

Kubernetes 可以使用 DNS 名称或 IP 地址自动将容器公开到互联网或其他容器。

自动扩展

当流量激增时,Kubernetes 可自动启动新的集群来处理额外的工作负载

存储配置

团队可以设置 Kubernetes 来挂载持久化本地或云存储供容器使用。

负载均衡

根据 CPU 使用率或自定义指标,Kubernetes 的负载均衡功能可以在网络中分配工作负载,以保持性能和稳定性。

自我修复,实现高可用性

Kubernetes 可自动调试、重启或替换故障容器以免发生停机。此外,它还可取消不符合健康检查要求的容器。

由于存在如此众多的移动、交互和分层组件,因此会出现很多潜在问题和故障点;为此,在很多领域实时监控就变得十分必要了。同时,它还意味着用于监控日志、指标和跟踪的传统方法可能不足以在 Kubernetes 环境中实现可观察性。

Kubernetes 可观察性原则

由于 Kubernetes 架构中的每个组件均相互依赖,因此实现可观察性需要一个更为全面的方法。

Kubernetes 可观察性要求组织不仅仅收集和分析集群级别的日志、跟踪和指标数据,还需要更进一步,将数据点关联起来,以便更好地了解 Kubernetes 集群内部的关系和事件,这是该过程的核心所在。这意味着,组织必须依赖量身定制的云原生可观察性策略,并仔细检查系统内的每个可用数据源。

K8s 环境中的可观察性涉及:

1. 超越指标、日志和应用程序。与虚拟机 (VM) 监测非常相似,Kubernetes 可观察性必须考虑所有日志数据(来自容器、主节点和工作程序节点以及底层基础架构)和应用程序级指标。然而,与 VM 不同的是,Kubernetes 可以协调超越应用程序和集群的容器交互。因此,Kubernetes 环境在网络集群和应用程序外部和内部存储了大量有价值的数据,包括 CI/CD 管道(输入 K8s 集群)和 GitOps 工作流(驱动 K8s 集群)中的数据。

Kubernetes 也不会像传统应用程序和 VM 那样公开指标、日志和跟踪数据。Kubernetes 倾向于捕获数据“快照”,即在生命周期中某个特定时刻捕获的信息。如果系统中每个集群中的每个组件以不同的格式和不同的速度记录不同类型的数据,那么仅通过分析离散数据点来建立可观察性可能会很困难,甚至不可能。

此外,Kubernetes 不会创建应用程序或集群级别的主日志文件。每个应用程序和集群都会在各自的环境中记录数据,因此用户必须手动汇总和导出数据,才能在一个位置查看所有数据。由于容器可以在几秒钟内启动、关闭或完全消失,因此在没有适当上下文的情况下,即使是手动聚合的数据也可能无法全面反映实际情况。

2. 优先考虑情境和数据相关性。监控和可观察性是维护高效 Kubernetes 基础设施的关键组成部分。它们的与众不同之处在于目标。监控有助于阐明系统中出现的情况,而可观察性则旨在阐明系统为何会以此方式运行。为此,行之有效的 Kubernetes 可观察性会优先连接各数据点之间的点,以便找到性能瓶颈与功能问题的根本原因。

要了解 Kubernetes 集群行为,您必须在所有其他集群事件的情境下了解集群中的每个独立事件、集群的一般行为以及最终导致相关事件的所有其他事件。

例如,如果一个 Pod 在一个工作程序节点中启动,却在另一个工作程序节点中终止,则您需要了解其他 Kubernetes 节点中同时发生的所有事件,以及其他 Kubernetes 服务、API 服务器和命名空间发生的所有事件,才能清楚地了解该变更、其根本原因及其潜在后果。

换句话说,在 Kubernetes 环境中,仅仅监测任务通常是不够的。为了实现 Kubernetes 可观察性,获得相关的系统洞察,或开展准确的根本原因分析,IT 团队必须能够聚合整个网络的数据并将其情境化。

3. 使用 Kubernetes 可观察性工具。实施和维护 Kubernetes 可观察性是一项庞大且复杂的工作。但是,使用正确的框架和工具可简化此流程,并提高整体数据可视化程度和透明度。

企业可从一系列可观察性解决方案中进行选择,其中包括可自动执行指标聚合和分析的程序(如 Prometheus 和 Grafana)、能自动记录日志的程序(如 ELK、Fluentd 和 Elasticsearch)以及可提升跟踪可见性的程序(如 Jaeger)。OpenTelemetry 等集成解决方案可管理全部三大可观察性实践。定制的云原生解决方案(如 Google Cloud Operations、AWS X-Ray、Azure Monitor 和 IBM Instana Observability)则可提供针对其基础设施上运行的集群而进行优化的可观察性工具和 Kubernetes 仪表板。

优化 Kubernetes 可观察性的最佳实践

定义您的 KPI。确定哪些关键性能指标(例如,应用程序性能、系统运行状况和资源使用情况)最有助您深入了解基础设施的行为。按需对其进行修改。
集中记录。K8s 环境会生成大量数据。使用集中记录解决方案来汇总和存储这些数据是数据管理不可或缺的一部分。
监控资源使用情况。收集有关内存、CPU 和网络使用情况的实时数据,以便在必要时主动扩展资源。
设置警报和告警。使用既定的 KPI 阈值来配置警报和告警。该做法可让团队在出现问题时及时收到通知。

使用 IBM Instana Observability 建立 Kubernetes 可观察性

Kubernetes 是行业标准的容器编排平台,它可显著提高管理容器化工作负载的效率。但是,Kubernetes 的分布式、多层微服务架构却需要强大的可观察性机制以及先进的解决方案,例如 IBM Instana Observability。

Instana Observability 提供自动化的 Kubernetes 可观察性和 APM 功能,旨在监测所有 Kubernetes 发行版的整个 Kubernetes 应用程序堆栈 - 从节点和 Pod 到容器和应用程序。

Kubernetes 中的可观察性不仅仅是一种技术实现,更是一种战略方法,需要周密的规划和重视数据透明度的组织文化。

Instana Observability 可帮助团队全面了解其 Kubernetes 环境,并在云计算日益普及的世界中交付稳健、高性能的应用程序。

作者

Chrystal R. China

Staff Writer, Automation & ITOps

IBM Think