在本文中,我們將看到Prometheus監控技術堆疊的局限性,以及為什么移動到基于Thanos的技術堆疊可以提高指標留存率并降低總體基礎設施成本,
用于此演示的內容可以在下面鏈接中獲取,并提交到他們各自的許可證,
- https://github.com/particuleio/teks/tree/main/terragrunt/live/thanos
- https://github.com/particuleio/terraform-kubernetes-addons/tree/main/modules/aws
Kubernetes普羅米修斯技術堆疊
在為我們的客戶部署Kubernetes基礎設施時,在每個集群上部署監控技術堆疊是標準做法,這個堆疊通常由幾個組件組成:
- Prometheus:收集度量標準
- 告警管理器:根據指標查詢向各種提供者發送警報
- Grafana:可視化豪華儀表板
簡化架構如下:

注意事項
這種架構有一些注意事項,當你想從其中獲取指標的集群數量增加時,它的伸縮性以及可擴展性不太好,
多個Grafana
在這種設定中,每個集群都有自己的Grafana和自己的一組儀表板,維護起來很麻煩,
存盤指標資料是昂貴的
Prometheus將指標資料存盤在磁盤上,你必須在存盤空間和指標保留時間之間做出選擇,如果你想長時間存盤資料并在云提供商上運行,那么如果存盤TB的資料,塊存盤的成本可能會很高,同樣,在生產環境中,Prometheus經常使用復制或分片或兩者同時運行,這可能會使存盤需求增加兩倍甚至四倍,
解決方案
多個Grafana資料源
可以在外部網路上公開Prometheus的端點,并將它們作為資料源添加到單個Grafana中,你只需要在Prometheus外部端點上使用TLS或TLS和基本認證來實作安全性,此解決方案的缺點是不能基于不同的資料源進行計算,
Prometheus聯邦
Prometheus聯邦允許從Prometheus中抓取Prometheus,當你不抓取很多指標資料時,這個解決方案可以很好地作業,在規模上,如果你所有的Prometheus目標的抓取持續時間都比抓取間隔長,可能會遇到一些嚴重的問題,
Prometheus遠程寫
雖然遠程寫入是一種解決方案(也由Thanos receiver實作),但我們將不在本文中討論“推送指標”部分,你可以在這里[1]閱讀關于推送指標的利弊,建議在不信任多個集群或租戶的情況下(例如在將Prometheus構建為服務提供時),將指標作為最后的手段,無論如何,這可能是以后文章的主題,但我們將在這里集中討論抓取,
Thanos,它來了
Thanos是一個“開源的,高可用的Prometheus系統,具有長期存盤能力”,很多知名公司都在使用Thanos,也是CNCF范訓專案的一部分,
Thanos的一個主要特點就是允許“無限”存盤空間,通過使用物件存盤(比如S3),幾乎每個云提供商都提供物件存盤,如果在前提環境下運行,物件存盤可以通過rook或minio這樣的解決方案提供,
它是如何作業的?
Thanos和Prometheus并肩作戰,從Prometheus開始升級到Thanos是很常見的,
Thanos被分成幾個組件,每個組件都有一個目標(每個服務都應該這樣:)),組件之間通過gRPC進行通信,
Thanos Sidecar

Thanos和Prometheus一起運行(有一個邊車),每2小時向一個物件存盤庫輸出Prometheus指標,這使得Prometheus幾乎是無狀態的,Prometheus仍然在記憶體中保存著2個小時的度量值,所以在發生宕機的情況下,你可能仍然會丟失2個小時的度量值(這個問題應該由你的Prometheus設定來處理,使用HA/分片,而不是Thanos),
Thanos sidecar與Prometheus運營者和Kube Prometheus堆疊一起,可以輕松部署,這個組件充當Thanos查詢的存盤,
Thanos存盤
Thanos存盤充當一個網關,將查詢轉換為遠程物件存盤,它還可以在本地存盤上快取一些資訊,基本上,這個組件允許你查詢物件存盤以獲取指標,這個組件充當Thanos查詢的存盤,
Thanos Compactor
Thanos Compactor是一個單例(它是不可擴展的),它負責壓縮和降低存盤在物件存盤中的指標,下采樣是隨著時間的推移對指標粒度的寬松,例如,你可能想將你的指標保持2年或3年,但你不需要像昨天的指標那么多資料點,這就是壓縮器的作用,它可以在物件存盤上節省位元組,從而節省成本,
Thanos Query
Thanos查詢是Thanos的主要組件,它是向其發送PromQL查詢的中心點,Thanos查詢暴露了一個與Prometheus兼容的端點,然后它將查詢分派給所有的“stores”,記住,Store可能是任何其他提供指標的Thanos組件,Thanos查詢可以發送查詢到另一個Thanos查詢(他們可以堆疊),
- Thanos Store
- Thanos Sidecar
- Thanos Query
還負責對來自不同Store或Prometheus的相同指標進行重復資料洗掉,例如,如果你有一個度量值在Prometheus中,同時也在物件存盤中,Thanos Query可以對該指標值進行重復資料洗掉,在Prometheus HA設定的情況下,重復資料洗掉也基于Prometheus副本和分片,
Thanos Query Frontend
正如它的名字所暗示的,Thanos查詢前端是Thanos查詢的前端,它的目標是將大型查詢拆分為多個較小的查詢,并快取查詢結果(在記憶體或memcached中),
還有其他組件,比如在遠程寫的情況下接收Thanos,但這仍然不是本文的主題,
多集群架構
有多種方法可以將這些組件部署到多個Kubernetes集群中,根據用例的不同,有些方法比其他方法更好,在這里我們不能給出詳細的介紹,

