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