Skip to main content
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.

Quick Helm install

Add the Helm repo and install the operator quickly:

Environment sanity checks

Confirm your Kubernetes nodes and clean up any prior resources you no longer need:
Example output:
If you already have telemetry backends like Jaeger running you can keep them; this demo retains a Jaeger instance.

Install with a customized values.yaml

For more control, fetch the chart defaults, edit them, then install with your edited values.yaml:
A few top-level values (excerpt):

TLS / Admission webhook certificate options

The operator installs admission webhooks that require a TLS certificate trusted by the API server. You have three main options:
OptionUse caseNotes / link
cert-managerProduction or cluster-wide certificate managementDeploy 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 clustersLet the operator generate a self-signed cert by enabling admissionWebhooks.autoGenerateCert.enabled.
Provide your own certAdvanced / policy-controlled environmentsSupply 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:

Configure operator and collector images

Set the manager and default collector image repositories and tags in values.yaml as needed:
Install (or upgrade) the operator with your edited values:
Example Helm output:

Verify the operator

Check deployments:
Example output:
Note: this deployment is the operator controller — not a collector. The operator will create and reconcile OpenTelemetryCollector custom resources for you. The OpenTelemetry Operator chart documentation describes the webhook/TLS details in depth: https://github.com/open-telemetry/opentelemetry-helm-charts/tree/main/charts/opentelemetry-operator
The image shows a webpage from OpenTelemetry documentation discussing the configuration of the Operator Helm chart with a focus on TLS certificates and cert-manager usage in Kubernetes.

Creating a Collector via the 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:
Apply the collector CR:
Expected response:
Check the collector CR, deployments and pods:
Example outputs:

Services created by the operator

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):
Example output converted to a table for clarity:
NAMETYPECLUSTER-IPPORT(S)AGE
jaeger-externalNodePort10.96.224.5216686:30007/TCP54m
jaeger-internalClusterIP10.96.11.344317/TCP,4318/TCP,14250/TCP,14268/TCP54m
kubernetesClusterIP10.96.0.1443/TCP54m
my-collector-collectorClusterIP10.96.73.324317/TCP,4318/TCP47s
my-collector-collector-headlessClusterIP10.96.2.1118888/TCP47s
my-collector-collector-monitoringClusterIP10.96.92.1248443/TCP,8080/TCP8m27s
my-opentelemetry-operatorClusterIP10.96.77.7443/TCP8m27s

Deploy an application that sends traces

Point your app at the collector service DNS (e.g. my-collector-collector) instead of a node IP. Example Deployment snippet:
Apply the app and verify pods:
Example pod listing showing the app starting:
Check application logs to confirm spans are being sent and received by the collector. Example kubectl logs output from the sample app:

Viewing traces in Jaeger

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.
The image shows the Jaeger UI displaying tracing data, with a list of trace results for a "flight-service" including their durations and timestamps. It includes a filter section for refining search criteria based on service, operation, and duration.

Conclusion

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.

Watch Video