L’opérateur expose des métriques compatibles avec Prometheus et des probes de santé Kubernetes, afin que vous puissiez observer son activité de réconciliation, détecter les controllers bloqués et déclencher des alertes en cas d’échec.
Ce guide présente ce que l’opérateur expose, comment le scraper et quelles requêtes sont utiles au quotidien.
Points de terminaison
Le processus de l’opérateur expose deux points de terminaison HTTP dans le pod du manager :
| Point de terminaison | Port par défaut | Chemin | Objectif |
|---|---|---|---|
| Métriques | 8080 (Helm) / 0 désactivé (par défaut du binaire) |
/metrics |
Format d’exposition Prometheus |
| Sonde de santé | 8081 |
/healthz, /readyz |
Sondes Kubernetes de liveness et de readiness |
Le point de terminaison des métriques est désactivé par défaut lorsque le binaire de l’opérateur est exécuté directement (--metrics-bind-address=0). Le chart Helm l’active avec metrics.enable: true et metrics.port: 8080.
Le point de terminaison de la sonde de santé est toujours activé ; le template de déploiement relie /healthz et /readyz aux sondes de liveness et de readiness du pod sur le port 8081.
Options du binaire de l’opérateur
Les options manager pertinentes (définies dans cmd/main.go) :
| Option | Par défaut | Description |
|---|---|---|
--metrics-bind-address |
0 (désactivé) |
Adresse de liaison du point de terminaison des métriques. Définissez-la sur :8443 pour HTTPS ou :8080 pour HTTP. Laissez-la à 0 pour désactiver le serveur de métriques. |
--metrics-secure |
true |
Expose les métriques en HTTPS avec authn/authz. Définissez-la sur false pour du HTTP simple. |
--metrics-cert-path |
vide | Répertoire contenant les fichiers de certificat TLS (tls.crt, tls.key) du serveur de métriques. |
--metrics-cert-name |
tls.crt |
Nom du fichier de certificat dans --metrics-cert-path. |
--metrics-cert-key |
tls.key |
Nom du fichier de clé dans --metrics-cert-path. |
--enable-http2 |
false |
Active HTTP/2 pour les serveurs de métriques et de webhook. Désactivé par défaut afin d’atténuer CVE-2023-44487 / CVE-2023-39325. |
--leader-elect |
false (binaire) / true (chart Helm) |
Active l’élection de leader afin qu’une seule réplique effectue la réconciliation à la fois. Le chart Helm définit cette option dans manager.args par défaut. |
--health-probe-bind-address |
:8081 |
Adresse de liaison pour /healthz et /readyz. |
Activer les métriques via Helm
Le chart crée déjà un Service pour le port des métriques et, si besoin, un ServiceMonitor pour prometheus-operator.
Le point de terminaison des métriques est lui-même activé par défaut (metrics.enable: true, port 8080, exposé en HTTPS via metrics.secure: true). Le seul paramètre que vous devez généralement modifier est prometheus.enable pour que le chart crée un ServiceMonitor pour vous :
# values.yaml — minimal override
prometheus:
enable: trueSi vous n'utilisez pas cert-manager, définissez également certManager.enable: false et le ServiceMonitor collectera les métriques avec insecureSkipVerify: true, en s'appuyant uniquement sur l'authentification par bearer token.
L'ensemble complet des valeurs par défaut liées aux métriques est :
metrics:
enable: true
port: 8080
secure: true # HTTPS with authn/authz enforced on every scrape
certManager:
enable: true # Issues the metrics server certificate
prometheus:
enable: false # Set to true to render the ServiceMonitor
scraping_annotations: false # Alternative: prometheus.io/scrape pod annotationsAppliquer :
helm upgrade --install clickhouse-operator \
oci://ghcr.io/clickhouse/clickhouse-operator-helm \
-n clickhouse-operator-system --create-namespace \
-f values.yamlAprès l'installation, le chart crée :
Service/<resource-prefix>-metrics-service— expose le port8080(HTTPS lorsquemetrics.secure: true).ServiceMonitor/<resource-prefix>-controller-manager-metrics-monitor— lorsqueprometheus.enable: true.ClusterRole/<resource-prefix>-metrics-reader— URL non liée à une ressource/metricsavec le verbeget.
Sécurisation du point de terminaison des métriques
Lorsque metrics.secure: true, le serveur de métriques impose TLS et l’authentification/l’autorisation Kubernetes pour chaque collecte. Les scrapers doivent :
- Présenter un Bearer token Kubernetes valide.
- Appartenir à un ServiceAccount lié à un rôle de cluster accordant
getsur l’URL hors ressource/metrics.
Le chart fournit un tel rôle de cluster :
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: clickhouse-operator-metrics-reader
rules:
- nonResourceURLs:
- /metrics
verbs:
- getAssociez-le au ServiceAccount utilisé par votre scraper (généralement Prometheus) :
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: prometheus-clickhouse-operator-metrics-reader
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: clickhouse-operator-metrics-reader
subjects:
- kind: ServiceAccount
name: <prometheus-sa>
namespace: <prometheus-namespace>Référence du ServiceMonitor
Le chart génère un ServiceMonitor de cette forme lorsque prometheus.enable: true :
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: <release>-controller-manager-metrics-monitor
namespace: <operator-namespace>
labels:
control-plane: controller-manager
spec:
selector:
matchLabels:
control-plane: controller-manager
endpoints:
- path: /metrics
port: https # "http" when metrics.secure: false
scheme: https
bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
tlsConfig:
serverName: <release>-metrics-service.<operator-namespace>.svc
ca:
secret:
name: metrics-server-cert
key: ca.crt
cert:
secret:
name: metrics-server-cert
key: tls.crt
keySecret:
name: metrics-server-cert
key: tls.keySi votre instance Prometheus n’exécute pas cert-manager, définissez tlsConfig.insecureSkipVerify: true et utilisez uniquement l’authentification par jeton porteur — le chart le fait déjà lorsque certManager.enable: false.
Exemple Prometheus autonome
Si vous n'utilisez pas kube-prometheus-stack, le dépôt inclut un exemple autonome dans examples/prometheus_secure_metrics_scraper.yaml. Il crée un ServiceAccount, les objets RBAC nécessaires, ainsi qu'une ressource personnalisée Prometheus qui sélectionne le ServiceMonitor de l'opérateur.
Points de terminaison des sondes de santé
| Path | Utilisé par | Renvoye |
|---|---|---|
/healthz |
Sonde de liveness Kubernetes | 200 OK tant que le serveur de sondes est à l’écoute. |
/readyz |
Sonde de readiness Kubernetes | 200 OK tant que le serveur de sondes est à l’écoute. |
Les deux points de terminaison sont enregistrés avec la même vérification Ping triviale (healthz.Ping de sigs.k8s.io/controller-runtime). Une sonde en échec signifie donc "le processus manager ne sert pas HTTP sur :8081" — et non "les contrôleurs sont défaillants". Pour détecter les problèmes au niveau des contrôleurs, utilisez plutôt les métriques de réconciliation.
Les deux points de terminaison sont exposés sur le port 8081 par défaut. Ils sont connectés au déploiement comme suit :
livenessProbe:
httpGet:
path: /healthz
port: 8081
initialDelaySeconds: 15
periodSeconds: 20
readinessProbe:
httpGet:
path: /readyz
port: 8081
initialDelaySeconds: 5
periodSeconds: 10Une probe qui échoue de manière répétée signifie généralement que le serveur de la probe lui-même n’a jamais démarré — par exemple, le manager s’est arrêté prématurément au démarrage. Vérifiez les logs du manager pour repérer unable to start manager, des échecs RBAC ou des erreurs cache did not sync.
Catalogue des métriques
L’opérateur n’enregistre pas de collecteurs Prometheus personnalisés. Tous les éléments ci-dessous sont exposés par les bibliothèques sous-jacentes controller-runtime et client-go. Les séries les plus utiles, regroupées par fonction :
Activité de réconciliation
| Métrique | Type | Labels |
|---|---|---|
controller_runtime_reconcile_total |
counter | controller, result (success / error / requeue / requeue_after) |
controller_runtime_reconcile_errors_total |
counter | controller |
controller_runtime_reconcile_time_seconds_bucket |
histogram | controller |
controller_runtime_active_workers |
gauge | controller |
controller_runtime_max_concurrent_reconciles |
gauge | controller |
Le label controller est dérivé par controller-runtime à partir du type de ressource enregistré avec For(...). Avec le code actuel dans internal/controller/clickhouse et internal/controller/keeper, cela correspond respectivement à clickhousecluster et keepercluster. Si vous avez personnalisé l'opérateur, vérifiez-le en effectuant un scrape ponctuel de /metrics.
File d’attente de travail
| Métrique | Type | Labels |
|---|---|---|
workqueue_depth |
gauge | name, controller, priority |
workqueue_adds_total |
counter | name, controller |
workqueue_retries_total |
counter | name, controller |
workqueue_unfinished_work_seconds |
gauge | name, controller |
workqueue_longest_running_processor_seconds |
gauge | name, controller |
workqueue_queue_duration_seconds_bucket |
histogram | name, controller |
workqueue_work_duration_seconds_bucket |
histogram | name, controller |
Les labels name et controller ont la même valeur (le nom du contrôleur).
Trafic du serveur API
| Métrique | Type | Labels |
|---|---|---|
rest_client_requests_total |
compteur | code, method, host |
Élection du leader
| Métrique | Type | Labels |
|---|---|---|
leader_election_master_status |
gauge | name (= d4ceba06.clickhouse.com) |
Le chart Helm active --leader-elect par défaut ; cette métrique est donc présente dans les installations Helm standard. Lorsque le binaire est exécuté directement sans ce flag, la métrique n'est pas présente.
Runtime
Collecteurs standard du processus Go et du runtime — go_goroutines, go_memstats_*, process_cpu_seconds_total, process_resident_memory_bytes, etc.
Requêtes PromQL utiles
Vue d’ensemble de l’état de santé
# Reconciliation rate per controller
sum by (controller) (rate(controller_runtime_reconcile_total[5m]))
# Error rate per controller (alert if > 0 sustained)
sum by (controller) (rate(controller_runtime_reconcile_errors_total[5m]))
# p99 reconcile latency
histogram_quantile(
0.99,
sum by (le, controller) (rate(controller_runtime_reconcile_time_seconds_bucket[5m]))
)Détection de l’engorgement
# Pending items in the work queue — a sustained value > 0 indicates a backlog,
# but short spikes during large reconciles are normal.
avg_over_time(workqueue_depth[10m])
# Reconciles that have been running for a long time
workqueue_longest_running_processor_seconds > 60Limitation du débit et charge sur l’API
# Throttled requests to the API server
sum by (code, host) (rate(rest_client_requests_total{code=~"4..|5.."}[5m]))Statut du leader (déploiement HA)
# Should be exactly 1 across the replica set (Helm install enables --leader-elect by default)
sum(leader_election_master_status{name="d4ceba06.clickhouse.com"})Alertes suggérées
Point de départ pour une PrometheusRule (adaptez les seuils à votre environnement) :
groups:
- name: clickhouse-operator
rules:
- alert: ClickHouseOperatorReconcileErrors
# > 0.1 errors/s sustained = > ~6 errors/min, filters transient conflicts.
expr: sum by (controller) (rate(controller_runtime_reconcile_errors_total[5m])) > 0.1
for: 15m
labels:
severity: warning
annotations:
summary: 'ClickHouse operator is failing to reconcile {{ $labels.controller }}'
- alert: ClickHouseOperatorWorkqueueBacklog
# avg_over_time avoids alerting on transient bursts during large reconciles.
expr: avg_over_time(workqueue_depth[10m]) > 5
for: 30m
labels:
severity: warning
annotations:
summary: 'Operator work queue backlog sustained for 30m'
- alert: ClickHouseOperatorReconcileSlow
expr: |
histogram_quantile(
0.99,
sum by (le, controller) (rate(controller_runtime_reconcile_time_seconds_bucket[10m]))
) > 30
for: 15m
labels:
severity: warning
annotations:
summary: 'p99 reconcile latency for {{ $labels.controller }} > 30s'
- alert: ClickHouseOperatorNoLeader
expr: absent(leader_election_master_status{name="d4ceba06.clickhouse.com"}) == 1
for: 5m
labels:
severity: critical
annotations:
summary: 'No leader for the ClickHouse operator (HA deployment)'La dernière règle n’est pertinente que lorsque l’élection du leader est activée.
Vérification de l’installation
Une vérification rapide de bout en bout, en supposant que le chart a été installé dans clickhouse-operator-system :
NS=clickhouse-operator-system
# The metrics Service exists and selects the manager pod
kubectl -n $NS get svc -l control-plane=controller-manager
# The ServiceMonitor exists (only with prometheus.enable=true)
kubectl -n $NS get servicemonitor -l control-plane=controller-manager
# Manager pod is Ready (readiness probe answers)
kubectl -n $NS get pod -l control-plane=controller-manager
# Direct scrape from inside the cluster (with the metrics-reader binding)
kubectl -n $NS run curl-metrics --rm -it --restart=Never \
--image=curlimages/curl:8.10.1 -- sh -c '
TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
curl -sk -H "Authorization: Bearer $TOKEN" \
https://<release>-metrics-service.'$NS'.svc:8080/metrics \
| head -20
'Si le scrape renvoie des métriques au format d’exposition Prometheus, le point de terminaison et le RBAC sont correctement configurés.
- Installation — Valeurs Helm relatives à la supervision.
- Configuration — Configuration TLS commune au serveur de métriques.