Robusta 是一个 Python 开发的用于 Kubernetes 毛病排除的开源平台。它位于你的监控仓库(PRometheus、Elasticsearch 等)之上,并告诉你警报发作的原因以及若何修复它们。

Robusta 包罗三个次要部门,全数开源:

用于 Kubernetes 的主动化引擎内置主动化以丰硕和修复常见警报其他一些手动毛病排除东西

还有一些其他额外的可选组件:

包罗 Robusta、Prometheus OPErator 和默认 Kubernetes 警报的东西包用于查看集群中所有警报、变动和事务的 Web UI。

Robusta 会主动施行摆设应用法式后发作的所有工作。它有点像用于 DevOps 的 Zapier/IFTTT,强调的是预置的主动化,而不单单是“构建你本身的”。例如,当 Pod 瓦解的警报触发时,下面的主动化法式也会将日记发送到 Slack:

triggers: - on_prometheus_alert: alert_name: KubePoDCrashLoopingactions: - logs_enricher: {}sinks: - slack

每个主动化法式都包罗3个部门:

Triggers:何时运行(基于警报、日记、变动等)Actions:要做什么操做(超越50个内置操做)Sinks:将成果发送到何处(Slack等)当 K8s Pod 崩溃后如何在报警信息中获取对应的日志信息?  第1张

架构

Robusta 能够通过 Helm 停止安拆和办理。

主动化引擎

Robusta 的次要组件是主动化引擎,它做为两个 Kubernetes Deployments 在集群内运行。

robusta-forwarder:毗连到 APIServer 并监控 Kubernetes 的变革,将它们转发给 robusta-runner。robusta-runner:施行 playbooks。当 K8s Pod 崩溃后如何在报警信息中获取对应的日志信息?  第2张

打包的 Prometheus 仓库(可选)

Robusta 包罗一个可选的嵌入式 Prometheus 仓库,按照更佳理论预先设置装备摆设了 Kubernetes 警报。若是已经在利用 kube-prometheus-stack,则能够将其指向 Robusta。

Web UI(可选)

有一个 Web UI,它供给一个单一的办理面板来监控跨多个集群的所有警报和 pod。

CLI(可选)

robusta 的号令行东西有两个次要用处:

通过主动生成 Helm values 使安拆 Robusta 变得更容易手动触发 Robusta 毛病排除工做流程(例如从任何 Java pod 获取 heap dump)

它还具有开发 Robusta 自己有用的一些功用。

利用场景

Robusta 默认情况下会监控下面那些报警和错误,并会供给一些修复建议。

Prometheus Alerts

CPUThrottlingHigh - 显示原因息争决办法HostOomKillDetected - 显示哪些 Pods 被 killed 掉了KubeNodeNotReady - 显示节点资本和受影响的 PodsHostHighCpuLoad - 显示CPU利用情况阐发KubernetesDaemonsetMisscheduled - 标识表记标帜已知错误并建议修复KubernetesDeploymentReplicasMismatch - 显示 deployment 的形态NodeFilesystemSpaceFillingUp - 显示磁盘利用情况

其他错误

那些是通过监听 APIServer 来识此外:

CrashLoopBackOffImagePullBackOffNode NotReady

此外,WARNING 级别及以上的所有 Kubernetes 事务(kubectl get events)城市发送到 Robusta UI。

变动逃踪

默认情况下,对 Deployments、DaemonSets 和 StatefulSets 的所有变动城市发送到 Robusta UI,以便与 Prometheus 警报和其他错误相联系关系。默认情况下,那些更改不会发送到其他领受器(例如 Slack),因为它们是垃圾邮件。

安拆

要在你的 K8s 集群中设置装备摆设 Robusta,起首我们需要安拆 Robusta,并毗连至少一个目标地(“领受器”)和至少一个源(“触发器”)。

为了设置装备摆设 robusta,我们需要安拆 Robusta CLI 东西,间接利用下面的号令即可安拆:

# 需要 Python3.7 或以上版本pip install -U robusta-cli --no-cache

然后就能够生成 Robusta 设置装备摆设文件,那会设置装备摆设安拆 Slack 或其他集成东西,也十分保举开启 cloud UI 东西:

robusta gen-config

上面的号令默认情况下会让我们设置装备摆设 Slack,所以需要提早做好设置装备摆设,供给一个 channel 用于领受相关信息,最初会生成一个名为 generated_values.yaml 的 Helm values 文件,若是在你的 Slack 频道中收到了如下所示的信息则证明设置装备摆设是准确的:

当 K8s Pod 崩溃后如何在报警信息中获取对应的日志信息?  第3张

然后我们就能够利用 Helm 停止安拆了,起首添加 Helm Chart Repo:

helm repo add robusta https://robusta-charts.storage.googleapis.com && helm repo update

