Hello folks,我是 Luga,今天我们来分享一款用于 Kubernetes Cluster 故障排查的开源工具 – Robusta (罗布斯塔)。作为一个用于多集群 Kubernetes 监控、故障排除和自动化的开源平台,就像 Docker 用于部署应用程序的基础设施即代码一样,Robusta 用于维护 Kubernetes Cluster 应用程序和处理其警报的基础设施即代码。
— 01 —
Robusta 概述
作为一款用于 Kubernetes Cluster 故障排查的开源平台,其本质是为了弄清楚我们当前所构建的 Kubernetes Cluster 的健康状况,并针对所出现的告警行为进行合理解释以及给予我们相关修复建议。
与大多数其他云应用程序一样,Robusta 能够基于 Helm 安装和管理,其主要位于监控堆栈(Prometheus、Elasticsearch 等)之上。
从技术生态角度来看,Robusta 既是一款 Kubernetes 的自动化引擎,也是一个多集群可观测性开源平台。Robusta 通常与 Prometheus 一起协作使用,当然,也支持其他工具集成。
基于其相关特性,通过监听 Kubernetes Cluster 中的相关事件,Robusta 可以告诉我们为什么发出警报、同时发生了什么以及我们能够所采取的措施。除此之外,Robusta 也能够改进我们现有的告警体系,或用于定义由 APIServer 更改触发的新告警流程,以革新现有落后的观测生态。
— 02 —
Robusta 功能特性
Kubernetes 自动化引擎
即当我们所构建的 Kubernetes Cluster 中发生任何意外事件时所采取的自动操作。自动修复问题或收集有关问题的证据并在后续的时间进行调查、分析。
1、自动修复
当然,除了个别比较棘手的问题外,大多数常见的问题基本上都有已知的解决方法,基于 Robusta ,我们可以轻松地自动修复已知问题。例如,在 YAML 中配置修复操作或在 Python 中编写我们自定义的操作以实现完全可定制性。
2、告警丰富
Robusta 获取所配置现有的告警规则,然后并自动提取有关受影响的 Kubernetes 资源的详细信息。
例如,当某一 Kubernetes Cluster Node 的磁盘空间不足时,Robusta 会显示历史图表。当 Pod 崩溃时,Robusta 便会获取相关日志进行后续的调查、分析。
Cluster 观测性
此平台能够基于 Kubernetes Cluster 的一体式、全方位进行观测,涉及告警仪表盘、不健康的资源、日志以及相关图标等。
1、资源展示
Robusta 能够映射我们所构建的的 Kubernetes Cluster 拓扑并构建正在运行的应用程序列表以及识别每个人的健康问题并显示细节。除此之外,基于当前的运行状况,能够实时查看正在运行的 Pod、CPU 使用率、内存使用率以及有关工作负载的其他关键信息。
Robusta 记录了 Kubernetes Cluster 中发生的所有 Kubernetes 变更,能够准确查看 YAML 更改的内容以及它是否导致了问题等。
2、Kubernetes 原生追踪
通常情况下,Robusta 将 Kubernetes UI 与警报和可观察性平台相结合,告警会自动映射到正确的 Kubernetes 资源,然后按命名空间或集群进行过滤告警信息。除此之外,要真正了解问题,我们往往需要有关各个 Pod 的详细日志和事件信息。然而,基于 Robusta,使得我们无需在生产环境中运行 Kubectl 命令或在窗口之间跳转,而直接在 Robusta 中搞定所有的一切,比如,按需获取日志、显示图形并跟踪 Pod 的状态等。
路由通知
基于相关规则,基于 Robusta 统一通知服务,我们能够可以获取有关警报、失败的作业、应用程序更新以及我们所选择的任何其他内容的通知。
1、事件通知
Robusta 能够更轻松地获得有关失败作业、CrashLoopBackOffs 或重要 Kubernetes 对象的意外更改的通知。
Robusta 支持向 Slack、MS Teams、Discord、PagerDuty、OpsGenie、WebEx 等发送消息。除此之外,Robusta 也能够从各种传入目的地接收数据,包括 Prometheus 和 Elasticsearch。
2、告警通知
当我们将 Prometheus 警报直接发送到 Slack 时,这些警报通常缺乏上下文。而基于 Robusta 路由告警,我们可以将告警连接到相关日志和图表予以展现。
内置告警
基于 Prometheus 生态技术体系,Robusta 采用了最流行的方式来监控 Kubernetes Cluster 并使其变得更好。同时,告警也增加了可观察性。以下为常用的场景,具体如下:
1、Pod 崩溃
2、系统磁盘空间不足
3、OOMKill
4、请求超时
5、其他事件场景
示例:内存溢出场景
当然,除了上述核心的特性外,Robusta 也包含 Timeline (时间轴)功能,基于时间轴,我们可以查看所有 Prometheus 警报的历史记录,以及与 Kubernetes Cluster 中的配置更改相关的记录等。
— 03 —
Robusta 工作原理
上面我们简单介绍了 Robusta 的功能特性,接下来,我们来看一下其实现原理。
基于 Robusta 的相关特性,其自动化实现(采用 YAML 配置,强调预构建的自动化)主要包含如下三个部分:
1、Trigger
即“何时运行?”,通常主要针对告警、日志以及事件更新等。Trigger 触发器是启动自动化的条件。例如,失败的 Kubernetes 作业等。
2、Action – 动作
即“做什么?”,Action 动作是我们在自动化运行时执行的一系列相关操作等。例如,获取日志或收集 Java 堆转储。
3、Sink – 接收器
即“最终归宿?”Sink 接收器是发送任何输出的地方。例如,Slack 渠道等。
如下为 Robusta 具体工作原理结构:
例如,针对 Pod 崩溃时的(即 “RobustaCrashingPods” )的行为规则定义如下所示:
triggers:
- on_prometheus_alert:
alert_name: KubePodCrashLooping
actions:
- logs_enricher: {}
sinks:
- kafka
假设,基于某种特定的原因,当我们所构建的 Kubernetes Cluster 中的某一个Pod 发生崩溃时,此时,依据所定义的告警规则进行告警触发时,Robusta 都会从正确的 Pod 中获取日志并将它们附加到告警中,并将会自动化把日志发送到 Kafka 中。
— 04 —
Robusta 参考架构
基于上述参考架构,我们可以看到,整个 Robusta 架构的核心围绕“自动化引擎”进行开展,具体涉及如下组件:
1、Robusta-Forwarder
此组件主要连接到 APIServer 并监控 K8s Cluster 的变化,并将它们转发给 Robusta-Runner 进行处理。
2、Robusta-Runner
此组件主要执行自定义的 Playbooks,依据相关的业务规则。
3、Bundled Prometheus Stack
此组件为可选项,Robusta 包括一个可选的嵌入式 Prometheus 堆栈,根据最佳实践预先配置了 Kubernetes 告警。如果我们在实际的场景中已经在使用了 Kube-Prometheus-Stack,那么,则可以将其指向 Robusta。
4、Web UI
此组件为可选项,我们可以依据实际的情况,进行 Web UI 配置,基于此,能够为我们提供一个单一的管理面板来观测跨多个 K8s Cluster 的所有警报和 Pod 状态追踪。
5、CLI
此组件为可选项,Robusta Cli 通常具备两个主要用途,具体如下所示:
(1)基于自动生成的 Helm 值使的 Robusta 安装变得更容易,便捷,有利于维护,节省资源成本;
(2)可以手动触发 Robusta 故障排除工作流程(例如,我们可以从任何 Java Pod 应用来获取相关堆转储信息,以供排障、分析之用)。
— 05 —
Robusta 安装部署
其实,从本质上来讲,Robusta 的部署安装与其他应用程序一样, 安装较为简单,官方给出了多种部署方式,这里,我们基于 Helm 进行安装,具体步骤如下所示。
1、安装 Robusta Cli 插件
[leonli@Leon robusta ] % python3 -m pip install -U robusta-cli --no-cache
Defaulting to user installation because normal site-packages is not writeable
Collecting robusta-cli
Downloading robusta_cli-0.10.11-py3-none-any.whl (230 kB)
|████████████████████████████████| 230 kB 4.6 kB/s
Collecting hikaru<0.6.0,>=0.5.1-beta.0
Downloading hikaru-0.5.1b0-py3-none-any.whl (1.2 MB)
|████████████████████████████████| 1.2 MB 25 kB/s
Collecting colorlog<6.0.0,>=5.0.1
Downloading colorlog-5.0.1-py2.py3-none-any.whl (10 kB)
Collecting toml<0.11.0,>=0.10.2
Downloading toml-0.10.2-py2.py3-none-any.whl (16 kB)
Collecting opsgenie-sdk<3.0.0,>=2.1.5
Downloading opsgenie_sdk-2.1.5-py3-none-any.whl (247 kB)
|████████████████████████████████| 247 kB 19 kB/s
Collecting prometheus-client<0.13.0,>=0.12.0
Downloading prometheus_client-0.12.0-py2.py3-none-any.whl (57 kB)
...
Collecting robusta-cli
Downloading robusta_cli-0.8.31-py3-none-any.whl (143 kB)
|████████████████████████████████| 143 kB 25 kB/s
Downloading robusta_cli-0.8.30-py3-none-any.whl (143 kB)
...
2、生成 Robusta 配置文件
[leonli@Leon robusta ] % robusta gen-config
Robusta reports its findings to external destinations (we call them "sinks").
We'll define some of them now.
Configure Slack integration? This is HIGHLY recommended. [Y/n]: Y
If your browser does not automatically launch, open the below url:
https://api.robusta.dev/integrations/slack?id=xxxx
You've just connected Robusta to the Slack of: devopscluster
...
3、安装 Robusta
[leonli@Leon robusta ] % helm install robusta robusta/robusta -f ./generated_values.yaml \
--set clusterName=devops-cluster
4、查看 Robusta 资源
[leonli@Leon robusta ] % kubectl get pods -A | grep robusta
至此,Robusta 组件安装完成,我们可以通过其 GUI 查看所构建的相关资源信息。
综上所述,Robusta 作为一个自动化引擎,能够侦听不同的数据源,例如 Kubernetes Cluster 中的变化、Prometheus 警报等。基于这些数据源,Robusta 可以借助自动化方式来帮助解决集群中的相关问题。
同时,Robusta 还监控 API Server 并发送警报以涵盖我们所构建的 Kubernetes Cluste 可能遇到的任何类型的问题。
此外,Robusta 能够在 Kubernetes Cluste 中为我们提供主动运行程序的操作,帮助自动执行及手动修复这些问题,从而为我们构建一个系统以自动化方式补救所遇到的相关问题,以使得我们能够提前知晓问题的风险以及针对所发生的问题进行有的放矢地处理。
Ref:
有关更多的 Robusta 信息,大家可以访问 https://home.robusta.dev/
Adiós !
··································
Hello folks,我是 Luga,一个 10 年+ 技术老司机,从 IT 屌丝折腾到码畜,最后到“酱油“架构师。如果你喜欢技术,不喜欢呻吟,那么恭喜你,来对地方了,关注我,共同学习、进步、超越~
您的每一个点赞、在看及分享,我都认真当成了喜欢 ~