Thanos Sidecar 與 Prometheus 例項平行佈署,扮演橋樑角色,將 Prometheus 指標資料備份至物件儲存,同時讓 Thanos Query 能夠查詢 Prometheus 的資料。此架構解決 Prometheus 單點故障和長期儲存的限制,實作高用性和可擴充套件的監控系統。Sidecar 主要功能包含將 TSDB 區塊上傳至物件儲存,以及透過 StoreAPI 讓 Thanos Query 執行查詢。佈署 Sidecar 時,需設定物件儲存相關引數,並調整 Prometheus 的 TSDB 區塊設定,停用內建壓縮,確保區塊能被 Sidecar 正常上傳。整合 Thanos Sidecar 後,Prometheus 的監控能力得以提升,為雲原生環境提供更可靠的監控方案。

Thanos Sidecar:Prometheus 環境的擴充套件利器

Thanos Sidecar 是 Thanos 專案中最基礎的元件,為 Prometheus 環境提供了查詢多個 Prometheus 例項和備份 TSDB 資料至物件儲存後端的關鍵功能。本篇文章將深入探討 Thanos Sidecar 的工作原理、佈署方式及其在 Prometheus 環境中的重要性。

為何選擇 Thanos?

儘管 Thanos 包含多個元件,但其設計簡單且易於理解。每個元件功能狹窄,便於管理和擴充套件。Thanos 作為 CNCF 專案,擁有活躍的開源社群和數百名貢獻者,確保了專案的長久發展和支援的便利性。選擇 Thanos 的主要原因在於其能夠隨著 Prometheus 環境的擴充套件而成長,提供分散式查詢和長期資料儲存等功能,且無需擔心授權或功能限制。

Thanos Sidecar 的工作原理

Thanos Sidecar 透過與 Prometheus 例項平行佈署,實作了多個關鍵功能:

  1. 分散式查詢:Sidecar 透過 gRPC 的 StoreAPI 介面,使 Thanos Query 等元件能夠查詢多個 Prometheus 例項的資料。
  2. 長期資料儲存:Sidecar 將 Prometheus 的 TSDB 區塊上傳至物件儲存服務,實作資料的長期儲存。
  3. 自動過載 Prometheus 組態:當組態檔案或規則檔案變更時,Sidecar 能夠自動觸發 Prometheus 的過載。

StoreAPI 與分散式查詢

Thanos Sidecar 實作了 StoreAPI,允許 Thanos Query 等元件透過該 API 查詢 Prometheus 例項的資料。查詢請求透過 Sidecar 代理至 Prometheus 例項,並傳回查詢結果。這種設計使得 Sidecar 可以靈活佈署,不必與 Prometheus 例項共置。

長期資料儲存機制

為了實作長期資料儲存,Thanos Sidecar 需要存取 Prometheus 的資料目錄,並將 TSDB 區塊上傳至物件儲存服務。為此,需要停用 Prometheus 的內建壓縮功能,以避免區塊被合併。具體做法是設定 --storage.tsdb.min-block-duration--storage.tsdb.max-block-duration 為相同的值(建議 2 小時)。

佈署 Thanos Sidecar

本文將介紹如何佈署 Thanos Sidecar,並與 kube-prometheus-stack Helm chart 整合。

步驟 1:建立物件儲存目標

首先,需要建立一個物件儲存桶,用於儲存 Thanos Sidecar 上傳的 TSDB 區塊。這裡使用 Linode 服務作為範例:

# 安裝 boto3
$ pip3 install --user boto3

# 建立物件儲存桶
$ linode-cli obj --cluster us-ord-1 mb mastering-prometheus-thanos

# 建立存取金鑰
$ linode-cli object-storage keys-create --label thanos-access

步驟 2:組態 Thanos Sidecar

接下來,需要在 Prometheus Operator 中啟用 Thanos Sidecar。由於 Prometheus Operator 內建支援 Thanos Sidecar,佈署過程相對簡單。需要在 Helm 的 values.yaml 檔案中新增相關組態:

prometheus:
  prometheusSpec:
    thanos:
      objectStorageConfig:
        name: thanos-objstore-config
        key: thanos.yaml

Mermaid 圖表:Thanos Sidecar 工作流程

  flowchart TD
    A[開始] --> B{檢查 Prometheus 狀態}
    B -->|正常| C[透過 StoreAPI 提供查詢服務]
    B -->|異常| D[回報錯誤]
    C --> E[上傳 TSDB 區塊至物件儲存]
    D --> E

圖表剖析:

此圖示展示了 Thanos Sidecar 的基本工作流程。首先,Sidecar 檢查 Prometheus 例項的狀態。如果狀態正常,Sidecar 透過 StoreAPI 提供查詢服務;若狀態異常,則回報錯誤。無論如何,最終都會執行上傳 TSDB 區塊至物件儲存的操作。

程式碼範例:組態 Thanos Sidecar

import os
import yaml

def configure_thanos_sidecar(prometheus_url, obj_store_config):
    """組態 Thanos Sidecar"""
    sidecar_config = {
        "prometheus_url": prometheus_url,
        "obj_store_config": obj_store_config
    }
    return sidecar_config

# 使用範例
prometheus_url = "http://prometheus:9090"
obj_store_config = {
    "type": "s3",
    "config": {
        "endpoint": "us-ord-1.linodeobjects.com",
        "bucket": "mastering-prometheus-thanos"
    }
}

sidecar_config = configure_thanos_sidecar(prometheus_url, obj_store_config)
print(yaml.dump(sidecar_config, default_flow_style=False))

內容解密:

此程式碼定義了一個名為 configure_thanos_sidecar 的函式,用於生成 Thanos Sidecar 的組態。函式接收 Prometheus 的 URL 和物件儲存組態作為輸入引數,並傳回一個包含 Sidecar 組態的字典。組態內容包括 Prometheus 的 URL 和物件儲存的詳細資訊,如端點和儲存桶名稱。此組態可用於佈署 Thanos Sidecar,並與 Prometheus 及物件儲存服務進行整合。

透過 Thanos 擴充套件 Prometheus 的全域監控能力

隨著現代雲原生應用的快速發展,監控系統需要具備可擴充套件性和高用性。Prometheus 作為流行的監控系統,在單一叢集佈署時表現優異,但面對多叢集或大規模環境時,其原生設計的侷限性逐漸顯現。Thanos 作為 Prometheus 的擴充套件解決方案,能夠有效地解決這些挑戰,提供長期儲存、全域性查詢和資料去重等功能。

Thanos Sidecar 組態

要使用 Thanos,首先需要在 Prometheus 佈署中新增 Thanos Sidecar 元件。Sidecar 負責將 Prometheus 的資料上傳到物件儲存(如 S3)。以下是組態步驟:

  1. 建立物件儲存組態

首先,需要建立一個包含物件儲存存取憑證的組態檔案。建立一個名為 thanos-objstore-config.yaml 的檔案,內容如下:

apiVersion: v1
kind: Secret
metadata:
  name: thanos-objstore-config
  namespace: prometheus
stringData:
  thanos.yaml: |
    type: s3
    config:
      bucket: mastering-prometheus-thanos
      access_key: YOUR_ACCESS_KEY
      secret_key: YOUR_SECRET_KEY
  1. 應用組態

使用 kubectl 命令應用上述組態:

$ kubectl apply -f thanos-objstore-config.yaml
  1. 更新 Helm 組態

在 Helm 的 values.yaml 檔案中新增 Thanos Sidecar 的組態:

prometheus:
  prometheusSpec:
    thanos:
      objectStorageConfig:
        name: thanos-objstore-config
        key: "thanos.yaml"

然後使用 Helm 升級 Prometheus 佈署:

$ helm upgrade --namespace prometheus \
  --version 47.0.0 \
  --values sidecar-values.yaml \
  mastering-prometheus \
  prometheus-community/kube-prometheus-stack

Thanos Compactor 元件

Thanos Compactor 負責對儲存在物件儲存中的 TSDB 塊進行壓縮和降取樣。

壓縮功能

Thanos Compactor 透過合併多個小塊來減少儲存空間。與 Prometheus 的本地壓縮類別似,Thanos Compactor 會下載物件儲存中的塊,合併後再上傳。

垂直壓縮

垂直壓縮是一種可選功能,用於處理多個 Prometheus 例項上傳的重複資料。透過啟用垂直壓縮,可以進一步減少儲存空間的使用:

--compact.enable-vertical-compaction \
--deduplication.replica-label=prometheus_replica \
--deduplication.func=penalty

需謹慎使用此功能,因為錯誤組態可能導致資料損壞。

降取樣

降取樣的主要目的是提高長週期查詢的效能。Thanos 會自動將原始資料降取樣為 5 分鐘和 1 小時兩個解析度:

  1. 原始資料在 40 小時後降取樣為 5 分鐘解析度。
  2. 5 分鐘解析度資料在 10 天後進一步降取樣為 1 小時解析度。

降取樣會增加儲存使用量,因為會額外儲存降取樣後的資料塊。

Mermaid 圖表:Thanos 資料處理流程

  flowchart TD
    A[Prometheus 資料寫入] --> B[Thanos Sidecar 上傳]
    B --> C[物件儲存儲存 TSDB 塊]
    C --> D[Thanos Compactor 壓縮]
    D --> E[降取樣處理]
    E --> F[儲存降取樣資料]

圖表剖析:

此圖展示了 Thanos 的資料處理流程。首先,Prometheus 寫入的資料透過 Thanos Sidecar 上傳到物件儲存。Thanos Compactor 隨後對這些資料進行壓縮和降取樣處理,最終將處理後的資料儲存起來,以供後續查詢使用。

程式碼範例:Thanos 組態

import yaml

def generate_thanos_config(access_key, secret_key, bucket_name):
    config = {
        "apiVersion": "v1",
        "kind": "Secret",
        "metadata": {
            "name": "thanos-objstore-config",
            "namespace": "prometheus"
        },
        "stringData": {
            "thanos.yaml": yaml.dump({
                "type": "s3",
                "config": {
                    "bucket": bucket_name,
                    "access_key": access_key,
                    "secret_key": secret_key
                }
            })
        }
    }
    return yaml.dump(config, default_flow_style=False)

# 使用範例
access_key = "your_access_key_here"
secret_key = "your_secret_key_here"
bucket_name = "mastering-prometheus-thanos"

print(generate_thanos_config(access_key, secret_key, bucket_name))

內容解密:

此 Python 函式用於生成 Thanos 的物件儲存組態。它接收存取金鑰、秘密金鑰和儲存桶名稱作為輸入引數,並傳回一個 YAML 格式的組態字串。函式內部構建了一個包含必要組態項的字典,最終透過 yaml.dump() 方法序列化為 YAML 字串。這樣生成的組態可以直接用於 Kubernetes 的 Secret 資源建立。

使用 Thanos 擴充套件 Prometheus 的全域監控能力

隨著現代雲原生應用的快速發展,監控系統需要具備更強的擴充套件性和高用性。Prometheus 作為流行的監控系統,雖然具備強大的監控能力,但在長期資料儲存和全域查詢方面存在一定的侷限性。Thanos 作為一個開源的 Prometheus 擴充套件專案,能夠有效地解決這些問題,提供長期的歷史資料儲存、高用性和全域查詢能力。

Thanos 架構概述

Thanos 主要由多個元件組成,包括 Sidecar、Store、Query、Compactor 和 Ruler 等。這些元件共同協作,實作了 Prometheus 的高用性、長期資料儲存和全域查詢等功能。

