受管理的規則評估和警示

Google Cloud Managed Service for Prometheus 支援 Prometheus 相容的規則評估和快訊功能。本文說明如何設定受管理的規則評估作業。

規則評估

Managed Service for Prometheus 提供規則評估器元件,可讓您在全球 Prometheus 後端的情況下安全地編寫規則,避免干擾大型機構中其他使用者的資料。在 Kubernetes 叢集中執行時,系統會自動將元件部署為管理集合的一部分。

您可以針對 Managed Service for Prometheus 指標和 Cloud Monitoring 指標編寫規則和快訊。為 Cloud Monitoring 指標編寫規則時,您必須使用 GlobalRules 資源

規則

受管理的規則評估工具會使用規則資源設定錄影和警示規則。以下是 Rules 資源的範例:

apiVersion: monitoring.googleapis.com/v1
kind: Rules
metadata:
  namespace: NAMESPACE_NAME
  name: example-rules
spec:
  groups:
  - name: example
    interval: 30s
    rules:
    - record: job:up:sum
      expr: sum without(instance) (up)
    - alert: AlwaysFiring
      expr: vector(1)

.spec.groups 元素的格式與上游 Prometheus rule_group 陣列相同。在 Rules 中定義的警示和錄製規則範圍為資源的 project_idclusternamespace。舉例來說,上述資源中的 job:up:sum 規則會有效查詢 sum without(instance) (up{project_id="test-project", cluster="test-cluster", namespace="NAMESPACE_NAME"})。這項保證可確保警示或錄製規則不會意外評估您可能不知道的應用程式指標。

如要將範例規則套用至叢集,請執行下列指令:

kubectl apply -n NAMESPACE_NAME -f https://raw.githubusercontent.com/GoogleCloudPlatform/prometheus-engine/v0.15.3/examples/rules.yaml

幾分鐘後,指標 job:up:sum 就會顯示。警示 AlwaysFiring 也會開始觸發。如要進一步瞭解如何將快訊傳送至 Alertmanager,請參閱「Alertmanager 設定」一文。

ClusterRulesGlobalRules 資源提供與 Rules 資源相同的介面,但會將規則套用至更廣泛的範圍。ClusterRules 會使用 project_idcluster 標籤選取資料,而 GlobalRules 則會選取查詢指標範圍中的所有資料,且不限制標籤。

如需所有 Managed Service for Prometheus 自訂資源的參考文件,請參閱 prometheus-engine/doc/api reference

將 Prometheus 規則轉換為 Rules

「規則」資源提供與 Prometheus 規則相容的介面,可提供無縫遷移路徑,將現有規則納入受管理的規則評估。您可以在規則資源中加入現有規則。舉例來說,以下是 Prometheus 規則:

groups:
- name: example
  interval: 30s
  rules:
  - record: job:up:sum
    expr: sum without(instance) (up)
  - alert: AlwaysFiring
    expr: vector(1)

以下是對應的 Rules 資源,其中原始 Prometheus 規則以粗體顯示:

apiVersion: monitoring.googleapis.com/v1
kind: Rules
metadata:
  namespace: NAMESPACE_NAME
  name: example-rules
spec:
  groups:
  - name: example
    interval: 30s
    rules:
    - record: job:up:sum
      expr: sum without(instance) (up)
    - alert: AlwaysFiring
      expr: vector(1)

ClusterRules

您可以使用 ClusterRules 資源設定記錄和警示規則,評估從特定叢集中所有命名空間傳送至 Prometheus 的 Managed Service 的所有時間序列。規格與 Rules 相同。先前的 Prometheus 規則範例會變成下列 ClusterRules 資源:

apiVersion: monitoring.googleapis.com/v1
kind: ClusterRules
metadata:
  name: example-clusterrules
spec:
  groups:
  - name: example
    interval: 30s
    rules:
    - record: job:up:sum
      expr: sum without(instance) (up)
    - alert: AlwaysFiring
      expr: vector(1)

建議您只在橫向指標 (例如服務網格產生的指標) 上使用 ClusterRules 資源。針對個別部署的指標,請使用規則資源,確保評估不會納入非預期的資料。

GlobalRules

您可以使用 GlobalRules 資源設定記錄和快訊規則,以便評估在指標範圍內,所有專案傳送至 Managed Service for Prometheus 的所有時間序列。規格與 Rules 相同。先前的 Prometheus 規則範例會變成下列 GlobalRules 資源:

apiVersion: monitoring.googleapis.com/v1
kind: GlobalRules
metadata:
  name: example-globalrules
spec:
  groups:
  - name: example
    interval: 30s
    rules:
    - record: job:up:sum
      expr: sum without(instance) (up)
    - alert: AlwaysFiring
      expr: vector(1)

由於 Cloud Monitoring 指標的範圍並未限定為命名空間或叢集,因此您必須使用 GlobalRules 資源,才能為 Cloud Monitoring 指標編寫規則或快訊。針對 Google Kubernetes Engine 系統指標發出警報時,也必須使用 GlobalRules。

如果您的規則未保留 project_idlocation 標籤,則預設為叢集的值。

