當(dāng) Pod 崩潰后如何在報(bào)警信息中獲取對(duì)應(yīng)的日志信息?
Robusta 是一個(gè) Python 開發(fā)的用于 Kubernetes 故障排除的開源平臺(tái)。它位于你的監(jiān)控堆棧(Prometheus、Elasticsearch 等)之上,并告訴你警報(bào)發(fā)生的原因以及如何修復(fù)它們。?
Robusta 包含三個(gè)主要部分,全部開源:
- 用于 Kubernetes 的自動(dòng)化引擎
- 內(nèi)置自動(dòng)化以豐富和修復(fù)常見警報(bào)
- 其他一些手動(dòng)故障排除工具
還有一些其他額外的可選組件:
- 包含 Robusta、Prometheus Operator 和默認(rèn) Kubernetes 警報(bào)的工具包
- 用于查看集群中所有警報(bào)、變更和事件的 Web UI。
Robusta 會(huì)自動(dòng)執(zhí)行部署應(yīng)用程序后發(fā)生的所有事情。它有點(diǎn)像用于 DevOps 的 Zapier/IFTTT,強(qiáng)調(diào)的是預(yù)置的自動(dòng)化,而不僅僅是“構(gòu)建你自己的”。例如,當(dāng) Pod 崩潰的警報(bào)觸發(fā)時(shí),下面的自動(dòng)化程序也會(huì)將日志發(fā)送到 Slack:
每個(gè)自動(dòng)化程序都包含3個(gè)部分:
- Triggers:何時(shí)運(yùn)行(基于警報(bào)、日志、變更等)
- Actions:要做什么操作(超過(guò)50個(gè)內(nèi)置操作)
- Sinks:將結(jié)果發(fā)送到何處(Slack等)
架構(gòu)
Robusta 可以通過(guò) Helm 進(jìn)行安裝和管理。
自動(dòng)化引擎
Robusta 的主要組件是自動(dòng)化引擎,它作為兩個(gè) Kubernetes Deployments 在集群內(nèi)運(yùn)行。
- robusta-forwarder:連接到 APIServer 并監(jiān)控 Kubernetes 的變化,將它們轉(zhuǎn)發(fā)給 robusta-runner。
- robusta-runner:執(zhí)行 playbooks。
打包的 Prometheus 堆棧(可選)
Robusta 包括一個(gè)可選的嵌入式 Prometheus 堆棧,根據(jù)最佳實(shí)踐預(yù)先配置了 Kubernetes 警報(bào)。如果已經(jīng)在使用 kube-prometheus-stack,則可以將其指向 Robusta。
Web UI(可選)
有一個(gè) Web UI,它提供一個(gè)單一的管理面板來(lái)監(jiān)控跨多個(gè)集群的所有警報(bào)和 pod。
CLI(可選)
robusta 的命令行工具有兩個(gè)主要用途:
- 通過(guò)自動(dòng)生成 Helm values 使安裝 Robusta 變得更容易。
- 手動(dòng)觸發(fā) Robusta 故障排除工作流程(例如從任何 Java pod 獲取 heap dump)。
它還具有開發(fā) Robusta 本身有用的一些功能。
使用場(chǎng)景
Robusta 默認(rèn)情況下會(huì)監(jiān)控下面這些報(bào)警和錯(cuò)誤,并會(huì)提供一些修復(fù)建議。
Prometheus Alerts
- CPUThrottlingHigh - 顯示原因和解決方法。
- HostOomKillDetected - 顯示哪些 Pods 被 killed 掉了。
- KubeNodeNotReady - 顯示節(jié)點(diǎn)資源和受影響的 Pods。
- HostHighCpuLoad - 顯示CPU使用情況分析。
- KubernetesDaemonsetMisscheduled - 標(biāo)記已知錯(cuò)誤并建議修復(fù)。
- KubernetesDeploymentReplicasMismatch - 顯示 deployment 的狀態(tài)。
- NodeFilesystemSpaceFillingUp - 顯示磁盤使用情況。
其他錯(cuò)誤
這些是通過(guò)監(jiān)聽 APIServer 來(lái)識(shí)別的:
- CrashLoopBackOff
- ImagePullBackOff
- Node NotReady
此外,WARNING 級(jí)別及以上的所有 Kubernetes 事件(kubectl get events)都會(huì)發(fā)送到 Robusta UI。
變更追蹤
默認(rèn)情況下,對(duì) Deployments、DaemonSets 和 StatefulSets 的所有變更都會(huì)發(fā)送到 Robusta UI,以便與 Prometheus 警報(bào)和其他錯(cuò)誤相關(guān)聯(lián)。默認(rèn)情況下,這些更改不會(huì)發(fā)送到其他接收器(例如 Slack),因?yàn)樗鼈兪抢]件。
安裝
要在你的 K8s 集群中配置 Robusta,首先我們需要安裝 Robusta,并連接至少一個(gè)目的地(“接收器”)和至少一個(gè)源(“觸發(fā)器”)。
為了配置 robusta,我們需要安裝 Robusta CLI 工具,直接使用下面的命令即可安裝:
然后就可以生成 Robusta 配置文件,這會(huì)配置安裝 Slack 或其他集成工具,也非常推薦開啟 cloud UI 工具:
上面的命令默認(rèn)情況下會(huì)讓我們配置 Slack,所以需要提前做好配置,提供一個(gè) channel 用于接收相關(guān)信息,最后會(huì)生成一個(gè)名為 generated_values.yaml 的 Helm values 文件,如果在你的 Slack 頻道中收到了如下所示的信息則證明配置是正確的:
然后我們就可以使用 Helm 進(jìn)行安裝了,首先添加 Helm Chart Repo:
然后可以使用下面的命令進(jìn)行安裝:
如果你使用的是 KinD 測(cè)試集群,則可以提供一個(gè) isSmallCluster=tru 的參數(shù),這樣可以減少相關(guān)資源:
比如我這里是 KinD 的測(cè)試集群,安裝完成后會(huì)有如下所示的 Pod 列表:
如果安裝的時(shí)候啟用了 Robusta 的 UI 功能,則可以在 Web UI 中看到當(dāng)前集群的相關(guān)監(jiān)控?cái)?shù)據(jù)。
測(cè)試
默認(rèn)情況下,Robusta 會(huì)在 Kubernetes pod 崩潰時(shí)發(fā)送通知,這里我們創(chuàng)建一個(gè) crashing 的 pod 來(lái)進(jìn)行測(cè)試,該測(cè)試應(yīng)用的資源清單如下所示:
直接應(yīng)用該清單即可(或者執(zhí)行 robusta demo 命令也可以),正常啟動(dòng)后很快該 pod 就會(huì)崩潰:
一旦 pod 達(dá)到兩次重啟后,Slack 頻道就可以接收到有關(guān)崩潰 pod 的消息。
而且還可以看到完整的 pod 崩潰日志,這個(gè)對(duì)于監(jiān)控報(bào)警是非常有意義的。同樣如果開啟了 Robusta UI,在 Web UI 頁(yè)面中也可以看到類似的消息。
自動(dòng)化基礎(chǔ)
為了演示 Robusta 自動(dòng)化是如何工作的,我們將配置一個(gè)在 Deployment 發(fā)生變化時(shí)發(fā)送 Slack 消息的自動(dòng)化。
首先添加下面內(nèi)容到 generated_values.yaml 文件中:
然后更新 Robusta:
更新后我們來(lái)更改一個(gè) Deployment 的副本數(shù):
正常然后 Slack 的頻道就會(huì)收到對(duì)應(yīng)的一條如下所示消息通知了:
如果啟用了 Robusta UI,所有的報(bào)警和變更也都會(huì)出現(xiàn)在 timeline 下面:
我們也可以點(diǎn)擊查看變更的內(nèi)容:
當(dāng)然我們還可以利用 Robusta 來(lái)做很多事情,可以自己來(lái)實(shí)現(xiàn) playbook 操作,關(guān)于 Robusta 的更多高級(jí)使用可以參考官方文檔 https://docs.robusta.dev 了解更多信息。