Thanos Compactor:資料壓縮與降取樣

Thanos Compactor 是 Thanos 架構中的重要元件,負責對儲存在物件儲存中的資料進行壓縮和降取樣。資料壓縮可以減少儲存空間的使用,而降取樣則可以降低查詢大時間範圍資料時的負載。Compactor 透過定期執行,自動執行資料壓縮和降取樣任務。

# 佈署 Thanos Compactor
kubectl apply -f thanos-compact.yaml

內容解密:

此命令用於佈署 Thanos Compactor 元件。透過執行該命令,Kubernetes 將建立一個名為 thanos-compact-0 的 Pod,負責執行資料壓縮和降取樣任務。Compactor 的執行間隔可以透過 --wait-interval 引數進行組態,預設為 5 分鐘。

Thanos Query:統一查詢入口

Thanos Query 是 Thanos 架構中的另一個關鍵元件,提供了一個統一的查詢入口,用於執行 PromQL 查詢。它不僅支援查詢來自 Thanos Sidecar 的實時資料,還支援查詢儲存在物件儲存中的歷史資料。

# 佈署 Thanos Query
kubectl apply -f thanos-query.yaml

內容解密:

此命令用於佈署 Thanos Query 元件。佈署完成後,Thanos Query 將作為一個統一的查詢入口,支援對多個資料來源執行 PromQL 查詢。使用者可以透過存取 Thanos Query 的 Web UI 或 API 來執行查詢操作。

擴充套件 Thanos Query 的效能

隨著連線到 Thanos Query 的資料來源數量增加,查詢效能可能會成為瓶頸。為瞭解決這個問題,Thanos 提供了多種最佳化方案,包括使用自定義的 PromQL 引擎和查詢分片等。

  flowchart TD
    A[開始查詢] --> B{檢查查詢條件}
    B -->|簡單查詢| C[直接執行查詢]
    B -->|複雜查詢|
    C --> E[傳回查詢結果]
E
E
    D[分片查詢]
D --> F[彙總查詢結果]
F --> E

圖表翻譯:

此圖示展示了 Thanos Query 的查詢處理流程。對於簡單查詢,展望 Query 可以直接執行查詢並傳回結果。對於複雜查詢,Thanos Query 會將查詢分片到多個子查詢節點執行,最後彙總查詢結果並傳回。

自定義 PromQL 引擎

Thanos 自定義的 PromQL 引擎是提升查詢效能的重要最佳化手段。該引擎支援多執行緒執行和分散式查詢,能夠顯著提高查詢效率。

# 啟用 Thanos 自定義 PromQL 引擎
thanos query --query.promql-engine=thanos

內容解密:

此命令用於啟用 Thanos 自定義的 PromQL 引擎。透過啟用該引擎,Thanos Query 能夠更好地支援分散式查詢和多執行緒執行,從而提高查詢效能。

隨著監控資料量的不斷增長,Prometheus 單點儲存和查詢的瓶頸日益凸顯。Thanos Sidecar 作為橋樑,有效整合 Prometheus 與物件儲存,為構建高用性和可擴充套件的監控系統提供了堅實基礎。分析 Thanos Sidecar 的核心功能,其不僅實作了長期資料儲存,更重要的是透過 StoreAPI 介面,讓 Thanos Query 能夠橫向擴充套件,查詢分散於各個 Prometheus 例項的資料,大幅提升查詢效率。然而,Sidecar 的引入也增加了系統複雜度,需要仔細考量物件儲存的成本、網路延遲以及 Sidecar 本身的資源消耗。隨著雲原生生態的蓬勃發展,預計 Thanos Sidecar 將持續演進,更深度地整合 Prometheus 生態,並提供更精細化的資料管理和查詢最佳化策略。對於追求高用性和長期資料儲存的企業而言,Thanos Sidecar 以及整個 Thanos 生態值得深入研究和應用。