使用 Prometheus

Prometheus 是經常與 Kubernetes 搭配使用的選用監控工具。如果您使用 Prometheus 支援設定 Stackdriver Kubernetes Engine Monitoring,就可以從叢集匯出在 Prometheus 資料模型中顯示指標的服務,並在 Stackdriver 中顯示為外部指標

本頁面說明 Stackdriver 從與 Stackdriver Kubernetes Engine Monitoring 搭配使用的 Prometheus 用戶端收集資料的機制。整合的原始碼是開放給大眾使用的。

事前準備

此處描述的 Prometheus 支援不適用於 Stackdriver Monitoring 中描述的舊版 Stackdriver 支援。

安裝收集器

Stackdriver 會提供收集器,您必須在和 Prometheus 伺服器相同的 Kubernetes pod 中將其部署為補充容器。使用下列殼層指令,在使用 Stackdriver Kubernetes Engine Monitoring 的新叢集中安裝 Stackdriver 收集器。

登入叢集,透過必要的環境變數執行下列指令碼:

  • KUBE_NAMESPACE:用於執行指令碼的命名空間
  • KUBE_CLUSTER:補充容器的叢集名稱參數
  • GCP_REGION:補充容器的 GCP 地區參數
  • GCP_PROJECT:補充容器的 GCP 專案參數
  • DATA_DIR:補充容器的資料目錄
  • DATA_VOLUME:包含 Prometheus 資料的磁碟區名稱
  • SIDECAR_IMAGE_TAG:Prometheus 補充容器的 Docker 映像檔版本。建議使用 Container Registry 提供的最新版本。
#!/bin/sh

set -e
set -u

usage() {
  echo -e "Usage: $0 <deployment|statefulset> <name>\n"
}