針對 Managed Service for Prometheus 指標,我們建議您只在少數情況下使用 GlobalRules,也就是當警示可能需要一次取得所有叢集的資料時。針對個別部署作業的指標,請使用 Rules 或 ClusterRules 資源,以提高可靠性,並確保評估不會納入非預期的資料。除非規則的目的是要匯總這些標籤,否則強烈建議您在規則評估結果中保留 clusternamespace 標籤,否則查詢效能可能會降低,且可能會遇到基數限制。我們強烈建議您不要移除這兩個標籤。

多專案和全域規則評估

在 Google Kubernetes Engine 上部署時,規則評估工具會使用與叢集相關聯的Google Cloud 專案,並自動偵測該專案。如要評估跨專案的規則,您必須設定執行 GlobalRules 資源的規則評估器,以便使用具有多專案指標範圍的專案。操作方式有以下兩種:

  • 將 GlobalRules 資源放入具有多專案指標範圍的專案。
  • OperatorConfig 中設定 queryProjectID 欄位,即可使用具有多專案指標範圍的專案。

您也必須更新規則評估工具 (通常是節點上的預設服務帳戶) 所使用的服務帳戶權限,讓服務帳戶能夠讀取範圍專案,並寫入指標範圍內的所有監控專案。

如果指標範圍包含所有專案,則規則會在全球進行評估。詳情請參閱「指標範圍」。

使用 Cloud Monitoring 指標發出快訊

您可以使用 GlobalRules 資源,透過 PromQL 針對 Google Cloud系統指標發出快訊。如需建立有效查詢的操作說明,請參閱「Cloud Monitoring 指標的 PromQL」。

使用 Terraform 設定規則和警告

您可以使用 kubernetes_manifest Terraform 資源類型kubectl_manifest Terraform 資源類型,自動建立及管理 Rules、ClusterRules 和 GlobalRules 資源,這兩種類型都允許您指定任意自訂資源。

如要進一步瞭解如何搭配使用 Google Cloud 和 Terraform,請參閱「Terraform 與 Google Cloud」。

明確提供憑證

