What's New in OpenTelemetry Operator v0.163.0: TLS Hardening, Auto-Instrumentation Fixes, and OpAMP Improvements
OpenTelemetry Operator v0.163.0 adds Target Allocator TLS controls, bundle related images, and fixes OpAMP, nginx auto-instrumentation and ConfigMap bugs.
💡 Quick Answer: OpenTelemetry Operator v0.163.0 hardens Target Allocator and operator TLS (min version, cipher suites, curve preferences), fixes several bugs affecting OpAMP bridges, nginx auto-instrumentation, dry-run Events, and literal
<<keys in collector ConfigMaps. No breaking API changes; upgrade is routine via Helm.
The Problem
Operators running the OpenTelemetry Operator on v0.162.0 or earlier hit a handful of rough edges: TLS cipher/curve configuration was not exposed for the Target Allocator or operator webhook server, kubectl apply --dry-run=server generated spurious Kubernetes Events, re-injecting nginx auto-instrumentation into a Pod was not idempotent, and OpAMP bridges could accidentally restart or delete collectors they didn’t manage. Image registries with a port in the address (e.g. localhost:5000/...) also produced invalid app.kubernetes.io/version labels.
The Solution
Upgrade to v0.163.0, which ships targeted enhancements and bug fixes with no breaking CRD or API changes. Key operator-facing items:
Whats New
Enhancements
auto-instrumentation: Emits anInstrumentationRequestRejectedPod Event when a namespace has no matchingInstrumentationresource (#5855) — easier to diagnose silent injection failures.target allocator: New HTTPS server fieldsmin_version,cipher_suites,curve_preferences, overridable via CLI flags--https-min-version,--https-cipher-suites,--https-curve-preferences(#5840). Curve preferences use IANA numeric IDs (e.g. 23 = secp256r1, 29 = X25519). Unset fields keep the existing default (TLS 1.2, Go defaults).operator: New--tls-curve-preferencesflag /TLS_CURVE_PREFERENCESenv var for the operator’s own TLS supported groups (#5830).target allocator: When--tls-configure-operandsis set, the Target Allocator’shttpsconfig is now populated from the operator’s TLS profile automatically (#5844).collector: Namespace-scoped Role/RoleBinding is created for the k8sattributes processor whenfilter.namespaceis set (#5525) — tighter RBAC instead of cluster-wide.operator: Related images added to the OLM bundle, useful for disconnected/air-gapped installs (#5823).
Bug fixes
collector: Dry-run admission requests (kubectl apply --dry-run=server,kubectl diff) no longer generate Kubernetes Events (#5738).collector: Mutating webhook no longer overwritesservice.telemetryunder the declarativeresource.attributesschema (#5207).target allocator:prometheusCR.denyFSAccessThroughSMsis now preserved when converting betweenv1alpha1andv1beta1(#5904).collector: ConfigMaps containing a literal<<map key are written correctly (quoted) instead of being rejected as unrenderable — fixed upstream ingo.yaml.in/yaml/v3v3.0.6 (#5866).auto-instrumentation: nginx injection is now idempotent; re-injecting into the same Pod is a no-op (#5810).opamp: Bridge no longer restarts/deletes collectors it doesn’t manage; bridge name now comes from theOpAMPBridgeresource name, so multiple bridges in one cluster can distinguish their collectors via aname-labeled selector instead of only the genericopentelemetry.io/opamp-reporting: "true"label (#5616, #5920).operator: Operator NetworkPolicy is reconciled when API server IPs change, by watching EndpointSlices (#5559).target allocator: Removed a redundant CRD default onspec.targetAllocator.mtls.tls.certificateAuthorityCertificate.configMap.key(operator already defaults toca.crt) (#5841).auto-instrumentation: Upgrades to breaking instrumentation versions are blocked when images include a digest (#5856).collector, target allocator, opamp:app.kubernetes.io/versionlabel is now derived correctly from image tags even when the registry address includes a port (e.g.localhost:5000/otel/collector:0.100.0) (#5801).cluster observability: AddedRELATED_IMAGE_CLUSTER_OBSERVABILITY_COLLECTORenv var mapping (#5803).
Bundled components
- OpenTelemetry Collector / Contrib v0.163.2
- Java auto-instrumentation v2.33.1-3, .NET v1.19.1-1, Node.js v0.83.0-2, Python v0.66b2-4, Ruby v0.1.0, Go v0.24.0, PHP ext 1.4.2, ApacheHTTPD/Nginx webserver v1.0.4-5
Upgrade Steps
Check the currently installed version:
kubectl get deployment -n opentelemetry-operator-system \
opentelemetry-operator-controller-manager \
-o jsonpath='{.spec.template.spec.containers[0].image}'Upgrade via the official Helm chart (adjust release name/namespace to your setup):
helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts
helm repo update
helm upgrade opentelemetry-operator open-telemetry/opentelemetry-operator \
--namespace opentelemetry-operator-system \
--set manager.image.tag=0.163.0 \
--reuse-valuesIf you manage the operator directly with manifests instead of Helm:
kubectl apply -f \
https://github.com/open-telemetry/opentelemetry-operator/releases/download/v0.163.0/opentelemetry-operator.yamlOptional: enable the new TLS hardening flags on the operator deployment, for example to restrict curve preferences (23 = secp256r1, 29 = X25519):
kubectl set env deployment/opentelemetry-operator-controller-manager \
-n opentelemetry-operator-system \
TLS_CURVE_PREFERENCES="23,29"Or set the equivalent fields in the Target Allocator config if you run a standalone Target Allocator with --tls-configure-operands enabled.
Verify
Confirm the operator pods are running the new image:
kubectl get pods -n opentelemetry-operator-system \
-l app.kubernetes.io/name=opentelemetry-operator \
-o jsonpath='{.items[*].spec.containers[*].image}'Check operator logs for startup errors after upgrade:
kubectl logs -n opentelemetry-operator-system \
deployment/opentelemetry-operator-controller-manager --tail=100If using auto-instrumentation, confirm a namespace without an Instrumentation resource now emits the rejection Event:
kubectl get events -n <namespace> --field-selector reason=InstrumentationRequestRejectedCommon Issues
- CRDs not updated by Helm:
helm upgradedoes not update CRDs by default; apply the CRD manifests from the release assets separately if the chart’s CRD subchart wasn’t bumped. - Existing TLS behavior unaffected: leaving the new
min_version/cipher_suites/curve_preferencesfields unset preserves prior behavior (TLS 1.2, Go default ciphers/curves) — no action required unless you want stricter settings. - OpAMP bridge naming change: after upgrade, the bridge’s generated config now carries
name: <OpAMPBridge name>. If you relied on the genericopentelemetry.io/opamp-reporting: "true"label across multiple bridges in one cluster, review labeling to avoid overlap now that name-based selection is available. - Digest-pinned images and upgrades: if auto-instrumentation images are pinned by digest, breaking version upgrades are now blocked (#5856) — expect to see this surfaced as a rejected admission rather than a silent breakage.
Best Practices
- Pin the operator version explicitly in Helm (
manager.image.tag) rather than trackinglatest, and review the release notes for every bump given the frequent weekly cadence of this project. - Enable the new TLS curve/cipher flags in regulated environments to meet compliance baselines (e.g., disable weak curves by only listing 23 and 29).
- Audit OpAMP bridge labels after upgrading if running multiple bridges per cluster, to take advantage of the new name-scoped collector management.
- Test
kubectl apply --dry-run=serverandkubectl diffworkflows in CI to confirm the Event-spam fix behaves as expected in your pipelines.

Recommended
Kubernetes Recipes — The Complete Book100+ production-ready patterns with detailed explanations, best practices, and copy-paste YAML. Everything in one place.
Get the Book →Learn by Doing
CopyPasteLearn — Hands-on Cloud & DevOps CoursesMaster Kubernetes, Ansible, Terraform, and MLOps with interactive, copy-paste-run lessons. Start free.
Browse Courses →🎓 Deepen Your Skills — Hands-on Courses
Courses by CopyPasteLearn.com — Learn IT by Doing
