使用ASM定義應用服務級SLO,可以自動產生Prometheus規則。本文介紹如何將產生的規則匯入Prometheus中執行SLO。
前提條件
-
已在ACK叢集安裝Prometheus監控。具體操作,請參見開源Prometheus監控和整合自建Prometheus實現網格監控。
步驟一:將規則匯入Prometheus
本文採用Prometheus Operator模式部署Prometheus。在此模式下,Prometheus的相關配置由Prometheus定義的相關自訂資源決定。配置Recording Rules和警示規則時,您可以建立Prometheus CR,建立一個具有app: ack-prometheus-operator和release: ack-prometheus-operator標籤的PrometheusRule對象。
-
標籤的添加取決於在Prometheus CR中標籤選取器
ruleSelector的設定。若ruleSelector為空白,可以不添加標籤。請您根據實際情況進行調整。 -
不同的Prometheus部署方式,需要採用不同的方法部署產生的Prometheus規則。關於匯入Prometheus規則的更多資訊,請參見Prometheus。
-
在Container ServiceACK中擷取
ruleSelector。登入Container Service管理主控台,在左側導覽列選擇叢集列表。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇。
-
在資源定義(CustomResourceDefinition)頁簽,單擊PrometheusRule。
-
在資來源物件瀏覽器頁簽,命名空間選擇monitoring,在ack-prometheus-operator-prometheus右側的操作列下,單擊YAML 編輯。
-
擷取
ruleSelector欄位資訊。ruleSelector欄位樣本如下。為了被標籤選取器選中,PrometheusRule中需要包含matchLabels中的標籤。ruleSelector: matchLabels: app: ack-prometheus-operator release: ack-prometheus-operator
-
部署Prometheus。
-
使用以下內容,建立prometheusrule.yaml。
YAML檔案中,
labels欄位的內容由上一步擷取,spec欄位的內容為產生的Prometheus規則。apiVersion: monitoring.coreos.com/v1 kind: PrometheusRule metadata: labels: app: ack-prometheus-operator release: ack-prometheus-operator name: asm-rules namespace: monitoring spec: # 此處替換為產生的規則檔案。 -
在ACK叢集中,執行以下命令,部署Prometheus。
kubectl apply -f prometheusrule.yaml
-
-
查看Prometheus是否配置成功。
登入Container Service管理主控台,在左側導覽列選擇叢集列表。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇。
-
在配置項頁面上方,選擇命名空間為monitoring,在Prometheus配置右側的操作列下,單擊YAML 編輯。
可以看到
PrometheusRule的對應Controller會自動將配置寫入ConfigMap中供Prometheus讀取。ConfigMap中已自動寫入PrometheusRule配置,其中monitoring-asm-rules-fcd9bea9-22b3-462b-8786-424f74f098ec.yaml為ASM規則檔案的鍵名:up{job= alertmanager main,namespace= monitoring } ) ) >= 0.5 for: 5m labels: severity: critical monitoring-asm-rules-fcd9bea9-22b3-462b-8786-424f74f098ec.yaml: | groups: - name: sloth-slo-sli-recordings-httpbin-asm-slo rules:
步驟二:執行SLO
查看Prometheus監控資料和警示資訊
-
使用kubectl串連至ACK叢集,在命令列執行以下命令,將ack-prometheus-operator-prometheus服務轉寄到本地連接埠。
kubectl --namespace monitoring port-forward svc/ack-prometheus-operator-prometheus 9090 -
單擊https://localhost:9090,訪問Prometheus控制台。
-
在Prometheus頁面的文字框中,輸入asm_slo_info,然後單擊Execute,查看配置的SLO。
可以看到SLO配置,表示Prometheus Recording Rules配置成功。
查詢返回結果為
asm_slo_info{asm_slo="asm-slo",slo_id="httpbin-asm-slo",slo_mode="cli-gen-prom",slo_objective="99.9",slo_service="httpbin",slo_spec="prometheus/v1",slo_version="dev"}。 -
在頁面上方,單擊Alerts,查看警示規則。
存在如下兩條規則,表示Prometheus Alerting Rules配置成功。兩條警示規則均名為 asm-alert,狀態顯示為 0 active(無活躍警示)。
情境一:類比正常請求
-
在命令列執行以下指令碼,類比99.5%成功率的情況下產生的指標。
指令碼中的
{網關IP}請替換為實際的網關IP。關於如何擷取網關IP,請參見查看網關資訊。#!/bin/bash for i in `seq 200` do if (( $i == 100 )) then curl -I http://{網關IP}/status/500; else curl -I http://{網關IP}/; fi echo "OK" sleep 0.01; done; -
返回Prometheus控制台的Prometheus頁面,在文字框中輸入slo:period_error_budget_remaining:ratio,然後單擊Execute,查看剩餘的錯誤預算的變化。
樣本效果如下:
執行查詢後,折線圖顯示剩餘錯誤預算比率從約 1.0 急劇下降至約 0.93,表明錯誤預算正在被快速消耗。
SLO的關鍵計量說明如下。更多資訊,請參見服務等級目標SLO概述。
指標
說明
slo:period_error_budget_remaining:ratio
SLO期間(30d)的剩餘錯誤預算。
slo:sli_error:ratio_rate30d
SLO期間(30d)內的平均錯誤率。
slo:period_burn_rate:ratio
SLO期間(30d)內的燃燒率。
slo:current_burn_rate:ratio
當前燃燒率。
情境二:類比異常請求
手動觸發故障,測試警示。
-
在命令列執行以下指令碼,類比請求出錯時,50%成功率(燃燒率為50)的情況下產生的指標。
指令碼中的
{網關IP}請替換為實際的網關IP。#!/bin/bash for i in `seq 200` do curl -I http://{網關IP}/ curl -I http://{網關IP}/status/500; echo "OK" sleep 0.01; done; -
返回Prometheus控制台的Alerts頁面,查看警示。
警示觸發後的樣本效果如下:
在 Alerts 頁面,規則檔案路徑
monitoring-asm-rules.yaml下的sloth-slo-alerts-httpbin-asm-slo2規則群組中,兩條 asm-alert 警示規則均顯示為活躍狀態(1 active):-
第一條規則:
sloth_severity=page,sloth_window=30m,標籤包含alertlabel="bbb"、pagelabels="ddd"、sloth_id="httpbin-asm-slo2"。 -
第二條規則:
sloth_severity=ticket,sloth_window=2h,標籤包含ticketlabel="eee"。
-
在AlertManager控制台查看警示
在Prometheus架構中,由AlertManager組件負責收集Prometheus Server產生的警示資訊,並根據您的配置發送給各個接收者。
-
執行以下命令,將ack-prometheus-operator-alertmanager服務轉寄到本地連接埠。
kubectl --namespace monitoring port-forward svc/ack-prometheus-operator-alertmanager 9093 -
單擊https://localhost:9093,訪問AlertManager控制台。
-
在Alertmanager頁面,單擊
表徵圖,查看警示。可以看到自訂警示資訊採集成功。
Alertmanager 警示列表中展示了兩條 asm-alert 類型的自訂警示:一條
slo_severity=page(slo_window=30m),另一條slo_severity=ticket(slo_window=2h),表明 ASM SLO 警示規則已成功觸發。