介紹
警報和通知是部署工作流程中的重要部分。在使用 Kubernetes 集群時,通常需要立即收到關於集群中任何重大問題的通知。
Alertmanager 是安裝在您的集群中的 kube-prom-stack
的一部分,位於 Prometheus Stack 中。它允許您從各種來源(如 Prometheus)接收警報。在 Prometheus 端創建規則,這些規則可以觸發警報。Alertmanager 的責任是攔截這些警報,將它們分組(聚合),應用其他轉換,最後將它們路由到配置的接收器。如果需要,通知消息可以進一步格式化以包含其他詳細信息。您可以使用 Slack、Gmail 等來發送實時通知。
在本節中,您將學習如何檢查現有的警報,創建新的警報,然後使用與配置 Prometheus 相同的 清單文件 配置 Alertmanager 以通過 Slack 發送通知。
目錄
先決條件
完成本教程需要:
- 根據 Prometheus Stack中的說明,在您的集群中安裝 Prometheus 監控堆棧。
- 根據 Loki Stack中的說明,在您的集群中安裝 Loki 堆棧。
- Emojivoto 示例应用程式 已部署在集群中。请按照主存储库中的 步骤 进行操作。您将为此应用程式创建警报。
- 在 Slack 工作区拥有管理权限。随后,您将创建一个带有传入 Webhook 的应用程式,该 Webhook 将用于从 Alertmanager 发送通知。
步骤 1 – 检查包含的警报
kube-prom-stack
已经启用了一百多个规则。要访问 Prometheus 控制台,首先要将端口转发到本地计算机。
在 localhost:9091 上打开一个网络浏览器,并访问 警报 菜单项。您应该会看到一些预定义的警报,并且应该看起来像以下内容:
点击任何警报以展开它。您可以查看有关它查询的表达式、设置的标签和注释的信息,这在模板方面非常重要。Prometheus 支持在警报的注释和标签中使用模板。有关更多信息,请查看官方 文档。
步驟2 – 建立新的警報
要建立新的警報,您需要在kube-prom-stack
Helm 值文件的additionalPrometheusRule
部分中添加一個新的定義。
您將創建一個示例警報,如果emojivoto
命名空間的實例數量不符合預期,則將觸發該警報。對於emojivoto
應用程序,預期的 Pod 數量為 4。
首先,使用您選擇的文本編輯器(最好支持 YAML lint)打開提供的 Starter Kit 存儲庫中的04-setup-observability/assets/manifests/prom-stack-values.yaml
文件。然後,取消註釋additionalPrometheusRules
塊。
最後,應用設置使用helm
:
要檢查是否成功創建了警報,請導航到Prometheus 控制台,點擊Alerts菜單項,並識別EmojivotioInstanceDown
警報。它應該顯示在列表的底部。
步驟3 – 配置 Alertmanager 發送通知到 Slack
要完成此部分,您需要对 Slack 工作区拥有管理员权限。这将使您能够在接下来的步骤中创建所需的传入 Webhook。您还需要创建一个频道,您希望从 Alertmanager 接收通知。
您将配置 Alertmanager 跨越接收到的所有警报,将它们的各自摘要和描述打印在新行上。
- 打开一个网络浏览器,导航至
https://api.slack.com/apps
。点击创建新应用按钮。 - 在创建应用窗口中,选择从头开始选项。然后,为您的应用程序命名并选择适当的工作区。
- 从基本信息页面,点击传入 Webhooks选项,打开它,并点击页面底部的添加新 Webhook 到工作区按钮。
- 在下一页上,使用搜索频道…下拉列表选择要发送通知的所需频道。准备好后,点击允许按钮。
- 复制页面上显示的 Webhook URL 值。您将在下一节中需要它。
接下来,您将告诉 Alertmanager 如何发送 Slack 通知。使用您选择的任意文本编辑器打开提供的 Starter Kit 存储库中的04-setup-observability/assets/manifests/prom-stack-values-v35.5.1.yaml
文件。取消注释整个alertmanager.config
块。确保通过替换<>
占位符更新slack_api_url
和channel
值。
在上述配置中,
slack_api_url
:在第4步中创建的传入Slack webhook URLreceivers.[].slack_configs
:定义用于发送通知的Slack频道、通知标题和实际消息。还可以根据您的需求格式化通知消息(或正文)。title
和text
:迭代触发警报并使用Prometheus模板系统打印摘要和描述。send_resolved
:布尔值,指示Alertmanager在警报不再触发时是否发送通知。
目前matcher
和continue
参数仍然被注释掉,因为您将在指南的后续部分取消注释。目前,它应该保持注释状态。
最后,使用helm
升级kube-prometheus-stack
:
此时,您应该会收到所有触发警报的Slack通知。
接下来,您将测试之前添加的EmojivotoInstanceDown
警报是否有效,并通过将emojivoto
命名空间的/emoji
部署的副本数减少来向Slack发送通知。
从您的终端运行以下命令,将/emoji
部署的副本数减少至0:
在localhost:9091上打開網頁瀏覽器,訪問Alerts選單項目。搜索之前創建的EmojivotoInstanceDown警報。在大約一分鐘的部署縮減後,警報的狀態應該顯示Firing。
A message notification will be sent to Slack to the channel you configured earlier if everything goes well. You should see the “The Number of pods from the namespace emojivoto
is lower than the expected 4.” alert in the Slack message as configured in the annotations.description
config of the additionalPrometheusRulesMap
block.
目前,所有警報觸發都將發送到Slack頻道。這可能會導致通知過度疲勞。要深入了解發送的通知,您可以限制Alertmanager僅發送與某種模式匹配的警報通知。這是使用matcher
參數完成的。
使用您選擇的文本編輯器打開Starter Kit存儲庫中提供的04-setup-observability/assets/manifests/prom-stack-values-v35.5.1.yaml
文件。取消註釋整個alertmanager.config
區塊。確保取消註釋matcher
和continue
參數:
最後,使用helm
升級kube-prometheus-stack
:
現在,您應該只會收到與匹配的EmojivotoInstanceDown
警報名稱相關的警報。由於continue
設置為false,Alertmanager將僅發送來自此警報的通知並停止將它們發送給其他警報。
在 Slack 中點擊通知名稱將會在網頁瀏覽器中打開一個無法訪問的網頁,該網頁位於 Alertmanager pod 的內部 Kubernetes DNS。這是預期的行為。以下是一些你可以查看的有用鏈接: DNS pod 服務、AlertManager 的配置參數,以及一些通知示例。
步驟 4 – 處理觸發的警報
當警報觸發並在 Slack 中發送通知時,重要的是您可以輕鬆地進行故障排除並快速找到問題的根本原因。為了做到這一點,您可以利用已經安裝在Prometheus Stack和Loki Stack教程中的 Grafana。
為 Grafana 建立一個端口轉發,端口為3000
:
在localhost:3000上打開一個網頁瀏覽器,並使用默認凭證admin/prom-operator
登錄。
導航至警示部分。從狀態篩選器中,點擊觸發選項。擴展在創建新警示部分中定義的emojivoto-instance-down
警示。你應該會看到以下內容:
點擊查看圖表按鈕。從下一頁,你可以觀察到顯示為度量的emojivoto
命名空間中Pod的數量。請注意,Grafana默認使用最近1小時的時間範圍來過濾結果。將其調整為警示觸發的時間間隔。你可以使用從至選項進行時間範圍的調整,以獲得更精細的結果,或使用快速範圍,例如最近30分鐘
。
從探索選項卡中,選擇Loki數據源。在日誌瀏覽器中輸入以下內容:{namespace="emojivoto"}
,並點擊頁面右上方的運行查詢按鈕。你應該會看到以下內容:
確保你根據需要調整時間間隔。
從該頁面,你可以進一步過濾日誌結果。例如,要過濾emojivoto
命名空間中web-svc
容器的日誌,你可以輸入以下查詢:{namespace="emojivoto", container="web-svc"}
有關使用LogQL
的更多說明,請參閱步驟3 – 使用LogQL。
您还可以利用之前安装的导出的 Kubernetes 事件并筛选与emojivoto
命名空间相关的事件。
在日志浏览器中输入以下查询:{app="event-exporter"} |= "emojivoto"
。这将返回与emojivoto
命名空间相关的 Kubernetes 事件。
结论
在本教程中,您学习了如何检查现有警报、创建新警报,并配置AlertManager
以发送通知到 Slack。
了解更多
下一步是在您的 DOKS 集群中使用 Velero 或 TrilioVault 設置備份和還原。