Déployer le Collector sur Kubernetes avec Helm
Installez le chart officiel, utilisez les presets pour les logs et les métriques, et surchargez la configuration via des fichiers values.
Le chart Helm OpenTelemetry déploie le Collector en DaemonSet, en Deployment ou en StatefulSet, et génère une configuration par défaut raisonnable. Vous le personnalisez entièrement via un fichier values.yaml, ce qui en fait un choix naturel pour le GitOps. Ce guide l’installe, utilise les presets pour les besoins courants, et montre comment surcharger la configuration du Collector.
Installer
helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts
helm repo update
helm install my-opentelemetry-collector open-telemetry/opentelemetry-collector \
--namespace observability --create-namespace \
--set image.repository="otel/opentelemetry-collector-k8s" \
--set mode=daemonset
Deux paramètres sont obligatoires :
modedoit valoirdaemonset,deploymentoustatefulset. Il n’y a pas de valeur par défaut.image.repositorychoisit la distribution. La distribution Kubernetes (otel/opentelemetry-collector-k8s) inclut les composants dont les presets ont besoin. Utilisez l’image contrib si vous avez besoin de composants qui n’en font pas partie.
Épinglez le chart avec --version et l’image avec image.tag, et conservez tout dans un fichier values plutôt que dans des options --set, afin que ce soit relisible :
# values.yaml
mode: daemonset
image:
repository: otel/opentelemetry-collector-k8s
tag: "0.163.0" # épinglez une version que vous avez testée
helm install otel-agent open-telemetry/opentelemetry-collector \
-n observability --create-namespace -f values.yaml --version <chart-version>
Quel mode pour quelle tâche
daemonset: un pod par nœud. Utilisez-le pour la collecte de logs, les métriques du kubelet et les métriques d’hôte, car celles-ci n’existent que sur le nœud local.deployment: un service évolutif. Utilisez-le pour une gateway vers laquelle les applications envoient leurs données.statefulset: lorsque vous avez besoin d’un stockage ou d’une identité stables, par exemple une file d’attente persistante ou le modèle Target Allocator.- Pour les données à collecter une seule fois par cluster (métriques du cluster, événements Kubernetes), utilisez un Deployment ou un StatefulSet avec un seul réplica, sinon vous obtiendrez des doublons.
Presets
Les presets activent des configurations courantes, y compris les receivers, processors, RBAC et montages de volumes dont elles ont besoin :
# Agent : logs, métriques d'hôte et de kubelet, et métadonnées de pod sur chaque nœud
mode: daemonset
presets:
logsCollection:
enabled: true
hostMetrics:
enabled: true
kubeletMetrics:
enabled: true
kubernetesAttributes:
enabled: true
# Métriques et événements à l'échelle du cluster, une seule fois
mode: deployment
replicaCount: 1
presets:
clusterMetrics:
enabled: true
kubernetesEvents:
enabled: true
Les presets nécessitent une image de Collector qui contient leurs composants ; utilisez donc l’image Kubernetes ou contrib. Considérez-les comme un point de départ : pour des besoins inhabituels, configurez vous-même les composants ainsi que leur RBAC et leurs volumes. Toutes les options sont listées dans le values.yaml du chart.
Surcharger la configuration du Collector
La clé config est fusionnée par-dessus la configuration par défaut du Collector du chart. Ajoutez ou modifiez ce dont vous avez besoin :
mode: deployment
replicaCount: 2
config:
processors:
memory_limiter:
check_interval: 1s
limit_percentage: 80
spike_limit_percentage: 20
exporters:
otlp/tempo:
endpoint: tempo.observability.svc.cluster.local:4317
tls:
insecure: true
service:
pipelines:
traces:
receivers: [otlp]
processors: [memory_limiter, batch]
exporters: [otlp/tempo]
Règles qui piègent les gens :
- L’exporter par défaut est
debug. Remplacez-le dans chaque pipeline que vous utilisez, comme ci-dessus. - Mettre un composant par défaut à
nullle supprime :config.receivers.zipkin: null. - Les listes remplacent, elles ne fusionnent pas. Lorsque vous modifiez un pipeline, listez tous ses composants, y compris les composants par défaut que vous voulez conserver.
- Désactivez les ports inutilisés pour garder le Service propre, par exemple
ports.jaeger-compact.enabled: false. - Logs et exporter debug : si vous activez
logsCollectionavecincludeCollectorLogs: trueet gardez l’exporterdebugsur le pipeline de logs, le Collector peut lire ses propres logs et les réinjecter, provoquant une explosion de logs. Passez d’abord à un vrai exporter.
Une gateway OTLP uniquement, allégée :
config:
receivers:
jaeger: null
prometheus: null
zipkin: null
service:
pipelines:
traces:
receivers: [otlp]
exporters: [otlp/tempo]
metrics: null
logs: null
ports:
jaeger-compact:
enabled: false
jaeger-thrift:
enabled: false
jaeger-grpc:
enabled: false
zipkin:
enabled: false
Secrets et variables d’environnement
Injectez les identifiants avec des variables d’environnement et référencez-les dans la configuration du Collector avec ${env:NAME} :
extraEnvs:
- name: BACKEND_TOKEN
valueFrom:
secretKeyRef:
name: otel-backend
key: token
config:
exporters:
otlphttp/backend:
endpoint: https://otlp.backend.example.com
headers:
authorization: Bearer ${env:BACKEND_TOKEN}
Ne laissez pas le Secret en clair dans Git : chiffrez-le avec SOPS ou synchronisez-le depuis un gestionnaire de secrets.
Déployer avec Flux
Si vous utilisez Flux, le chart est une HelmRelease :
apiVersion: source.toolkit.fluxcd.io/v1
kind: HelmRepository
metadata:
name: open-telemetry
namespace: flux-system
spec:
interval: 1h
url: https://open-telemetry.github.io/opentelemetry-helm-charts
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: otel-agent
namespace: observability
spec:
interval: 10m
chart:
spec:
chart: opentelemetry-collector
version: "<chart-version>"
sourceRef:
kind: HelmRepository
name: open-telemetry
namespace: flux-system
values:
mode: daemonset
image:
repository: otel/opentelemetry-collector-k8s
presets:
kubernetesAttributes:
enabled: true
Une modification des values dans Git se déploie ensuite via Flux. La série sur Flux couvre les options de HelmRelease comme la remédiation et la détection de dérive.
Vérifier
kubectl get pods -n observability
kubectl logs -n observability daemonset/otel-agent-opentelemetry-collector | tail -n 20
kubectl port-forward -n observability svc/otel-agent-opentelemetry-collector 13133:13133 &
curl -s http://localhost:13133
Les noms des pods et des Services suivent le nom de votre release. Si un pod boucle en crash, le log nomme généralement le composant inconnu ou la clé invalide. Dans ce cas, l’image ne contient pas un composant que votre configuration référence, ou une valeur a été indentée sous la mauvaise clé.
Guides populaires
-
OpenTelemetry expliqué : SDK, OTLP et Collector Comprenez les éléments en jeu et les trois endroits où vit la configuration avant d'écrire du YAML. -
Le modèle de configuration du Collector : composants, pipelines et providers Apprenez les règles du YAML du Collector : nommage, pipelines, connectors, fusion de fichiers et variables d'environnement. -
Configurer les SDK avec les variables d'environnement OTEL_* Définissez le nom du service, les exporters, l'échantillonnage et les limites pour n'importe quel langage avec des variables standard. -
Instrumenter des applications sans modifier le code : Java, Python et Node.js Attachez des agents OpenTelemetry uniquement avec des variables d'environnement et des options de ligne de commande. -
Préparer le Collector pour la production : limites mémoire, batching et retries Configurez processors, files d'attente et stockage persistant pour que la télémétrie survive aux surcharges et aux pannes. -
Dépanner le Collector et les SDK Une checklist systématique pour quand la télémétrie n'arrive pas : exporter debug, health checks, métriques internes et erreurs courantes.