Significant Changes
StatsD metrics aggregation now supports configurable TTL-enabled LRU cache to prevent memory growth in long-running daemons (#60933)
The Helm Chart now includes new configuration options for StatsD aggregation management:
statsd.cache.type- Enable TTL-enabledlrucache orrandomcache for metrics aggregation (default:lru)statsd.cache.size- Maximum number of metrics to cache (default: 1000)statsd.cache.ttl- Time-to-live for cached metrics in seconds (0sis TTL disabled) (default:0s)
This feature addresses uncontrolled memory growth in StatsD daemons by automatically cleaning up stale or unused metric entries. When enabled, the cache uses both LRU (Least Recently Used) eviction and TTL (Time To Live) expiration to manage memory usage effectively.
To maintain backward compatibility, the default behaviour remains unchanged. Users experiencing memory growth issues with StatsD can enable this feature by setting statsd.cache.ttl to value higher than 0 in their Helm values.
Support for Multiple Celery Worker Sets in the Helm Chart (#58547)
This change introduces support for advanced Celery Workers topologies to Apache Airflow Helm Chart, enabling more flexible resource allocation and precise autoscaling configurations.
Flexible Worker Topologies: The new workers.celery.enableDefault flag allows users to configure a deployment consisting only of specialized worker sets defined in workers.celery.sets section.
Multi-Queue Autoscaling Support: Updates the KEDA ScaledObject generation to support comma-separated queue lists. By using the SQL IN (...) clause, we ensure that KEDA scales worker sets based on the precise aggregate workload of all their assigned queues.
Granular Configuration Overrides: This change allows for overwrite of any currently available workers configuration per worker set. For example, a user can enable KEDA globally, but explicitly disable it for a specific worker set that requires a static number of replicas.
Options to create a default user have been moved under the createUserJob section
Please update your configuration accordingly:
webserver.defaultUsersection is now deprecated in favor ofcreateUserJob(#59767)
The previous configuration options are still working but are deprecated and will be removed in a future version.
Note that the previous documentation described also the option apiServer.defaultUser, which was never implemented in the chart. The only supported option is now createUserJob. Using apiServer.defaultUser will raise an error.
Celery specific config options have been moved under the celery section in workers
Please update your configuration accordingly:
workers.replicascommand is now deprecated in favor ofworkers.celery.replicas(#59730)workers.revisionHistoryLimitcommand is now deprecated in favor ofworkers.celery.revisionHistoryLimit(#60056)workers.argscommand is now deprecated in favor ofworkers.celery.args(#60163)workers.livenessProbesection is now deprecated in favor ofworkers.celery.livenessProbe(#60186)workers.updateStrategysection is now deprecated in favor ofworkers.celery.updateStrategy(#60351)workers.strategysection is now deprecated in favor ofworkers.celery.strategy(#60354)workers.podManagementPolicysection is now deprecated in favor ofworkers.celery.podManagementPolicy(#60359)workers.persistencesection is now deprecated in favor ofworkers.celery.persistence(#60238)
The previous configuration options are still working but are deprecated and will be removed in a future version.
Manual Service Account Token Volume configuration for pod-launching executors (#59156)
Added support for manual Service Account Token Volume configuration when using pod-launching executors
(CeleryExecutor, CeleryKubernetesExecutor, KubernetesExecutor, LocalKubernetesExecutor).
This implements defense-in-depth security with both ServiceAccount and Pod-level controls, providing
compatibility with security policies like Kyverno and enabling container-specific privilege assignment
following the Principle of Least Privilege.
Add imagePullSecrets option (#58094)
Add .Values.imagePullSecrets as the new mechanism for configuring registry credentials,
deprecating both .Values.registry.secretName and the automatic creation of the <RELEASE_NAME>-registry secret from .Values.registry.connection.
Default Airflow image is updated to 3.1.7 (#61447)
The default Airflow image that is used with the Chart is now 3.1.7, previously it was 3.0.2.
Default git-sync image is updated to 4.4.2 (#54085)
The default git-sync image that is used with the Chart is now 4.4.2, previously it was 4.3.0.
New Features
- Add
PodDisruptionBudgetfor Dag Processor (#60294) - Add
PodDisruptionBudgetfor Triggerer and Workers (#59068) - Add
HorizontalPodAutoscaler(HPA) for API Server (#52392) - Add support for launching jobs with
KubernetesJobOperator(#52024) - Add
CronJobto clean old records in the database (#58155)
Improvements
- Improve dag_bundle_config_list Configuration (#60645)
- Add
workers.celery.kerberosInitContainer&workers.kubernetes.kerberosInitContainer(#60751, #60427) - Add
workers.celery.securityContexts&workers.kubernetes.securityContexts(#60396) - Add
workers.celery.podManagementPolicyfield (#60359) - Add
workers.celery.strategyfield (#60354) - Add
workers.celery.updateStrategyfield (#60351) - Add
workers.celery.persistencesection (#60238) - Add
workers.celery.livenessProbesection (#60186) - Add
workers.celery.argsfield (#60163) - Add
workers.celery.command&workers.kubernetes.command(#60067) - Allow custom
volumeClaimTemplateswhenlogs.persistence.enabledis true (#60118) - Add checksum for JWT secret in API server and scheduler deployments (#60111)
- Add
workers.celery.revisionHistoryLimitfield (#60056) - Add Redis StatefulSet
persistentVolumeClaimRetentionPolicysupport (#59955) - Add
workers.celery.replicasfield (#59730) - Add custom envs to database cleanup (#59804)
- Extend
airflow_ti_runningmetrics by scheduled, queued and deferred (#58819) - Create an explicit control for
createUserJob(#56057) - Make cleanup cronjob conditional on kubernetes executor (#58695)
- Add database cleanup options and remove deprecated
securityContextfield (#58663) - Add ability to disable API Server (#56493)
- Add
registry.secretNamesandregistry.connectionsoptions (#58094) - Allow custom labels in StatsD, redis and Dag Processor (#55832)
- Allow setting
restartPolicyfor batch jobs in chart (#54354) - Add readiness and liveliness support for git sync relay sidecars (#50218)
- Allow overriding
schedulerNameon worker/tasks pods (#53983) - Allow additional
PodDisruptionBudgetconfig properties (#58864) - Add EdgeExecutor to KEDA query (#55560)
- Allow
revisionHistoryLimitto be set to 0 (#60340) - Allow optional
subPathfor logs volume mount (#52350) - Move triggerer from
pod-log-reader-roletopod-launcher-role(#56872)
Bug Fixes
- Remove
kedaNetworkPolicySelectorfrom helpers (#61564) - Use the
bitnamilegacy/postgresqlimage (#61156) - Fix Compatibility of Celery Worker Sets with Workers Separation (#60420)
- Fix database cleanup cronjob ImagePullSecrets (#58626)
- Remove
workers.celerybreaking change (#61049) - Fix missing templating in API Server
extraInitContainers(#60812) - Fix
securityContext.containers/ingress.apiServerin values.schema.json (#60575) - Remove unused
containerLifecycleHooksfield (#60239) - Remove unneeded logic in api-server (#60147)
- Remove
defaultUserfrom API Server in values.schema.json (#59762) - Isolate
defaultUserhandling increateUserJob(#59767) - Fix rendering condition of
git_sync_ssh_key_volume(#59418) - Add watch for events to the Pod launcher role (#59080)
- Ensure that git-sync actually runs when
dags.gitSync.enabled=trueanddags.persistence.enabled=true(#59123) - Don't add labels to non-existent configuration options (#59213)
- Add log volume to init container for scheduler, triggerer and worker (#56418)
- Correctly derive celery sync_parallelism from scheduler CPU limits (#58733)
- Fix ingress notes (#59122)
- Fix Liveness / Readiness / Startup probe path for Airflow 3.x (#58734)
- Fix flower network policy condition when multiple executors (#58635)
- Missing SCC Role bindings for redis and api-server (#57985)
- Ensure graceful Redis shutdown(#58432)
- Start Redis directly, not via shell (#58790)
- Add missing
airflow.fullnameon kubernetes objects (#52953) - StatsD deployment volume mount without subpath for live reloading (#54986)
- Fix KEDA query for Kubernetes Executor (#55559)
- Add API Server config in k8s pod template (#53533)
- Fix helm schema validation for executor value (#54682)
- Correct watch verb quoting in Airflow Job Launcher Role (#53822)
- Trim non-alphanumeric characters from the executor label (#53534)
- Fix KEDA Query to Use executor Field Instead of queue for Multiple Executors (#52840)
Doc only changes
- Document how to run the API server behind a reverse proxy (#61095)
- Clarify ingress settings for Airflow 2 vs 3 in values.yaml (#60434)
- Add database cleanup docs to Helm productions docs (#58707)
- KEDA best practices + better documentation (#58246)
- Update chart info about built-in secrets and environment variables (#58317)
- Fix typo in PgBouncer section of the Production Guide (#56754)
- Update webserver secret note in NOTES.txt and Production Guide (#55106)
- Make term Dag consistent in docs v2 (#55099)
- Add API Server to container resources docs (#54698)
- Fix YAML block scalar when providing SSH key for git-sync (#56716)