在 GKE 上執行時,規則評估器會根據節點的服務帳戶,自動從環境中擷取憑證。在非 GKE Kubernetes 叢集中,必須透過 gmp-public 命名空間中的 OperatorConfig 資源明確提供憑證。

  1. 將內容設定為目標專案:

    gcloud config set project PROJECT_ID
    
  2. 建立服務帳戶:

    gcloud iam service-accounts create gmp-test-sa
    

  3. 將必要權限授予服務帳戶:

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member=serviceAccount:gmp-test-sa@PROJECT_ID.iam.gserviceaccount.com \
      --role=roles/monitoring.viewer \
    && \
    gcloud projects add-iam-policy-binding PROJECT_ID\
      --member=serviceAccount:gmp-test-sa@PROJECT_ID.iam.gserviceaccount.com \
      --role=roles/monitoring.metricWriter
    

  4. 建立並下載服務帳戶金鑰:

    gcloud iam service-accounts keys create gmp-test-sa-key.json \
      --iam-account=gmp-test-sa@PROJECT_ID.iam.gserviceaccount.com
    
  5. 將金鑰檔案新增為非 GKE 叢集的密鑰:

    kubectl -n gmp-public create secret generic gmp-test-sa \
      --from-file=key.json=gmp-test-sa-key.json
    

  6. 開啟 OperatorConfig 資源進行編輯:

    kubectl -n gmp-public edit operatorconfig config
    
    1. 將粗體文字新增至資源:

      apiVersion: monitoring.googleapis.com/v1
      kind: OperatorConfig
      metadata:
        namespace: gmp-public
        name: config
      rules:
        credentials:
          name: gmp-test-sa
          key: key.json
      
      請務必將這些憑證新增至 collection 部分,才能使用受管理的收集功能。

    2. 儲存檔案並關閉編輯器。套用變更後,系統會重新建立 Pod,並開始使用指定的服務帳戶對指標後端進行驗證。

    資源調度規則評估

    規則評估器會以單一備援部署的形式執行,並設有固定的資源要求和限制。您可能會發現工作負載發生中斷情形,例如在評估大量規則時遭到 OOMKilled。為緩解這項問題,您可以部署 VerticalPodAutoscaler,以便垂直調度部署作業。首先,請確認 Kubernetes 叢集已啟用 垂直 Pod 自動調度 功能。然後套用 VerticalPodAutoscaler 資源,例如下列資源:

    apiVersion: autoscaling.k8s.io/v1
    kind: VerticalPodAutoscaler
    metadata:
      name: rule-evaluator
      namespace: gmp-system
    spec:
      resourcePolicy:
        containerPolicies:
        - containerName: evaluator
          controlledResources:
            - memory
          maxAllowed:
            memory: 4Gi
          minAllowed:
            memory: 16Mi
          mode: Auto
      targetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: rule-evaluator
      updatePolicy:
        updateMode: Auto
    

    您可以查看自動配置器的狀態,確認自動配置器是否正常運作:

    kubectl get vpa --namespace gmp-system rule-evaluator
    

    如果自動配置器運作正常,則會在「PROVIDED」欄中回報已計算出工作負載的資源建議值:

    NAME             MODE   CPU   MEM        PROVIDED   AGE
    rule-evaluator   Auto   2m    11534336   True       30m
    

    壓縮設定

    如果您有許多 Rules 資源,可能會用盡 ConfigMap 空間。如要修正這個問題,請在 OperatorConfig 資源啟用 gzip 壓縮功能

      apiVersion: monitoring.googleapis.com/v1
      kind: OperatorConfig
      metadata:
        namespace: gmp-public
        name: config
      features:
        config:
          compression: gzip
    

    Alertmanager 設定

    您可以使用 OperatorConfig 資源設定受管理的規則評估器,將快訊傳送至 Prometheus Alertmanager。除了任何自行部署的 Alertmanager,您也可以將快訊傳送至自動部署的受控 Alertmanager。

    代管式 Alertmanager

    Managed Service for Prometheus 會部署 Alertmanager 的代管執行個體,並自動將規則評估工具設為轉送警報。根據預設,這個設定會使用特定名稱的 Kubernetes 機密值設定,其中包含 Alertmanager 設定檔

    如要啟用並設定回報至已部署的 Alertmanager 例項,請執行下列操作:

    1. 建立包含 Alertmanager 設定的本機設定檔 (請參閱設定檔範本):

      touch alertmanager.yaml
      
    2. 更新檔案,加入所需的 Alertmanager 設定,並在 gmp-public 命名空間中建立名為 alertmanager 的密鑰:

      kubectl create secret generic alertmanager \
        -n gmp-public \
        --from-file=alertmanager.yaml
      

    過幾分鐘後,Managed Service for Prometheus 就會擷取新的設定密鑰,並根據您的設定啟用 Managed Alertmanager。

    自訂設定密鑰名稱

    受管理的 Alertmanager 也支援自訂密鑰名稱,可用於載入設定。當您有多個設定機密金鑰,且希望 Alertmanager 例項在對應的設定之間切換時,這項功能就很實用。舉例來說,您可能想根據輪班值班時間表變更警示通知管道,或是想換用實驗性 Alertmanager 設定來測試新的警示路徑。

    如要使用 OperatorConfig 資源指定非預設的 Secret 名稱,請執行下列操作:

    1. 從本機 Alertmanager 設定檔建立密鑰:

      kubectl create secret generic SECRET_NAME \
        -n gmp-public \
        --from-file=FILE_NAME
      
    2. 開啟 OperatorConfig 資源進行編輯:

      kubectl -n gmp-public edit operatorconfig config
      
    3. 如要啟用受管理的 Alertmanager 報表,請修改 managedAlertmanager 部分,如以下粗體文字所示:

      apiVersion: monitoring.googleapis.com/v1
      kind: OperatorConfig
      metadata:
        namespace: gmp-public
        name: config
      managedAlertmanager:
        configSecret:
          name: SECRET_NAME
          key: FILE_NAME
      

    如果您需要對 Alertmanager 設定進行任何變更,可以更新先前建立的機密金鑰,藉此編輯這個 Alertmanager 的設定。

    自訂外部網址

    您可以為受管理的 Alertmanager 設定外部網址,讓警報通知提供回呼連結,連往警報 UI。這相當於使用上游 Prometheus Alertmanager 的 --web.external-url 標記。

    apiVersion: monitoring.googleapis.com/v1
    kind: OperatorConfig
    metadata:
      namespace: gmp-public
      name: config
    managedAlertmanager:
      externalURL: EXTERNAL_URL
    

    自行部署的 Alertmanager

    如要為自行部署的 Alertmanager 設定規則評估器,請按照下列步驟操作:

    1. 開啟 OperatorConfig 資源進行編輯:

      kubectl -n gmp-public edit operatorconfig config
      
    2. 設定資源,以便將快訊傳送至 Alertmanager 服務:

      apiVersion: monitoring.googleapis.com/v1
      kind: OperatorConfig
      metadata:
        namespace: gmp-public
        name: config
      rules:
        alerting:
          alertmanagers:
          - name: SERVICE_NAME
            namespace: SERVICE_NAMESPACE
            port: PORT_NAME
      

    如果 Alertmanager 位於與規則評估器不同的叢集,您可能需要設定Endpoints 資源。舉例來說,如果 OperatorConfig 指出可在 Endpoints 物件 ns=alertmanager/name=alertmanager 中找到 Alertmanager 端點,您可以手動或以程式輔助方式建立這個物件,並填入其他叢集中可存取的 IP。AlertmanagerEndpoints 設定專區會在必要時提供授權設定選項。

    閒置時節省資源

    如果沒有設定 Rules、ClusterRules 或 GlobalRules 資源,GKE 會將規則評估器和 Alertmanager 部署規模縮減為零,為未使用受管理規則或警示的客戶節省叢集資源。您套用新的 Rules 資源時,這些部署作業會自動擴大規模。您可以套用不會執行任何操作的 Rules 資源,強制擴充資源。