然后能够利用下面的号令停止安拆:

helm install robusta robusta/robusta -f ./generated_values.yaml \ --set clusterName=<YOUR_CLUSTER_NAME>

若是你利用的是 KinD 测试集群,则能够供给一个 isSmallCluster=tru 的参数,如许能够削减相关资本:

helm install robusta robusta/robusta -f ./generated_values.yaml \ --set clusterName=<YOUR_CLUSTER_NAME> \ --set isSmallCluster=true

好比我那里是 KinD 的测试集群,安拆完成后会有如下所示的 Pod 列表:

$ kubectl get podsNAME READY STATUS RESTARTS AGEalertmanager-robusta-kube-prometheus-st-alertmanager-0 2/2 Running 3 (30m ago) 3h25mprometheus-robusta-kube-prometheus-st-prometheus-0 2/2 Running 2 (34m ago) 4h21mrobusta-forwarder-579fb4b548-7x电话8 1/1 Running 1 (30m ago) 4h23mrobusta-grafana-797c64d5b4-2dbhl 3/3 Running 3 (30m ago) 4h23mrobusta-kube-prometheus-st-operator-7c5db9ccb9-gczlp 1/1 Running 1 (30m ago) 4h23mrobusta-kube-state-metrics-649fd7db9f-6sd8p 1/1 Running 1 (34m ago) 4h23mrobusta-prometheus-node-exporter-5426b 1/1 Running 1 (30m ago) 4h23mrobusta-prometheus-node-exporter-hx6r4 1/1 Running 1 (30m ago) 4h23mrobusta-prometheus-node-exporter-np4jj 1/1 Running 1 (30m ago) 4h23mrobusta-runner-9f4f56c8b-49s7p 1/1 Running 1 (30m ago) 3h48m

若是安拆的时候启用了 Robusta 的 UI 功用,则能够在 Web UI 中看到当前集群的相关监控数据。

当 K8s Pod 崩溃后如何在报警信息中获取对应的日志信息?  第4张

测试

默认情况下,Robusta 会在 Kubernetes pod 瓦解时发送通知,那里我们创建一个 crashing 的 pod 来停止测试,该测试应用的资本清单如下所示:

apiVersion: apps/v1kind: Deploymentmetadata: name: crashpodspec: selector: matchLabels: app: crashpod template: metadata: labels: app: crashpod spec: containers: - image: busybox command: ["sh"] args: - "-c" - "wget -O - https://gist.githubusercontent.com/odyssomay/1078370/raw/35c5981f8c139bc9dc02186f187ebee61f5b9eb9/gistfile1.txt 2>/dev/null; exit 125;" imagePullPolicy: IfNotPresent name: crashpod restartPolicy: Always

间接应用该清单即可(或者施行 robusta demo 号令也能够),一般启动后很快该 pod 就会瓦解:

$ kubectl get pods -ANAME READY STATUS RESTARTS AGEcrashpod-64d8fbfd-s2dvn 0/1 CrashLoopBackOff 1 7s

一旦 pod 到达两次重启后,Slack 频道就能够领受到有关瓦解 pod 的动静。

当 K8s Pod 崩溃后如何在报警信息中获取对应的日志信息?  第5张

并且还能够看到完好的 pod 瓦解日记,那个关于监控报警长短常有意义的。同样若是开启了 Robusta UI,在 Web UI 页面中也能够看到类似的动静。

当 K8s Pod 崩溃后如何在报警信息中获取对应的日志信息?  第6张

主动化根底

为了演示 Robusta 主动化是若何工做的,我们将设置装备摆设一个在 Deployment 发作变革时发送 Slack 动静的主动化。

起首添加下面内容到 generated_values.yaml 文件中:

customPlaybooks:- triggers: - on_deployment_update: {} actions: - resource_babysitter: omitted_fields: [] fields_to_monitor: ["spec.replicas"]

然后更新 Robusta:

helm upgrade robusta robusta/robusta --values=generated_values.yaml

更新后我们来更改一个 Deployment 的副本数:

kubectl scale --replicas NEW_REPLICAS_COUNT deployments/DEPLOYMENT_NAME

一般然后 Slack 的频道就会收到对应的一条如下所示动静通知了:

当 K8s Pod 崩溃后如何在报警信息中获取对应的日志信息?  第7张

若是启用了 Robusta UI,所有的报警和变动也城市呈现在 timeline 下面:

当 K8s Pod 崩溃后如何在报警信息中获取对应的日志信息?  第8张

我们也能够点击查看变动的内容:

当 K8s Pod 崩溃后如何在报警信息中获取对应的日志信息?  第9张

当然我们还能够操纵 Robusta 来做良多工作,能够本身来实现 playbook 操做,关于 Robusta 的更多高级利用能够参考官方文档 https://docs.robusta.dev 领会更多信息。