K8s 之Prometheus 故障排查
导语:本文主要探讨 Prometheus 在观测 Kubernetes 方面的独特优势和最佳实践,包括如何在 Kubernetes 不同层次和维度上实现全面的可观测性,如何排查最常见的 Kubernetes 故障,以及维护集群稳定高效运行的最佳实践。
强大的工具,往往伴随着巨大的复杂性。与 Kubernetes 的分布式、动态性等硬核实力相伴而来的,是如何对其进行监控的挑战:
-
集群是否潜藏着性能瓶颈?
-
各项资源分配是否合理?
-
如何捕获影响稳定性的事件?
这些问题,不仅关乎系统的稳定性、高效性,还将直接影响业务质量和用户体验。
而 Prometheus 作为紧随 Kubernetes 之后的、CNCF 的“第二把交椅”,则凭借其与 Kubernetes 相伴而生、天然适配的独特优势,已然成为监控 Kubernetes 的首。
接下来,围绕 Kubernetes 监控,本文将试着回答下列问题:
-
为何 Prometheus 是监控 Kubernetes 的“官配”?
-
“若覆盖不全面,则监控无意义”——此话怎讲?
-
Kubernetes 常见故障和最佳实践,展开说说?
-
既然有开源 Prometheus,又何需腾讯云 Prometheus?
Prometheus 的优势
对比其他监控方案,Prometheus 针对 Kubernetes 监控,具有不可替代的优势:
1.Prometheus 和 Kubernetes 彼此原生支持。
-
Prometheus 对 Kubernetes 的原生支持:Prometheus 可对 Kubernetes 中的目标进行动态发现,大幅简化了监控配置。
-
Kubernetes 对 Prometheus 的原生支持:Kubernetes 各组件内置 Prometheus 指标暴露,无需引入额外的导出工具。
2.Prometheus 针对云原生环境的独特设计。
-
针对架构复杂性:传统架构中只有主机和应用两个层面要监控;而 Kubernetes 不仅在两者之间引入了新的抽象层,并且这层 Kubernetes 自身组件也需要被监控。Prometheus 社区的活跃生态(多种 exporter、后端存储、语言 SDK),则能很好地承托 Kubernetes 的全面监控。
-
针对资源动态性:相比传统监控中的静态主机,Kubernetes 上的 pod 可能频繁被创建和销毁,传统的 Zabbix 等基础设施监控手段显然力不从心。而 Prometheus 可基于服务发现做指标拉取,自动更新监控目标,确保监控数据的实时性和准确性;此外,对于动态环境下的短生命周期任务,Prometheus 除了支持指标拉取,还支持各监控目标向 Prometheus 做指标推送。
-
针对指标高基数:云原生环境下大都是微服务架构,服务不仅数量多、维度也多,导致承载元数据的标签呈爆炸趋势。而 Prometheus 具备灵活标签的数据模型设计,则提供了很好的分类结构和检索方法,这样,对指标数据的组织将更加灵活、多维、适应变化、方便聚合:
-
针对查询精细化:强大的查询语言 PromQL,使用户能通过简洁的表达式,高效地检索和处理时间序列数据。PromQL 支持多种数学运算、聚合操作、趋势预测;还可用于绘制精细的可视化图表、管理精细的告警逻辑。
K8s 全栈监控
若覆盖不全面,则监控无意义。
乍一看,Kubernetes 指标似乎没啥特别,仍然跟其他系统类似,包括吞吐率、错误率、延迟和资源饱和度等。
然而,Kubernetes 监控的棘手之处在于:Kubernetes 不是“一个东西”,而是一个由控制平面、节点、Pod、键值存储等多个组件组成的系统。
所以针对 Kubernetes,若缺乏全栈视角和数据关联,又怎能实现故障的快速定位和根因分析呢?
例如:当一个容器 CrashLoopBackoff,它的可能原因有很多、影响范围也不同(如下图所示)。其中,若是底层的宿主机导致,则其影响范围可能不仅限于该特定容器,同宿主机上的其他 Pod 和容器也会受到影响,可能出现性能下降等问题。
为了全面打造 Kubernetes 的指标监控体系,自下而上,我们可以将 Kubernetes 从底层资源到顶层应用,分为 5 个不同的层面,用不同的方法和组件分别采集。接下来,我们将逐层击破,探讨每层监控对象的侧重点、所使用的监控手段、需关注的核心指标,以及如何通过构建可观测性,来保障系统的稳定运行。
宿主机层
宿主机是指用于运行 Kubernetes 节点的底层机器(物理机或 VM)。对其进行监控的核心,在于系统级别的性能指标,包括 CPU 使用率、内存使用情况、磁盘 I/O、网络流量和文件系统使用情况。
对于宿主机指标的导出和暴露,我们可借助 Prometheus 社区提供的开源 exporter 工具来实现,例如:
-
node-exporter
(监控 *NIX 系统) -
windows_exporter
(监控 Windows 系统) -
dcgm-exporter
(监控 GPU) -
process-exporter
(监控进程)
以 node-exporter
为例,它是以二进制的形式被提供的,下载、安装、运行后,即可在其下述端点观察到暴露的指标:curl http://<宿主机IP>:9100/metrics
。在 Prometheus 将其配置为采集目标后,宿主机指标即可以一定时间间隔,被 Prometheus 定期采集。
在机器资源层面,毫无疑问,我们最关心的指标肯定是:CPU 和内存的利用率、网络出入带宽,等等。
使用 Grafana 可视化 node-exporter
指标,便可以直观展示指标数据、实时监控系统状态。以 Prometheus 为 node-exporter
预设的 Grafana 大盘为例:
而通过 Prometheus 的 AlertManager 组件,基于核心指标配置告警,则可以及时通知运维人员系统异常,确保快速响应和问题解决。
以腾讯云 Prometheus 为 node-exporter
预设的一条 alert 为例:我们可以用 PromQL语句(1-node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) > 0.85
,表达当内存使用率超过 85% 时,发送告警消息。