Моніторинг — це важлива частина роботи, і ви, мабуть, вже переконалися, наскільки потужним є Prometheus для збору метрик. Але якщо ви намагалися масштабувати його для більших навантажень або через кілька кластерів, можливо, ви зіткнулися з деякими труднощами (особливо з тією проблемою з блокуванням одного PVC). Ось тут і вступає в гру Thanos!
У цій статті ми:
- Почнемо з базового, не масштабованого сервера Prometheus, використовуючи його офіційну Helm Chart.
- Показуватимемо, як додати збереження даних і налаштувати його для хмарних провайдерів.
- Розглянемо, чому «ванільний» Prometheus не можна просто масштабувати.
- Ознайомимося з Thanos.
- Налаштуємо компоненти Thanos (sidecar, store gateway, compactor, query, та query-frontend).
- Додамо автоскейлінг (HPA), щоб зручно масштабувати кластер вгору або вниз залежно від використання CPU/пам’яті.
- Огорнемо все в код Terraform для відтворюваної інфраструктури.
Зробіть собі напій, зручніше сядьте і почнемо!
1. Простий спосіб розгорнути Prometheus
Розпочнемо з малого. За допомогою Terraform ви можете розгорнути офіційну Helm Chart для Prometheus всього за кілька рядків коду:
resource "kubernetes_namespace" "prometheus" {
metadata {
name = "prometheus"
}
}
resource "helm_release" "prometheus" {
depends_on = [kubernetes_namespace.prometheus]
name = "prometheus"
namespace = kubernetes_namespace.prometheus.metadata[0].name
chart = "prometheus"
repository = "https://prometheus-community.github.io/helm-charts"
version = "26.0.1"
}
І все! Справді — це так просто, щоб розгорнути робочий Prometheus. Після розгортання ви можете вказати Grafana на:
http://prometheus-server.prometheus.svc.cluster.local:9090
або
http://prometheus-server.prometheus.svc.cluster.local:80
в залежності від вашої конфігурації. (Загальна схема: http://[SERVICE_NAME].[K8S_NAMESPACE].svc.cluster.local:[SERVICE_PORT]
.)
Збереження даних
За замовчуванням, Helm Chart розгортає два PersistentVolumeClaims (PVC): один для сервера Prometheus і один для Alertmanager. Якщо ви використовуєте хмарного провайдера, такого як AKS (Azure Kubernetes Service), вам, ймовірно, потрібно буде вказати класи збереження (наприклад, managed-premium
для SSD) та розміри. Наприклад:
resource "helm_release" "prometheus" {
depends_on = [kubernetes_namespace.prometheus]
name = "prometheus"
namespace = kubernetes_namespace.prometheus.metadata[0].name
chart = "prometheus"
repository = "https://prometheus-community.github.io/helm-charts"
version = "26.0.1"
values = [
<
Якщо ви використовуєте інший хмарний провайдер або працюєте в локальній інфраструктурі, просто змініть `storageClass` на той, що підходить вашій інфраструктурі.
**Розміщення Pods Prometheus на конкретних вузлах**
Потрібно запускати Prometheus на спеціальному пулі вузлів або на спотових вузлах? Додайте толерантності та nodeSelector:
resource "helm_release" "prometheus" {
dependson = [kubernetesnamespace.prometheus]
name = "prometheus"
namespace = kubernetes_namespace.prometheus.metadata[0].name
chart = "prometheus"
repository = "https://prometheus-community.github.io/helm-charts"
version = "26.0.1"
values = [
< values.yaml
```
- Перегляньте значення на Artifact Hub (наприклад, ця сторінка для Prometheus).
Після розгортання ви отримаєте такі ресурси:
deployment.apps/prometheus-kube-state-metrics
Збирає метрики на рівні кластера з експортера kube-state-metrics.deployment.apps/prometheus-prometheus-pushgateway
Push gateway для епімерних завдань (наприклад, пакетних скриптів), які не можна безпосередньо зібрати.deployment.apps/prometheus-server
Сам сервер Prometheus.statefulset.apps/prometheus-alertmanager
Обробляє сповіщення та маршрутує їх (наприклад, електронною поштою, через Slack).daemonset.apps/prometheus-prometheus-node-exporter
Експонує метрики хоста для всіх вузлів вашого кластера.
І відповідні їм сервіси (наприклад, service/prometheus-server
, service/prometheus-alertmanager
тощо).
Чи готово це до виробничого використання?
Так — якщо ваші потреби в моніторингу невеликі. Але якщо ви хочете масштабувати Prometheus (тобто, кілька реплік), ви швидко зіткнетеся з проблемою: один PVC, заблокований одним екземпляром Prometheus. Не можна просто розгорнути кілька Pods сервера Prometheus з одним і тим самим TSDB.
Чому Prometheus не може просто реплікуватися?
Локальна TSDB (база даних часових рядів) у Prometheus не призначена для одночасного доступу кількох записувачів. Якщо ви спробуєте запустити кілька реплік, вказуючи один і той самий PVC, ви побачите помилки блокування і падіння Pods.
Ви могли б розглянути варіант «керованого» Prometheus від вашого хмарного провайдера, але це може означати додаткові витрати на те, що ви можете обробити самостійно, якщо вже маєте кластер. Тут на допомогу приходить Thanos…
2. Ознайомлення з Thanos
Існує кілька відкритих проектів (Thanos, Cortex, Mimir тощо), які вирішують проблему масштабування Prometheus. Вони дозволяють вам:
- Масштабувати вузли запитів горизонтально для кращої продуктивності.
- Агрегувати кілька серверів Prometheus (через різні кластери або середовища).
- Вивантажувати старі блоки в дешеве об'єктне збереження (Amazon S3, Azure Blob, GCS тощо).
Thanos проти Mimir (колишній Cortex)
Ці проекти мають схожі цілі, але різняться в підходах до збору даних (sidecar проти remote_write), складності архітектури, функціях мульти-орендності тощо. Thanos часто є простішим для поетапного впровадження (особливо якщо ви вже працюєте з Prometheus).
Так, Thanos названий на честь того самого Thanos з «Месників». Але ми зробимо щось набагато дружелюбніше, ніж «щелчок», що стирає половину вашої інфраструктури з існування.
3.
Огляд архітектури Thanos
Архітектура Thanos виглядає зазвичай так:
+----------+
| Grafana |
+----+-----+
|
v
+--------------+
| Thanos Query | <--> +----------------------+
| + Query FE | | Thanos Store Gateway |
+--------------+ +----------------------+
^ ^
| (gRPC) | (gRPC)
| |
+------- +-----+ ------+
( Для реальних метрик
з sidecar )
|
v
+------------------------+
| Prometheus + Sidecar |
+------------------------+
|
+-----> [Object Storage]
Ось швидке резюме кожного основного компонента Thanos:
- Prometheus + Sidecar: Звичайний сервер Prometheus, плюс контейнер sidecar, який завантажує 2-годинні "блоки" в об'єктне сховище та відповідає на gRPC запити щодо останніх даних.
- Thanos Store Gateway: Читає історичні блоки безпосередньо з об'єктного сховища, що дозволяє довгострокове збереження. Він безстаневий і може бути масштабований (кожен шлюз може кешувати дані).
- Thanos Query: Сервіс, який агрегує дані з кількох сховищ/sidecar. Це нова "сумісна з Prometheus" точка доступу, на яку ви вкажете Grafana.
- Query Frontend: (Необов'язкове, але рекомендоване, якщо у вас є важкі запити.) Він розбиває великі запити на менші, кешує результати та розподіляє навантаження між кількома Pods Thanos Query.
- Thanos Compactor: Періодично об'єднує менші блоки в більші, зменшуючи обсяг збереження та покращуючи продуктивність запитів.
4. Налаштування об'єктного сховища
Thanos потребує місце для завантаження блоків Prometheus (кожні 2 години за замовчуванням). Це може бути:
- Azure Storage Account (як у наших прикладах)
- Amazon S3
- Google Cloud Storage
- OpenStack Swift
- Або будь-яке сховище, сумісне з S3
Нижче наведено приклад створення приватного облікового запису Azure Storage (з приватним кінцевим пунктом, щоб він не був доступний публічно) і контейнера для Thanos. (Так, ми йдемо в деталі, але це частина подорожі!)
resource "azurerm_resource_group" "prometheus" {
location = var.location
name = "using-system-prom"
}
resource "azurerm_storage_account" "prometheus_thanos" {
depends_on = [azurerm_resource_group.prometheus]
name = "using-system-thanos"
resource_group_name = azurerm_resource_group.prometheus.name
location = "westeurope"
account_kind = "StorageV2"
account_tier = "Standard"
account_replication_type = "GRS"
https_traffic_only_enabled = true
min_tls_version = "TLS1_2"
shared_access_key_enabled = true
public_network_access_enabled = false
allow_nested_items_to_be_public = false
blob_properties {
delete_retention_policy {
days = 7
}
}
}
data "azurerm_subnet" "resources" {
name = "ResourcesSubnet"
virtual_network_name = "using-system-vnet"
resource_group_name = "using-system-vnet"
}
data "azurerm_private_dns_zone" "blob" {
name = "privatelink.blob.core.windows.net"
}
resource "azurerm_private_endpoint" "prometheus_thanos" {
name = "promthanospep"
location = "westeurope"
resource_group_name = azurerm_resource_group.prometheus.name
subnet_id = data.azurerm_subnet.resources.id
private_dns_zone_group {
name = "promthanospep-dzg"
private_dns_zone_ids = [data.azurerm_private_dns_zone.blob.id]
}
private_service_connection {
name = "promthanospep-cnx"
private_connection_resource_id = azurerm_storage_account.prometheus_thanos.id
subresource_names = ["blob"]
is_manual_connection = false
}
}
resource "azurerm_storage_container" "prometheus_thanos" {
name = "thanos"
storage_account_id = azurerm_storage_account.prometheus_thanos.id
container_access_type = "private"
}
Для AWS, GCP або OpenStack просто змініть визначення ресурсів відповідно.
5. Створення секрету об'єктного сховища для Thanos в K8s
Наступним кроком створимо Kubernetes секрет, що містить налаштування об'єктного сховища.
Це буде використовуватись як контейнером sidecar (Sidecar) для Thanos в Prometheus, так і іншими компонентами Thanos:
resource "kubernetes_secret" "prometheus_thanos_objstore" {
depends_on = [kubernetes_namespace.prometheus, azurerm_storage_container.prometheus_thanos]
metadata {
name = "thanos-objstore-secret"
namespace = kubernetes_namespace.prometheus.metadata[0].name
}
data = {
"objstore.yml" = templatefile("${path.module}/templates/thanos-objstore.tpl", {
container_name = azurerm_storage_container.prometheus_thanos.name
account_name = azurerm_storage_account.prometheus_thanos.name
account_key = azurerm_storage_account.prometheus_thanos.primary_access_key
})
}
}
Де thanos-objstore.tpl
може виглядати так:
type: AZURE
config:
container: "${container_name}"
storage_account: "${account_name}"
storage_account_key: "${account_key}"
endpoint: "blob.core.windows.net"
Документацію по налаштуванню сховищ Thanos дивіться в Thanos Storage Docs для інших провайдерів (S3, GCS тощо). Також переконайтесь, що ваш Kubernetes кластер має дозволи на читання/запис в сховище (наприклад, надайте роль Storage Blob Data Contributor
вашій ідентичності в AKS):
data "azurerm_user_assigned_identity" "aks" {
name = "aks-identity"
resource_group_name = "using-system-aks"
}
resource "azurerm_role_assignment" "prometheus_thanos_objstore" {
scope = azurerm_storage_account.prometheus_thanos.id
role_definition_name = "Storage Blob Data Contributor"
principal_id = data.azurerm_user_assigned_identity.aks.principal_id
}
6. Додавання контейнера sidecar до Prometheus
Тепер ми можемо змонтувати контейнер sidecar в той самий pod, що і Prometheus. Цей контейнер sidecar виконує дві основні функції:
- Завантажує блоки TSDB в об'єктне сховище кожні 2 години.
2.
Відкриває gRPC точку доступу для "живих" запитів.
Ось фрагмент Terraform:
resource "helm_release" "prometheus" {
depends_on = [kubernetes_secret.prometheus_thanos_objstore, azurerm_role_assignment.prometheus_thanos_objstore]
name = "prometheus"
namespace = kubernetes_namespace.prometheus.metadata[0].name
chart = "prometheus"
repository = "https://prometheus-community.github.io/helm-charts"
version = "26.0.1"
values = [
<resource "helm_release" "prometheus" {
depends_on = [kubernetes_secret.prometheus_thanos_objstore, azurerm_role_assignment.prometheus_thanos_objstore]
name = "prometheus"
namespace = kubernetes_namespace.prometheus.metadata[0].name
chart = "prometheus"
repository = "https://prometheus-community.github.io/helm-charts"
version = "26.0.1"
values = [
< values.yaml
Ми також можемо зробити це через Helm, але використовуючи чарт від Bitnami (OCI реєстр):
locals {
prometheusserverservice = "prometheus-server.${kubernetesnamespace.prometheus.metadata.0.name}.svc.cluster.local"
thanosstoreservice = "thanos-storegateway.${kubernetesnamespace.prometheus.metadata.0.name}.svc.cluster.local"
}
resource "helm_release" "thanos" {
dependson = [helmrelease.prometheus]
name = "thanos"
namespace = kubernetes_namespace.prometheus.metadata[0].name
chart = "thanos"
repository = "oci://registry-1.docker.io/bitnamicharts"
version = "15.9.2"
values = [
<values.yaml
Запуск двох екземплярів може призвести до зіткнень і пошкодження даних.
- Якщо у вас дуже велика інфраструктура, подумайте про використання компактора з поділом (просунута тема) з чітко визначеним шардінгом.
9. Налаштування автоскейлінгу з HPA
Жорстке вказування replicaCount: 3
є хорошою відправною точкою. Але для реальної ефективності можна налаштувати Горизонтальний Автоскейлер Подів (HPA) для масштабування вгору або вниз залежно від використання процесора чи пам'яті. Зазвичай рекомендується керувати HPAs поза основним Helm релізом, щоб мати можливість версіонувати його окремо.
Ось приклад:
resource "kubernetes_horizontal_pod_autoscaler_v2" "thanos_hpa" {
depends_on = [helm_release.thanos]
for_each = { for comp in [
{ name = "thanos-query", kind = "Deployment" },
{ name = "thanos-storegateway", kind = "StatefulSet" },
{ name = "thanos-query-frontend", kind = "Deployment" }
] : comp.name => comp }
metadata {
name = "hpa-${each.value.name}"
namespace = kubernetes_namespace.prometheus.metadata[0].name
}
spec {
scale_target_ref {
api_version = "apps/v1"
kind = each.value.kind
name = each.value.name
}
min_replicas = 3
max_replicas = 8
metric {
type = "Resource"
resource {
name = "cpu"
target {
type = "Utilization"
average_utilization = 80
}
}
}
metric {
type = "Resource"
resource {
name = "memory"
target {
type = "Utilization"
average_utilization = 80
}
}
}
}
}
Зверніть увагу, що Thanos Query та Thanos Query Frontend є “Deployments” (розгортаннями), в той час як Thanos Store Gateway зазвичай є “StatefulSet” (станним набором), тому ми налаштовуємо HPA відповідно.
10. Тестування та оновлення Grafana
Після того, як ви розгорнули все, перевірте, що:
- Логи
thanos-query
показують такі рядки:
msg="adding new store..." address=XXX.XXX.XXX.XXX:10901 extLset="..."
msg="adding new sidecar..."
- Ви можете побачити свої sidecar-и та store gateway у Thanos Query UI (якщо ви його відкрили).
- У вашому об'єктному сховищі все виглядає нормально (файли завантажуються кожні 2 години).
Останнім кроком, змініть джерело даних Prometheus у Grafana на Thanos Query замість початкового Prometheus сервера:
http://thanos-query.prometheus.svc.cluster.local:9090
(http://[SERVICE_NAME].[K8S_NAMESPACE].svc.cluster.local:[SERVICE_PORT]
), так що Grafana буде запитувати агрегований Thanos endpoint. Оскільки Thanos Query сумісний з PromQL, ви можете зберегти свої існуючі дашборди — змін не потрібно!
11. Повний код Terraform
Нижче наведено фінальний приклад фрагмента для загального уявлення.
Це зв'язує все разом: провайдери, групи ресурсів, облікові записи зберігання, секрети, призначення ролей, Helm релізи тощо.
backend.tf
terraform {
required_version = ">= 0.13"
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "=4.14.0"
}
azuread = {
source = "hashicorp/azuread"
version = "=3.0.2"
}
kubernetes = {
source = "hashicorp/kubernetes"
version = "=2.35.1"
}
helm = {
source = "hashicorp/helm"
version = "2.17.0"
}
local = {
source = "hashicorp/local"
version = "=2.5.2"
}
}
}
provider "azurerm" {
subscription_id = var.azure_subscription_id
tenant_id = var.azure_tenant_id
}
provider "azuread" {
tenant_id = var.azure_tenant_id
}
provider "kubernetes" {
config_path = "~/.kube/config"
}
provider "helm" {
kubernetes {
config_path = "~/.kube/config"
}
}
variables.tf
variable "azure_subscription_id" {
description = "Azure Subscription ID"
}
variable "azure_tenant_id" {
description = "Azure Tenant ID"
}
variable "location" {
description = "Azure Location name"
default = "westeurope"
}
variable "location_short_name" {
description = "Azure Location short name"
default = "we"
}
variable "env" {
description = "Environment name"
}
variable "tags" {
description = "The default tags to associate with resources."
type = map(string)
}
variable "aks_resource_group_name" {
description = "The name of the resource group containing the AKS cluster"
}
variable "prometheus_helmchart_version" {
description = "Prometheus Helm Chart Version"
default = "26.0.1"
}
variable "thanos_helmchart_version" {
description = "TJ Helm Chart Version"
default = "15.9.2"
}
variable "thanos_sidecar_image" {
description = "Thanos Sidecar Image"
default = "quay.io/thanos/thanos:v0.37.2"
}
variable "grafana_helmchart_version" {
description = "Grafana Helm Chart Version"
default = "8.8.2"
}
data.tf
data "azurerm_client_config" "current" {
}
data "azurerm_subnet" "resources" {
name = "ResourcesSubnet"
virtual_network_name = local.spoke_vnet_name
resource_group_name = "using-system-vnet"
}
data "azurerm_private_dns_zone" "blob" {
name = "privatelink.blob.core.windows.net"
}
data "azurerm_user_assigned_identity" "aks" {
name = "aks-identity"
resource_group_name = "using-system-aks"
}
main.tf
locals {
prometheus_server_service = "prometheus-server.${kubernetes_namespace.prometheus.metadata.0.name}.svc.cluster.local"
thanos_store_service = "thanos-storegateway.${kubernetes_namespace.prometheus.metadata.0.name}.svc.cluster.local"
}
resource "azurerm_resource_group" "prometheus" {
location = var.location
name = "using-system-prom"
tags = var.tags
}
resource "kubernetes_namespace" "prometheus" {
metadata {
name = "prometheus"
}
}
resource "azurerm_user_assigned_identity" "prometheus" {
location = var.location
name = "prometheus-identity"
resource_group_name = azurerm_resource_group.prometheus.name
tags = var.tags
}
resource "azurerm_storage_account" "prometheus_thanos" {
depends_on = [azurerm_resource_group.prometheus]
name = "${module.convention.resource_name_without_delimiter}thanos"
resource_group_name = azurerm_resource_group.prometheus.name
location = var.location
account_kind = "StorageV2"
account_tier = "Standard"
account_replication_type = "GRS"
https_traffic_only_enabled = true
min_tls_version = "TLS1_2"
shared_access_key_enabled = true
public_network_access_enabled = false
allow_nested_items_to_be_public = false
blob_properties {
delete_retention_policy {
days = 7
}
}
identity {
type = "UserAssigned"
identity_ids = [azurerm_user_assigned_identity.prometheus.id]
}
}
tags = var.tags
}
resource "azurerm_private_endpoint" "prometheus_thanos" {
name = "promthanospep"
location = var.location
resource_group_name = azurerm_resource_group.prometheus.name
subnet_id = data.azurerm_subnet.resources.id
private_dns_zone_group {
name = "promthanospep-dzg"
private_dns_zone_ids = [data.azurerm_private_dns_zone.blob.id]
}
private_service_connection {
name = "promthanospep-cnx"
private_connection_resource_id = azurerm_storage_account.prometheus_thanos.id
subresource_names = ["blob"]
is_manual_connection = false
}
tags = var.tags
}
resource "time_sleep" "wait_30_seconds_after_thanos_pep" {
depends_on = [azurerm_private_endpoint.prometheus_thanos]
create_duration = "30s"
}
resource "azurerm_storage_container" "prometheus_thanos" {
depends_on = [time_sleep.wait_30_seconds_after_thanos_pep]
name = "thanos"
storage_account_id = azurerm_storage_account.prometheus_thanos.id
container_access_type = "private"
}
resource "kubernetes_secret" "prometheus_thanos_objstore" {
depends_on = [kubernetes_namespace.prometheus, azurerm_storage_container.prometheus_thanos]
metadata {
name = "thanos-objstore-secret"
namespace = kubernetes_namespace.prometheus.metadata[0].name
}
data = {
"objstore.yml" = templatefile("${path.module}/templates/thanos-objstore.tpl", {
container_name = azurerm_storage_container.prometheus_thanos.name
account_name = azurerm_storage_account.prometheus_thanos.name
account_key = azurerm_storage_account.prometheus_thanos.primary_access_key
})
}
}
resource "azurerm_role_assignment" "prometheus_thanos_objstore" {
scope = azurerm_storage_account.prometheus_thanos.id
role_definition_name = "Storage Blob Data Contributor"
principal_id = data.azurerm_user_assigned_identity.aks.principal_id
}
resource "helm_release" "prometheus" {
depends_on = [kubernetes_secret.prometheus_thanos_objstore, azurerm_role_assignment.prometheus_thanos_objstore]
name = "prometheus"
namespace = kubernetes_namespace.prometheus.metadata[0].name
chart = "prometheus"
repository = "https://prometheus-community.github.io/helm-charts"
version = var.prometheus_helmchart_version
values = [
<
enabled: true
replicaCount: 1
nodeSelector:
"kubernetes.azure.com/scalesetpriority": "spot"
tolerations:
- key: "kubernetes.azure.com/scalesetpriority"
operator: "Equal"
value: "spot"
effect: "NoSchedule"
dnsDiscovery:
enabled: false
stores:
- "dns+${local.prometheus_server_service}:10901"
- "dns+${local.thanos_store_service}:10901"
queryFrontend:
enabled: true
replicaCount: 1
nodeSelector:
"kubernetes.azure.com/scalesetpriority": "spot"
tolerations:
- key: "kubernetes.azure.com/scalesetpriority"
operator: "Equal"
value: "spot"
effect: "NoSchedule"
storegateway:
enabled: true
replicaCount: 1
nodeSelector:
"kubernetes.azure.com/scalesetpriority": "spot"
tolerations:
- key: "kubernetes.azure.com/scalesetpriority"
operator: "Equal"
value: "spot"
effect: "NoSchedule"
compactor:
enabled: true
replicaCount: 1
nodeSelector:
"kubernetes.azure.com/scalesetpriority": "spot"
tolerations:
- key: "kubernetes.azure.com/scalesetpriority"
operator: "Equal"
value: "spot"
effect: "NoSchedule"
EOF
]
}
resource "kubernetes_horizontal_pod_autoscaler_v2" "thanos_hpa" {
depends_on = [helm_release.thanos]
for_each = { for comp in [
{ name = "thanos-query", kind = "Deployment" },
{ name = "thanos-storegateway", kind = "StatefulSet" },
{ name = "thanos-query-frontend", kind = "Deployment" }
] : comp.name => comp }
metadata {
name = "hpa-${each.value.name}"
namespace = kubernetes_namespace.prometheus.metadata[0].name
}
spec {
scale_target_ref {
api_version = "apps/v1"
kind = each.value.kind
name = each.value.name
}
min_replicas = 3
max_replicas = 8
metric {
type = "Resource"
resource {
name = "cpu"
target {
type = "Utilization"
average_utilization = 80
}
}
}
metric {
type = "Resource"
resource {
name = "memory"
target {
type = "Utilization"
average_utilization = 80
}
}
}
}
}
Висновок
Ось і все: повний, масштабований набір для Prometheus з Thanos за допомогою Terraform.
Підключивши Thanos:
- Ви уникнете обмеження одного вузла локальної TSDB.
- Ви зможете безперешкодно агрегувати кілька інстансів Prometheus через кластери.
- Ви зможете масштабувати запити та шлюзи зберігання для обробки більшого навантаження.
- Ви зможете зберігати дані в довгостроковій перспективі в дешевому об'єктному сховищі.
- Ви збережете підтримку PromQL через єдиний кінцевий точку запиту для Grafana.
Незалежно від того, чи ви на Azure, AWS, GCP або у вашій власній інфраструктурі, підхід здебільшого однаковий. Найбільші відмінності зазвичай полягають у тому, як ви визначаєте ресурси для зберігання.
Спробуйте це у вашому середовищі. Як тільки ви побачите, як плавно Thanos масштабується горизонтально, ви більше не захочете повертатися назад!
Дякуємо за прочитання, та удачі в масштабуванні!
Додаткові посилання та ресурси:
- Prometheus Helm Chart на ArtifactHub
- Документація щодо налаштування зберігання для Thanos
- Репозиторій Thanos на GitHub
Веселої роботи, і нехай ваші метрики завжди ростуть вгору і праворуч!
Перекладено з: How to Deploy a Scalable Prometheus with Thanos on K8s Using Terraform