我們的例子是在AWS上運行,使用tEKS[2]部署了2個集群,我們的all in one解決方案將生產就緒的EKS集群部署在AWS上:
- 一個觀察者集群[3]
- 一個被觀察集群[4]
我們的部署使用了官方的kube-prometheus-stack和bitnami thanos圖表,
一切都是在我們的terraform-kubernetes-addons存盤庫中策劃的,
Thanos demo檔案夾中的目錄結構如下:
.
├── ? env_tags.yaml
├── ? eu-west-1
│ ├── ? clusters
│ │ └── ? observer
│ │ ├── ? eks
│ │ │ ├── ? kubeconfig
│ │ │ └── ? terragrunt.hcl
│ │ ├── ? eks-addons
│ │ │ └── ? terragrunt.hcl
│ │ └── ? vpc
│ │ └── ? terragrunt.hcl
│ └── ? region_values.yaml
└── ? eu-west-3
├── ? clusters
│ └── ? observee
│ ├── ? cluster_values.yaml
│ ├── ? eks
│ │ ├── ? kubeconfig
│ │ └── ? terragrunt.hcl
│ ├── ? eks-addons
│ │ └── ? terragrunt.hcl
│ └── ? vpc
│ └── ? terragrunt.hcl
└── ? region_values.yaml
這允許DRY(Don 't Repeat Yourself)基礎設施,并可以輕松地擴展AWS帳戶、區域和集群的數量,
觀察者集群
觀察者集群是我們的主集群,我們將從它查詢其他集群:
Prometheus正在運行:
- Grafana啟用
- Thanos邊車上傳到特定的桶
kube-prometheus-stack = {
enabled = true
allowed_cidrs = dependency.vpc.outputs.private_subnets_cidr_blocks
thanos_sidecar_enabled = true
thanos_bucket_force_destroy = true
extra_values = <<-EXTRA_VALUES
grafana:
deploymentStrategy:
type: Recreate
ingress:
enabled: true
annotations:
kubernetes.io/ingress.class: nginx
cert-manager.io/cluster-issuer: "letsencrypt"
hosts:
- grafana.${local.default_domain_suffix}
tls:
- secretName: grafana.${local.default_domain_suffix}
hosts:
- grafana.${local.default_domain_suffix}
persistence:
enabled: true
storageClassName: ebs-sc
accessModes:
- ReadWriteOnce
size: 1Gi
prometheus:
prometheusSpec:
replicas: 1
retention: 2d
retentionSize: "10GB"
ruleSelectorNilUsesHelmValues: false
serviceMonitorSelectorNilUsesHelmValues: false
podMonitorSelectorNilUsesHelmValues: false
storageSpec:
volumeClaimTemplate:
spec:
storageClassName: ebs-sc
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 10Gi
EXTRA_VALUES
為觀察者集群生成一個CA證書:
- 這個CA將被進入sidecar的被觀察集群所信任
- 為Thanos querier組件生成TLS證書,這些組件將查詢被觀察集群
Thanos組件部署:
- Thanos組件全部部署完成
- 查詢前端,作為Grafana的資料源端點
- 存盤網關用于查詢觀察者桶
- Query將對存盤網關和其他查詢器執行查詢
部署的額外Thanos組件:
- 配置了TLS的Thanos查詢器對每個被觀察集群進行查詢
thanos-tls-querier = {
"observee" = {
enabled = true
default_global_requests = true
default_global_limits = false
stores = [
"thanos-sidecar.${local.default_domain_suffix}:443"
]
}
}
thanos-storegateway = {
"observee" = {
enabled = true
default_global_requests = true
default_global_limits = false
bucket = "thanos-store-pio-thanos-observee"
region = "eu-west-3"
}
被觀測集群
被觀測集群是Kubernetes集群,具有最小的Prometheus/Thanos安裝,將被觀測集群查詢,
推薦一個 Spring Boot 基礎教程及實戰示例:
https://github.com/javastacks/spring-boot-best-practice
Prometheus operator正在運行:
- Thanos這邊就是上傳給觀察者特定的桶
- Thanos邊車與TLS客戶端認證的入口物件一起發布,并信任觀察者集群CA
kube-prometheus-stack = {
enabled = true
allowed_cidrs = dependency.vpc.outputs.private_subnets_cidr_blocks
thanos_sidecar_enabled = true
thanos_bucket_force_destroy = true
extra_values = <<-EXTRA_VALUES
grafana:
enabled: false
prometheus:
thanosIngress:
enabled: true
ingressClassName: nginx
annotations:
cert-manager.io/cluster-issuer: "letsencrypt"
nginx.ingress.kubernetes.io/ssl-redirect: "true"
nginx.ingress.kubernetes.io/backend-protocol: "GRPC"
nginx.ingress.kubernetes.io/auth-tls-verify-client: "on"
nginx.ingress.kubernetes.io/auth-tls-secret: "monitoring/thanos-ca"
hosts:
- thanos-sidecar.${local.default_domain_suffix}
paths:
- /
tls:
- secretName: thanos-sidecar.${local.default_domain_suffix}
hosts:
- thanos-sidecar.${local.default_domain_suffix}
prometheusSpec:
replicas: 1
retention: 2d
retentionSize: "6GB"
ruleSelectorNilUsesHelmValues: false
serviceMonitorSelectorNilUsesHelmValues: false
podMonitorSelectorNilUsesHelmValues: false
storageSpec:
volumeClaimTemplate:
spec:
storageClassName: ebs-sc
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 10Gi
EXTRA_VALUES
Thanos組件部署:
- Thanos壓縮器來管理這個特定集群的下采樣
thanos = {
enabled = true
bucket_force_destroy = true
trusted_ca_content = dependency.thanos-ca.outputs.thanos_ca
extra_values = <<-EXTRA_VALUES
compactor:
retentionResolution5m: 90d
query:
enabled: false
queryFrontend:
enabled: false
storegateway:
enabled: false
EXTRA_VALUES
}
再深入一點
讓我們檢查一下集群上正在運行什么,關于觀察員,我們有:
kubectl -n monitoring get pods
NAME READY STATUS RESTARTS AGE
alertmanager-kube-prometheus-stack-alertmanager-0 2/2 Running 0 120m
kube-prometheus-stack-grafana-c8768466b-rd8wm 2/2 Running 0 120m
kube-prometheus-stack-kube-state-metrics-5cf575d8f8-x59rd 1/1 Running 0 120m
kube-prometheus-stack-operator-6856b9bb58-hdrb2 1/1 Running 0 119m
kube-prometheus-stack-prometheus-node-exporter-8hvmv 1/1 Running 0 117m
kube-prometheus-stack-prometheus-node-exporter-cwlfd 1/1 Running 0 120m
kube-prometheus-stack-prometheus-node-exporter-rsss5 1/1 Running 0 120m
kube-prometheus-stack-prometheus-node-exporter-rzgr9 1/1 Running 0 120m
prometheus-kube-prometheus-stack-prometheus-0 3/3 Running 1 120m
thanos-compactor-74784bd59d-vmvps 1/1 Running 0 119m
thanos-query-7c74db546c-d7bp8 1/1 Running 0 12m
thanos-query-7c74db546c-ndnx2 1/1 Running 0 12m
thanos-query-frontend-5cbcb65b57-5sx8z 1/1 Running 0 119m
thanos-query-frontend-5cbcb65b57-qjhxg 1/1 Running 0 119m
thanos-storegateway-0 1/1 Running 0 119m
thanos-storegateway-1 1/1 Running 0 118m
thanos-storegateway-observee-storegateway-0 1/1 Running 0 12m
thanos-storegateway-observee-storegateway-1 1/1 Running 0 11m
thanos-tls-querier-observee-query-dfb9f79f9-4str8 1/1 Running 0 29m
thanos-tls-querier-observee-query-dfb9f79f9-xsq24 1/1 Running 0 29m
kubectl -n monitoring get ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
kube-prometheus-stack-grafana <none> grafana.thanos.teks-tg.clusterfrak-dynamics.io k8s-ingressn-ingressn-afa0a48374-f507283b6cd101c5.elb.eu-west-1.amazonaws.com 80, 443 123m
被觀察者:
kubectl -n monitoring get pods
NAME READY STATUS RESTARTS AGE
alertmanager-kube-prometheus-stack-alertmanager-0 2/2 Running 0 39m
kube-prometheus-stack-kube-state-metrics-5cf575d8f8-ct292 1/1 Running 0 39m
kube-prometheus-stack-operator-6856b9bb58-4cngc 1/1 Running 0 39m
kube-prometheus-stack-prometheus-node-exporter-bs4wp 1/1 Running 0 39m
kube-prometheus-stack-prometheus-node-exporter-c57ss 1/1 Running 0 39m
kube-prometheus-stack-prometheus-node-exporter-cp5ch 1/1 Running 0 39m
kube-prometheus-stack-prometheus-node-exporter-tnqvq 1/1 Running 0 39m
kube-prometheus-stack-prometheus-node-exporter-z2p49 1/1 Running 0 39m
kube-prometheus-stack-prometheus-node-exporter-zzqp7 1/1 Running 0 39m
prometheus-kube-prometheus-stack-prometheus-0 3/3 Running 1 39m
thanos-compactor-7576dcbcfc-6pd4v 1/1 Running 0 38m
kubectl -n monitoring get ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
kube-prometheus-stack-thanos-gateway nginx thanos-sidecar.thanos.teks-tg.clusterfrak-dynamics.io k8s-ingressn-ingressn-95903f6102-d2ce9013ac068b9e.elb.eu-west-3.amazonaws.com 80, 443 40m
我們的TLS查詢器應該能夠查詢被觀測集群的度量標準,讓我們來看看它們的行為:
k -n monitoring logs -f thanos-tls-querier-observee-query-687dd88ff5-nzpdh
level=info ts=2021-02-23T15:37:35.692346206Z caller=storeset.go:387 component=storeset msg="adding new storeAPI to query storeset" address=thanos-sidecar.thanos.teks-tg.clusterfrak-dynamics.io:443 extLset="{cluster=\"pio-thanos-observee\", prometheus=\"monitoring/kube-prometheus-stack-prometheus\", prometheus_replica=\"prometheus-kube-prometheus-stack-prometheus-0\"}"
所以這個查詢器pods可以查詢我的其他集群,如果我們檢查Web,我們可以看到存盤:
kubectl -n monitoring port-forward thanos-tls-querier-observee-query-687dd88ff5-nzpdh 10902

太棒了,但是我只有一個存盤,還記得我們說過查詢器可以堆疊在一起嗎?在我們的觀察者集群中,我們有標準的http查詢器,它可以查詢架構圖中的其他組件,
kubectl -n monitoring port-forward thanos-query-7c74db546c-d7bp8 10902
這里我們可以看到所有的存盤已經被添加到我們的中心查詢器:

- 觀察者把本地Thanos聚集
- 我們的存盤網關(一個用于遠程觀測者集群,一個用于本地觀測者集群)
- 本地TLS查詢器,它可以查詢被觀察的sidecar
在Grafana可視化
最后,我們可以前往Grafana,看看默認的Kubernetes儀表板是如何與多集群兼容的,

總結
Thanos是一個非常復雜的系統,有很多移動部件,我們沒有深入研究具體的自定義配置,因為它會花費太多的時間,
我們在tEKS存盤庫中提供了一個相當完整的AWS實作,它抽象了很多復雜性(主要是mTLS部分),并允許進行很多定制,你也可以使用terraform-kubernetes-addons模塊作為獨立的組件,我們計劃在未來支持其他云提供商,不要猶豫,通過Github上的任何一個專案的問題聯系我們,
根據你的基礎設施和需求,有許多可能適合你的Thanos實作,
如果你想深入研究Thanos,可以查看他們的官方kube-thanos存盤庫,以及他們關于跨集群通信的建議[5],
作者:Kevin Lefevre, CTO & 聯合創始人
原文:particule.io/en/blog/thanos-monitoring/
翻譯:劉志超 來源:weekly.dockone.io/article/2432427
相關鏈接:
- https://docs.google.com/document/d/1H47v7WfyKkSLMrR8_iku6u9VB73WrVzBHb2SB6dL9_g/edit#heading=h.2v27snv0lsur
- https://github.com/particuleio/teks
- https://github.com/particuleio/teks/tree/main/terragrunt/live/thanos/eu-west-1/clusters/observer
- https://github.com/particuleio/teks/tree/main/terragrunt/live/thanos/eu-west-3/clusters/observee
- https://thanos.io/tip/operating/cross-cluster-tls-communication.md/
近期熱文推薦:
1.1,000+ 道 Java面試題及答案整理(2022最新版)
2.勁爆!Java 協程要來了,,,
3.Spring Boot 2.x 教程,太全了!
4.別再寫滿屏的爆爆爆炸類了,試試裝飾器模式,這才是優雅的方式!!
5.《Java開發手冊(嵩山版)》最新發布,速速下載!
覺得不錯,別忘了隨手點贊+轉發哦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/488697.html
標籤:其他
