Skip to content
Release Radar

Temporal Worker Controller

Messaging & Workflow

Kubernetes controller for Temporal Worker versioning and progressive rollouts

v1.11.013 days after v1.10.1
View on GitHub

Part of Temporal

Release history

v1.11.0

CompareGitHub

What's Changed

New Contributors

Full Changelog: https://github.com/temporalio/temporal-worker-controller/compare/v1.10.1...v1.11.0

What's Changed

New Contributors

Full Changelog: https://github.com/temporalio/temporal-worker-controller/compare/v1.9.0...v1.10.0

What changed

  • Make controller more resilient to inconsistent Temporal state, delay requeue after Temporal ResourceExhausted, improve logs (https://github.com/temporalio/temporal-worker-controller/pull/554)
    • Get version status directly from version summaries Status field instead of deducing the status from routing config. Log warning if any version's Status field is inconsistent with routing config.
  • fix(controller): DescribeVersion on NotRegistered Versions to prevent premature scaledown of said versions (https://github.com/temporalio/temporal-worker-controller/pull/556)
    • Verify the status NotRegistered Worker Versions with DescribeVersion before scaling down their Kubernetes Deployments

Full Changelog: https://github.com/temporalio/temporal-worker-controller/compare/v1.7.0...v1.7.1

What's Changed

New Contributors

Full Changelog: https://github.com/temporalio/temporal-worker-controller/compare/v1.8.1...v1.9.0

What's Changed

New Contributors

Full Changelog: https://github.com/temporalio/temporal-worker-controller/compare/v1.8.0...v1.8.1

What's Changed

New Contributors

Full Changelog: https://github.com/temporalio/temporal-worker-controller/compare/v1.7.0...v1.8.0

This release corresponds to Helm chart version 0.26.0. For details on versioning and how chart/app versions relate, see docs/release.md.

What's Changed

πŸš€ Generally Available: This project is Generally Available and ready for production use cases. Core functionality is complete with stable APIs.


[!WARNING]

πŸ’₯ Breaking changes and migration required for existing users

v1.7.0 renames the two primary CRDs: TemporalWorkerDeployment β†’ WorkerDeployment and TemporalConnection β†’ Connection. Existing resources are not reconciled until migrated. A zero-downtime migration path is available β€” see docs/migration-crd-rename.md.


  • CRD rename: TemporalWorkerDeployment β†’ WorkerDeployment, TemporalConnection β†’ Connection (#294): The Temporal prefix was redundant given the temporal.io API group. This is the last breaking change before GA. The deprecated CRD kinds remain installed with migration-guard finalizers and status conditions to guide migration.
  • Cluster UID in CONTROLLER_IDENTITY (#309): Completes the two-release migration started in v1.6.0. The controller identity now includes the cluster namespace UID ({identity}/{namespaceUID}), preventing cross-cluster conflicts when two controllers share the same base identity. Existing Worker Deployments are reclaimed transparently on upgrade.
  • Fix CEL rule to actually block deprecated resource create (#313): Follow-up to CRD migration PR
  • Downgrade guide for CRD rename migration (#312): Follow-up to CRD migration PR

Full Changelog: https://github.com/temporalio/temporal-worker-controller/compare/v1.6.0...v1.7.0

This release corresponds to Helm chart version 0.25.0. For details on versioning and how chart/app versions relate, see docs/release.md.

What's Changed

Upgrade Note

One-time pod rollout after upgrade. The build ID hash algorithm was updated to use json.Marshal instead of spew for pod spec serialization, so it now ignores zero-value fields introduced by future Kubernetes API versions (#290). On first reconcile after upgrading the controller, each TemporalWorkerDeployment will be assigned a new build ID and undergo a normal safe rollout. No manual intervention is required.


Bug Fixes

  • Rate-limit back-off for DescribeWorkerDeployment (#291): When the Temporal server returns ResourceExhausted (namespace read RPS limit hit), the reconciler now backs off for 30 seconds instead of tight-looping. The condition is surfaced as ConditionProgressing=False with reason TemporalStateFetchFailed and a Rate limited message.

  • Credential rotation: API key now read live on every RPC call (#301): The API key credential closure now reads the value from the K8s Secret on every outgoing Temporal RPC, so a rotated key takes effect immediately without requiring a controller restart or a permission-denied error cycle.

  • Credential rotation: SDK client evicted on auth errors (#300): PermissionDenied and Unauthenticated errors from Temporal SDK calls now evict the cached client from the pool, so the next reconcile re-reads credentials and re-dials. Previously, a rotated API key or revoked mTLS cert caused a permanent stuck-retry loop.

  • Events RBAC fix (#292): The events RBAC marker used the wrong API group (events.k8s.io instead of the core "" group), causing Server rejected event (will not retry!) log errors in cluster-wide deployments. Fixed, and Helm ClusterRole generation is now automated from Go markers to prevent future drift.


New Features

  • Server-side versioning cleanup on TWD deletion (#240): When a TemporalWorkerDeployment is deleted (e.g., switching back to plain Deployments), the controller now resets Temporal's routing state before completing deletion. Without this, tasks could become permanently stuck in Scheduled state. A finalizer on TemporalConnection also prevents a race condition where Helm deletes both resources simultaneously and the controller loses its connection before cleanup completes.

  • CRD-level spec validation via CEL rules (#293): Key TemporalWorkerDeployment spec constraints are now enforced by the API server at apply time via x-kubernetes-validations, regardless of whether the webhook is enabled. Validated rules include: name ≀ 63 chars, progressive strategy requires steps, max 20 steps, pauseDuration β‰₯ 30s per step, and gate.inputFrom requires exactly one source. Two constraints that cannot be expressed in CEL (strictly increasing rampPercentage, mutually exclusive gate.input/gate.inputFrom) fall back to reconciler-level validation with a Warning event and InvalidSpec condition.

  • Accept Opaque secrets for mTLS auth (#276): The controller now accepts both kubernetes.io/tls and Opaque secret types for MutualTLSSecretRef. This unblocks setups that bundle tls.crt, tls.key, and ca.crt into a single Opaque secret (e.g., cert-manager outputs with a custom CA).


Deprecations

  • authProxy.enabled Helm value deprecated (#304): The authProxy.enabled option is deprecated. Use metrics.disableAuth instead. The metrics port now only binds to 127.0.0.1 when the auth proxy is explicitly enabled.

Infrastructure

  • Preparation for cluster-scoped controller identity (#308): The manager identity claim logic now recognizes the upcoming cluster-UID-prefixed identity format, enabling clean reclaim after rollback from v1.7.0 (which will include full cluster UID support).

  • Removed go.work and binaries from source control (#305): go.work, go.work.sum, and checked-in binary files removed; go vet moved to the linters workflow.


Dependency Updates

  • github.com/aws/aws-sdk-go-v2: eventstream 1.7.4β†’1.7.8, lambda 1.88.0β†’1.88.5
  • go.opentelemetry.io/otel/sdk: 1.40.0β†’1.43.0
  • github.com/go-jose/go-jose/v4: 4.1.3β†’4.1.4
  • github.com/jackc/pgx/v5: 5.7.2β†’5.9.2

New Contributors

Full Changelog: https://github.com/temporalio/temporal-worker-controller/compare/v1.5.2...v1.6.0

This release corresponds to Helm chart version 0.24.1. For details on versioning and how chart/app versions relate, see docs/release.md.

What's Changed

New Contributors

Full Changelog: https://github.com/temporalio/temporal-worker-controller/compare/v1.5.0...v1.5.2

This release corresponds to Helm chart version 0.23.0. For details on versioning and how chart/app versions relate, see docs/release.md.

Highlights

This release introduces WorkerResourceTemplate, enabling per-version autoscaling in Public Preview!

See docs/worker-resource-templates.md and our metrics-based autoscaling demo for more information on how to set it up.

What's Changed

Full Changelog: https://github.com/temporalio/temporal-worker-controller/compare/v1.4.0...v1.5.0

This release corresponds to Helm chart version 0.22.0. For details on versioning and how chart/app versions relate, see docs/release.md.

Highlights

Upgrade Note

This release separates CRDs into a dedicated Helm chart.

Action required: Ensure your CRDs are upgradedβ€”either by installing the new CRD chart or updating them manually. If not, your cluster may run with incompatible or outdated CRDs.

See docs/crd-management.md for details.

Other improvements within the controller code include:

  • Using ManagerIdentity to coordinate handoff between worker controller and other clients modifying the same Worker Deployment resource. See docs/ownership.md for more details.
  • Omit DescribeVersion calls for drained versions to avoid hitting RPS limits
  • Add Ready and Progressing conditions to TemporalWorkerDeployment for consumption by CD tools

What's Changed

New Contributors

Full Changelog: https://github.com/temporalio/temporal-worker-controller/compare/v1.3.0...v1.4.0

This release corresponds to Helm chart version 0.20.0. For details on versioning and how chart/app versions relate, see docs/release.md.

Contains bug fixes:

Full Changelog: https://github.com/temporalio/temporal-worker-controller/compare/v1.3.0...v1.3.1