// the find
open-telemetry/opentelemetry-operator
Kubernetes Operator for OpenTelemetry Collector
The official Kubernetes operator for managing OpenTelemetry Collector deployments and auto-instrumentation injection. It handles the lifecycle of OTel Collectors as CRDs (Deployment, DaemonSet, StatefulSet, or Sidecar modes) and can inject instrumentation agents into pods via annotations for Java, Python, Node.js, .NET, Go, Apache HTTPD, and Nginx. If you're running OTel at any scale on Kubernetes, this is the canonical way to do it.
The Target Allocator is genuinely useful — it solves the hard problem of distributing Prometheus scrape targets across a horizontally-scaled Collector fleet without duplication, using consistent hashing or least-weighted strategies. Auto-instrumentation injection via pod annotations is clean; you don't touch the application at all, just annotate the namespace or pod. The operator rewrites Collector configs automatically on upgrade, so you're not manually migrating YAML between versions. OpenShift support is first-class with separate bundle manifests and cert handling via service annotations.
The operator explicitly does not validate Collector config before applying it — if your YAML is wrong, the CRD is created but the Collector pod crashes, which means broken configs surface as runtime failures rather than admission errors. Go auto-instrumentation requires privileged containers (runAsUser: 0), which is a non-starter in many hardened environments. Multi-instrumentation (multiple languages in one pod) is behind a feature flag that defaults to false, so a fairly common polyglot microservice setup needs manual opt-in to even attempt. The sidecar annotation placement gotcha (namespace vs pod, 'true' vs concrete name) has bitten enough people that it warrants a dedicated troubleshooting page, not just a note in the README.