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