Guide to deploy and manage OpenTelemetry Collectors on Kubernetes using the OpenTelemetry Operator, including Helm install, TLS webhook options, collector CRs, and viewing traces in Jaeger
In this guide you’ll deploy an OpenTelemetry Collector using the OpenTelemetry Operator so collectors are managed as Kubernetes-native objects (Custom Resources). The operator is required for cluster-wide auto-instrumentation and simplifies lifecycle, upgrades, and configuration of collectors.
The operator installs admission webhooks that require a TLS certificate trusted by the API server. You have three main options:
Option
Use case
Notes / link
cert-manager
Production or cluster-wide certificate management
Deploy cert-manager and set admissionWebhooks.certManager.enabled: true. See cert-manager docs: https://cert-manager.io/docs/
Operator auto-generate (recommended for demos)
Quick demos or local clusters
Let the operator generate a self-signed cert by enabling admissionWebhooks.autoGenerateCert.enabled.
Provide your own cert
Advanced / policy-controlled environments
Supply the webhook certificate from your own PKI and configure the operator accordingly.
If you don’t want to install cert-manager, set admissionWebhooks.certManager.enabled to false and admissionWebhooks.autoGenerateCert.enabled to true so the operator auto-creates a self-signed webhook certificate suitable for demos and local testing.
Use this values.yaml snippet to enable the operator’s auto-generated certificate:
NAME: my-opentelemetry-operatorLAST DEPLOYED: Tue Oct 21 22:55:09 2025NAMESPACE: defaultSTATUS: deployedREVISION: 1NOTES:[WARNING] No resource limits or requests were set. Consider setting resource requests and limits via the `resources` field.opentelemetry-operator has been installed. Check its status by running: kubectl --namespace default get pods -l "app.kubernetes.io/instance=my-opentelemetry-operator"
Create a collector by applying an OpenTelemetryCollector CR. The CRD accepts the standard collector configuration (receivers, processors, exporters, service pipelines) and operator-specific fields such as mode (Deployment or DaemonSet) and upgrade settings.Example collector.yaml — a deployment-mode collector named my-collector that accepts OTLP, logs debug output, and forwards traces to an in-cluster Jaeger service:
When the operator deploys a collector in deployment mode it creates ClusterIP Services so other pods can reach the collector by DNS (no need to use node IPs).Example kubectl get svc output (collector services highlighted):
Open the Jaeger UI (NodePort, port-forward, or external URL) and search for your service. The UI should display traces forwarded from your application via the operator-managed collector.
Using the OpenTelemetry Operator makes collectors Kubernetes-first: define an OpenTelemetryCollector CR with normal collector configuration, choose deployment mode (DaemonSet or Deployment), and let the operator manage lifecycle, upgrades, and reconciliations. This is especially helpful for cluster-wide auto-instrumentation and centralized collector management.