if [  $# -le 1 ]; then
  usage
  exit 1
fi

# Override to use a different Docker image name for the sidecar.
export SIDECAR_IMAGE_NAME=${SIDECAR_IMAGE_NAME:-'gcr.io/stackdriver-prometheus/stackdriver-prometheus-sidecar'}

kubectl -n "${KUBE_NAMESPACE}" patch "$1" "$2" --type strategic --patch "
spec:
  template:
    spec:
      containers:
      - name: sidecar
        image: ${SIDECAR_IMAGE_NAME}:${SIDECAR_IMAGE_TAG}
        imagePullPolicy: Always
        args:
        - \"--stackdriver.project-id=${GCP_PROJECT}\"
        - \"--prometheus.wal-directory=${DATA_DIR}/wal\"
        - \"--stackdriver.kubernetes.location=${GCP_REGION}\"
        - \"--stackdriver.kubernetes.cluster-name=${KUBE_CLUSTER}\"
        #- \"--stackdriver.generic.location=${GCP_REGION}\"
        #- \"--stackdriver.generic.namespace=${KUBE_CLUSTER}\"
        ports:
        - name: sidecar
          containerPort: 9091
        volumeMounts:
        - name: ${DATA_VOLUME}
          mountPath: ${DATA_DIR}
"

驗證設定

設定 Prometheus 之後,請執行下列指令以驗證安裝:

kubectl -n "${KUBE_NAMESPACE}" get <deployment|statefulset> <name> -o=go-template='{{$output := "stackdriver-prometheus-sidecar does not exists."}}{{range .spec.template.spec.containers}}{{if eq .name "stackdriver-prometheus-sidecar"}}{{$output = (print "stackdriver-prometheus-sidecar exists. Image: " .image)}}{{end}}{{end}}{{printf $output}}{{"\n"}}'

如果系統成功安裝 Prometheus 補充容器,則指令碼會輸出下列資訊:

stackdriver-prometheus-sidecar exists. Image: gcr.io/stackdriver-prometheus/stackdriver-prometheus-sidecar:0.3.2

如果系統未成功安裝 Prometheus 補充容器,則指令碼會輸出下列資訊:

stackdriver-prometheus-sidecar does not exist.

如要確認工作負載是否為最新且可供使用的狀態,請執行下列指令:

kubectl -n "${KUBE_NAMESPACE}" get <deployment|statefulset> <name>

更新設定

在驗證收集器是否已成功安裝後,更新叢集設定以使變更較持久:

  1. 確認 Prometheus 伺服器寫入共用磁碟區:

    1. 確認 Prometheus Pod 內有共用磁碟區:

      volumes:
        - name: data-volume
          emptyDir: {}
      
    2. 讓 Prometheus 在 /data 底下掛接磁碟區:

      volumeMounts:
      - name: data-volume
        mountPath: /data
      
    3. 指示 Prometheus 伺服器寫入 /data 中的共用磁碟區。將下列指令新增至其容器 args

      --storage.tsdb.path=/data
      
  2. 將收集器容器新增為補充容器。

    - name: sidecar
      image: gcr.io/stackdriver-prometheus/stackdriver-prometheus-sidecar:[SIDECAR_IMAGE_TAG]
      args:
      - "--stackdriver.project-id=[GCP_PROJECT]"
      - "--prometheus.wal-directory=/data/wal"
      - "--stackdriver.kubernetes.location=[GCP_REGION]"
      - "--stackdriver.kubernetes.cluster-name=[KUBE_CLUSTER]"
      ports:
      - name: sidecar
        containerPort: 9091
      volumeMounts:
      - name: data-volume
        mountPath: /data
    

若需關於收集器的其他設定詳細資料,請參閱 Stackdriver Prometheus 補充資訊說明文件

查看指標

您安裝的 Prometheus 軟體已設定為開始將指標匯出至 Monitoring 成為外部指標。您可在「Stackdriver」>「Resources」(資源) >「Metrics Explorer」中看到這些指標:

前往 METRICS EXPLORER

在受控資源類型 Kubernetes 容器 (k8s_container) 中尋找名稱為 external/prometheus/... 的指標。應該會有一些有趣資料的指標是 external/prometheus/go_memstats_alloc_bytes。如果您的工作區中有多個叢集,您可能會想要依據叢集名稱篩選圖表,如以下螢幕擷取畫面所示:

Prometheus 圖表

Prometheus 整合問題

Stackdriver 內未顯示任何資料。

如果在完成安裝步驟後,Stackdriver 內未顯示任何資料,請查看收集器記錄檔是否有任何可指出問題所在的錯誤訊息。

記錄檔內如果並沒有任何明顯的錯誤訊息,請將 -log.level=debug 標記傳送至收集器,以啟用偵錯記錄功能。重新啟動收集器後,可能會開始出現能指出問題來源的新訊息。

我使用了錄製規則,但指標並未顯示在 Stackdriver 中。

錄製規則需要特殊處理。在可能的情況下,我們建議將原始指標擷取到 Stackdriver 和 Stackdriver Monitoring 的功能中,以便在查詢時匯總資料 (圖表、資訊主頁等)。

如果無法擷取原始指標,您可以在收集器的配置 (文件) 中新增一個 static_metadata 項目。此選項要求您保留 jobinstance 標籤。例如,目前設定為有效:

在您的 Prometheus 伺服器設定:

groups:
- name: my-groups
  rules:
  - record: backlog_avg_10m
    expr: avg_over_time(backlog_k8s[10m])
  - record: backlog_k8s
    expr: sum(total_lag) by (app, job, instance)

在 Stackdriver Prometheus 收集器設定中:

static_metadata:
  - metric: backlog_avg_10m
    type: gauge

目前不支援變更或刪除 jobinstance 標籤的錄製規則。

我的指標遺漏 jobinstance Prometheus 標籤。

Stackdriver Prometheus 收集器利用廣為人知的 Prometheus 標籤,為 Kubernetes 物件建構了 Stackdriver MonitoredResource。如果您意外變更了標籤描述元,收集器就無法將指標寫入至 Stackdriver。

我在記錄中看見「duplicate time series」(重複的時間序列) 或「out-of-order writes」(順序不符的寫入) 的錯誤訊息。

這些錯誤可能因將指標資料寫入相同時間序列兩次所致。如果您的 Prometheus 端點從單一 Stackdriver 受控資源顯示相同指標資料 (也就是同一組指標標籤值) 兩次,就會發生這樣的錯誤。

例如,Kubernetes 容器可能會在多個通訊埠上顯示 Prometheus 指標。由於 Stackdriver k8s_container 受控資源不會依據通訊埠區分資源,因此 Stackdriver 會偵測到您將兩個資料點寫入到相同的時間序列。解決方法是在 Prometheus 中新增指標來區分時間序列。例如,您可以使用 __meta_kubernetes_pod_annotation_prometheus_io_port 標籤,因為這個標籤在容器每次重新啟動時都會保持一致。

我在記錄中看見「metric kind must be X, but is Y」(指標種類必須為 X,但卻採用 Y) 的錯誤訊息。

這些錯誤可能因在取樣、計數和其他作業之間的原始碼中變更 Prometheus 指標類型所致。由於資料語意會依類型而異,因此 Stackdriver 指標會嚴格規定類型且 Stackdriver 必定會強制執行此限制。

如要刪除指標類型,則必須刪除對應的指標描述元,但是這樣將導致無法存取其現有的時間序列資料。

我確定之前看過 Prometheus 指標類型,但是現在找不到!

您安裝的 Prometheus 軟體已預先設定為將指標匯出至 Stackdriver Monitoring 成為外部指標。匯出資料時,Monitoring 會為外部指標建立適當的指標描述元。如果之後至少 6 週未寫入該指標類型的資料,即該指標描述元可能遭刪除。

我們無法保證 6 週後一定會刪除未使用的指標描述元,但是 Monitoring 保留刪除在過去 6 週內未使用之任何 Prometheus 指標描述元的權利。

廢止政策

Stackdriver Prometheus 整合必須遵守 Stackdriver 代理程式廢止政策

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Stackdriver Monitoring
需要協助嗎?請前往我們的支援網頁