跳至主要内容

6 · Mimir 部署細節 — Kubernetes

namespace: mimir · helm: mimir-distributed · ring: memberlist gossip :7946

寫入路徑寫入 · 寫出讀取路徑查詢 · 取得背景 · 儲存壓實 · rules · buckets虛線 = 流量 · 會流動 namespace: mimir · helm: mimir-distributedgateway (nginx)Deployment ×2 · 用戶端只看一個 Service/api/v1/push/prometheus/*WRITEdistributorDeployment ×3+ · 依 CPU HPAingester每 zone StatefulSet ×3PVC WALREADquery-frontendDeployment ×2 · 無狀態query-schedulerDeployment ×2 · 每 tenant 公平佇列querierDeployment ×2+ · 依佇列深度 HPAstore-gateway每 zone StatefulSet ×1 · PVC index 快取BACKENDcompactorStatefulSet ×1 · PVC 暫存磁碟rulerDeployment ×2alertmanagerStatefulSet ×3 · gossip HA · PVC silencesmemcached ×4chunks · index · results · metadatahash ring · memberlist gossip :7946 — 不需 etcd/consul · zone-aware RF=3

元件

gateway (nginx)

所有 Mimir 流量的單一入口 Service。把寫入與讀取路徑導到正確的內部 Services,用戶端只需一個端點。

  • Deployment ×2,位於 ClusterIP/Ingress 之後
  • /api/v1/push → distributor Service
  • /prometheus/* → query-frontend Service
  • 可在邊界強制驗證並注入 X-Scope-OrgID
protocolin :80/:443 · out :8080 internal Services

distributor (K8s)

無狀態 Deployment — 最容易自動擴展的元件。依寫入吞吐量配置。

  • Deployment,3 個以上副本 · 依 CPU HPA
  • 無卷、無身分 — 隨時可殺
  • PodDisruptionBudget:節點排空時維持多數存活
protocolService: mimir-distributor:8080

ingester (K8s)

有狀態的核心。zone-aware StatefulSets — 每個可用區一個 — 讓 RF=3 在每個 zone 各放一份,zone 故障不丟資料。

  • 3 個 StatefulSets:ingester-zone-a/b/c · pod anti-affinity
  • 每個 pod 一個 PVC 放 WAL + head blocks(快速 SSD class)
  • 擴容:沒問題。縮容:需要小心的 ring「leaving」+ flush
  • 一次滾動一個 zone(rollout-operator)
protocolService: mimir-ingester:9095 (gRPC)
tenancy每 tenant 記憶體上限(max series)

query-frontend (K8s)

讀取路徑前端的無狀態 Deployment;搭配 query-scheduler,讓 queriers 主動拉工作而非被推。

  • Deployment ×2 · 位於 mimir-query-frontend Service 之後
  • 結果快取 → memcached-results
protocolService: mimir-query-frontend:8080

query-scheduler (K8s)

可選但建議:把佇列從 query-frontends 解耦,讓兩者獨立擴展。

  • Deployment ×2
  • 每 tenant 公平排程;queriers 連上來拉工作
protocolgRPC :9095

querier (K8s)

無狀態的 PromQL 工作者。讀取密集的叢集要自動擴展的就是它。

  • Deployment · 依 scheduler 佇列深度或 CPU HPA
  • 無卷;儀表板負載下數秒內從 2 擴到 20
protocolpulls from query-scheduler

store-gateway (K8s)

與 ingesters 一樣是 zone-aware StatefulSets — blocks 跨 zone 分片 + 複製,確保查詢可用性。

  • 每 zone 一個 StatefulSet · PVC 快取延遲載入的 index headers
  • 重啟成本尚可但會重新同步 block index → PVC 讓它保持暖機
protocolgRPC :9095 · reads mimir-blocks bucket

compactor (K8s)

單例式 StatefulSet,配一個暫存 PVC 用來下載與合併 blocks。不在查詢或寫入路徑上 — 可安全重啟。

  • StatefulSet ×1(大規模時可依 tenant 分片)
  • PVC 暫存空間 ≈ 最大 tenant 的 block 集合
  • 落後 → 查詢變慢(太多小 blocks)
protocolreads/writes mimir-blocks bucket

ruler (K8s)

評估 rule groups 的 Deployment,透過 ring 在副本間分片。

  • Deployment ×2 · rules 依 tenant 存在物件儲存
  • 遠端評估模式:把 PromQL 送到 query-frontend
protocolnotify → alertmanager :8080

alertmanager (K8s)

Mimir 的多租戶 Alertmanager:StatefulSet ×3 加 gossip 複製,silences 與通知狀態在 pod 遺失後仍存活。

  • StatefulSet ×3 · PVC 放 silences + nflog
  • 每 tenant 的 Alertmanager 設定存在 bucket
protocol:8080 UI/API · gossip :9094
tenancy每 tenant 隔離的設定與路由

memcached 快取

四個獨立的快取池,一個熱快取不會擠掉另一個的項目。讀取延遲最大的單一改善。

  • chunks-cache:原始 chunk 資料(最大,GB 級)
  • index-cache:block index 查找
  • results-cache:整個 PromQL 回應(query-frontend)
  • metadata-cache:bucket 列表 + block metas
protocolmemcached :11211 · one StatefulSet each

hash ring · memberlist

元件如何找到彼此並分工:每個 pod 透過 memberlist gossip ring 成員資訊 — 不需要營運 etcd 或 Consul。

  • 所有 ring 成員之間在 :7946 gossip
  • Distributors 用它為每個 series 挑 3 個 ingesters(zone-aware)
  • Store-gateways/compactors/rulers 用同一機制分片 blocks + rules
  • Pod 掛掉 → ring 經 gossip 察覺 → 流量重新路由
protocolmemberlist gossip :7946