Released on 2026-07-21.
|
Release highlights
|
|
|
Overview of breaking changes
|
The following components of the SDP contain breaking changes for this release:
|
SDP artifacts are now published to quay.io directly from our CI pipelines. Previously, only the operator and product container images were available on quay.io, manually mirrored from oci.stackable.tech, and operators defaulted to pulling product container images from oci.stackable.tech. Additionally, operator Helm Charts are now published to quay.io as well. When installing these Helm Charts, the operators are automatically instructed to use product container images from quay.io.
|
Caution
|
To publish operator Helm Charts to quay.io, the repository layout was adjusted to accommodate the new artifacts. It closely mirrors the layout of oci.stackable.tech. This new layout applies only to releases from SDP 26.7 onwards. Artifacts for earlier releases are unaffected and remain available at their existing locations. See the artifact registries page for a detailed explanation of the new layout. |
Tracked in issues#716.
Stackable Hub is now available at hub.stackable.tech.
It is a public, read-only portal for published SDP releases (and upcoming ones), bundled component version timelines, and operator CRDs including their schemas, API versions and roles per release.
A CORS-enabled, unauthenticated JSON API is available under /api/v1/ for use in CI jobs, scripts and MCP servers.
The Hub publishes an llms.txt file for use with LLM tooling.
The documentation site now provides one at docs.stackable.tech/llms.txt as well.
We plan on migrating the current CRD browser to the Hub in the near future.
We also plan on migrating the current SBOM browser to the Hub in the near future.
This is an early version of the Hub and we’re happy to receive feedback.
-
The SDP now provides a generic database connection mechanism, giving a consistent, typed way to configure connections to external SQL databases across operators. The same typed structure is used in every CRD, so it can be copied between stacklets.
Breaking: This replaces the previous free-form connection strings with a typed struct, and requires changes to your custom resources (and, in some cases, your Secrets):
-
Apache Airflow: The
.clusterConfig.credentialsSecretfield is renamed to.clusterConfig.credentialsSecretName, and the database connection becomes a typed struct. Consult the database connections documentation page for more details.kind: AirflowCluster spec: clusterConfig: credentialsSecretName: airflow-admin-credentials metadataDatabase: postgresql: host: airflow-postgresql database: airflow credentialsSecretName: airflow-postgresql-credentials # Only needed when using celery workers (instead of Kubernetes executors) celeryExecutors: resultBackend: postgresql: host: airflow-postgresql database: airflow credentialsSecretName: airflow-postgresql-credentials broker: redis: host: airflow-redis-master credentialsSecretName: airflow-redis-credentials --- apiVersion: v1 kind: Secret metadata: name: airflow-admin-credentials type: Opaque stringData: adminUser.username: airflow # ... --- # Only needed when using celery workers (instead of Kubernetes executors) apiVersion: v1 kind: Secret metadata: name: airflow-postgresql-credentials stringData: username: airflow password: airflow --- # Only needed when using celery workers (instead of Kubernetes executors) apiVersion: v1 kind: Secret metadata: name: airflow-redis-credentials stringData: username: "" password: redis
Implemented in airflow-operator#754.
-
Apache Druid: The
metadataStorageDatabasefield is renamed tometadataDatabaseand is now a typed struct.# PostgreSQL or MySQL kind: DruidCluster spec: clusterConfig: metadataDatabase: postgresql: # or mysql host: postgresql-druid database: druid credentialsSecretName: druid-db-credentials # Derby kind: DruidCluster spec: clusterConfig: metadataDatabase: derby: {}
Implemented in druid-operator#814.
-
Apache Hive: the connection becomes a typed struct; because the
databasefield is removed, theusernamefield must be transferred to the Secret referenced incredentialsSecretNameunder theusernamekey before upgrading.kind: HiveCluster spec: clusterConfig: metadataDatabase: postgresql: host: postgresql database: hive credentialsSecretName: hive-credentials
Implemented in hive-operator#674.
-
Apache Superset: the connection becomes a typed struct, and the operator now uses an internal Secret for the Superset
SECRET_KEY(created automatically if missing). Consult the database connections documentation page for more details.kind: SupersetCluster spec: clusterConfig: credentialsSecret: superset-admin-credentials metadataDatabase: postgresql: host: superset-postgresql database: superset credentialsSecretName: superset-postgresql-credentials --- apiVersion: v1 kind: Secret metadata: name: superset-admin-credentials type: Opaque stringData: adminUser.username: admin adminUser.firstname: Superset adminUser.lastname: Admin adminUser.email: admin@superset.com adminUser.password: admin --- apiVersion: v1 kind: Secret metadata: name: superset-postgresql-credentials stringData: username: superset password: superset
Implemented in superset-operator#722.
Tracked in issues#238.
-
-
Setting a custom client authentication method is now supported for Apache Airflow, Apache Superset and Apache Druid. Since Apache Druid 35 and 36, OIDC authentication can fail if the provider (for example Keycloak) advertises
private_key_jwt, because Druid may attempt to use it. This feature lets you override the method so that OIDC authentication works again (this was a known issue in the 26.3.0 release). Tracked in issues#838. -
All our demos can now be installed in non-default namespaces. Additionally, demos and stacks can now be uninstalled. Please consult the
demoandstackcommand documentation pages for details and known limits. Tracked in stackablectl#187. -
In addition to the existing CycloneDX SBOMs, every image now also has an SBOM in the SPDX format attested to it. See the SBOM guide in our documentation for how to verify and extract them.
The Apache Airflow operator now allows specifying CA certificates when using git-sync. See the documentation page on how to mount DAGs for more details. Implemented in airflow-operator#750.
The Apache NiFi operator now allows specifying CA certificates when using git-sync. Consult the custom components documentation page for more details. Implemented in nifi-operator#903.
-
Apache Superset now supports running asynchronous queries via Celery. Two new roles,
workerandbeat(limited to a single replica), have been added. Consult the async queries via Celery documentation page for more details. Implemented in superset-operator#724. -
Redis is supported as the broker queue and results backend. Consult the database connections documentation page for more details. Implemented in superset-operator#724.
The Open Policy Agent operator now supports configOverrides for its config.json.
JSON Patches and JSON Merge Patches let you override the nested structure of the file.
Consult the configuration & environment overrides documentation page for more details.
Implemented in opa-operator#818.
-
Security settings managed by the operator are now hot-reloaded when changed, without Pod restarts. Implemented in opensearch-operator#130.
-
The OpenSearch operator now supports JSON Merge Patches, JSON Patches and user-provided JSON files in
configOverrides, making it easier to define nested types and non-string values. Consult the configuration & environment overrides documentation page for more details. Implemented in opensearch-operator#137.
-
Trino now has first-class support for the PostgreSQL connector {external-link-icon}, built on the new generic database connection mechanism. Previously, users had to fall back to the
genericconnector. Implemented in trino-operator#883. -
A new
.spec.name.inferred.replaceHyphensWithUnderscoresfield onTrinoCatalogallows tweaking the catalog name in Trino by replacing-with_. This lets you use valid Kubernetes resource names while keeping the convenience of underscores in catalog names. Implemented in trino-operator#903.
-
The Stackable secret-operator now supports adding domain components (DCs) to the subject DN of TLS certificates, via the
secrets.stackable.tech/backend.autotls.cert.domain-components-in-subject-dnvolume annotation.volumes: - name: tls ephemeral: volumeClaimTemplate: metadata: annotations: secrets.stackable.tech/backend.autotls.cert.domain-components-in-subject-dn: "true" secrets.stackable.tech/class: tls secrets.stackable.tech/scope: node,pod spec: storageClassName: secrets.stackable.tech accessModes: - ReadWriteOnce resources: requests: storage: "1"
A pod of a StatefulSet could then serve a TLS certificate with the following subject DN:
CN=generated certificate for pod, DC=my-pod-0, DC=my-statefulset-service, DC=my-namespace, DC=svc, DC=cluster, DC=localImplemented in secret-operator#708.
-
The name of the key in the ConfigMap/Secret that holds the PEM-encoded CA certificate of a
TrustStoreis now configurable, via.spec.tlsPemCaName. This is needed, for example, to use the generated Secret within an OpenShift Ingress. Implemented in secret-operator#679.
133 vulnerabilities were fixed in SDP 26.7, including 10 critical and 62 high vulnerabilities.
-
Breaking: Operators now determine the registry for product images from where they were installed, instead of hard-coding
oci.stackable.tech. This is controlled by a new--image-repositoryCLI argument (and theIMAGE_REPOSITORYenvironment variable), which lets the correct registry be selected automatically when an operator is installed via its Helm Chart or Operator Lifecycle Manager (OLM) manifest.NoteThis is only breaking if you deploy operators without our Helm Charts or OLM manifests, in which case you must now supply
--image-repositoryyourself. When installing via Helm or OLM the argument is set automatically, and installation works as before.Tracked in issues#716.
-
Breaking: The
image.repositoryHelm value must no longer include the operator name. Previously it looked likeoci.stackable.tech/sdp/airflow-operator; it must now beoci.stackable.tech/sdp. Tracked in issues#716. -
RBAC permissions for all Stackable operators deployed via Helm have been audited, and unnecessary permissions were removed. Tracked in issues#798.
-
ConfigMaps and Secrets can now be excluded from the restart-controller. Set the
restarter.stackable.tech/ignorelabel on a ConfigMap or Secret, or therestarter.stackable.tech/ignore-configmap.x/restarter.stackable.tech/ignore-secret.xannotations on a StatefulSet. Consult the restarter documentation page of the Stackable commons-operator for more details. Implemented in commons-operator#410.
-
Breaking:
EXPERIMENTAL_FILE_HEADERandEXPERIMENTAL_FILE_FOOTERinwebserver_config.py(for arbitrary Python code) have been renamed toFILE_HEADERandFILE_FOOTER. Implemented in airflow-operator#777. -
Breaking: Renamed and moved the celeryExecutor broker and results backend to clusterConfig. The results backend
spec.celeryExecutors.resultBackendis now located atspec.clusterConfig.celeryResultsBackend. The brokerspec.celeryExecutors.brokeris now located atspec.clusterConfig.celeryBroker. Implemented in airflow-operator#786.
Breaking: The FQDNs of the Kafka Pods are now included in the subject DNs of their TLS certificates. OPA Rego rules can now check these FQDNs. Existing OPA rules may need to be adjusted. Consult the security documentation page for more details. Implemented in kafka-operator#972.
For clusters with a fixed number of nodes, the operator now sets nifi.cluster.flow.election.max.candidates to the total node count.
Cold-start flow election then completes as soon as all expected nodes report in, typically seconds instead of the up-to-5-minute nifi.cluster.flow.election.max.wait.time timeout.
The timeout stays at NiFi’s upstream default of 5 minutes as a fallback, so there is no correctness change if fewer nodes than expected show up.
Implemented in nifi-operator#953.
Breaking: EXPERIMENTAL_FILE_HEADER and EXPERIMENTAL_FILE_FOOTER in superset_config.py (for arbitrary Python code) have been renamed to FILE_HEADER and FILE_FOOTER.
Implemented in superset-operator#721.
The OPA DaemonSet now uses maxSurge=1 and maxUnavailable=0 for its rolling update strategy.
During rolling updates (for example when an OPA config change triggers a restart), a new OPA Pod is created and must become ready before the old one is terminated.
This removes the brief availability gap that previously caused errors in products such as Trino.
Implemented in opa-operator#819.
The verification of the OpenSearch nodes' certificates has been extended.
The nodes' certificates now also include the FQDNs of the nodes, which are verified by the other nodes using the plugins.security.nodes_dn configuration setting.
Previously, it was only verified that the certificates were issued by the Stackable secret-operator.
Implemented in opensearch-operator#144.
-
All operators now request only the parts of the secret data they actually need for operator-managed secret volumes. This uses the
secrets.stackable.tech/provision-partsannotation introduced in SDP 26.3.0. This resolves the regression where SecretClasses used only to validate server certificates also required a client certificate (tls.crt/tls.key) to be provided. Fixed in issues#547. -
Internal secrets are now stored in mutable Kubernetes Secret objects. Previously these objects were immutable and, if deleted, were recreated with new random values; because immutable Secrets are cached, this could disrupt clusters (for example workers failing to join). This release migrates existing internal Secrets to mutable versions for
-
Trino in trino-operator#876 and
-
Apache Airflow in airflow-operator#770.
Tracked in issues#843.
-
OPA authorization now works for Apache Airflow 3 with any user role.
Previously, OPA rulesets were only applied for users with the Admin role.
Fixed in docker-images#1512 and regression tested in airflow-operator#800.
The NiFi OPA authorizer plugin no longer exhausts native threads under load. Previously, the plugin could create a new HTTP client for each authorization request, spawning large numbers of selector and executor threads under NiFi load and eventually exhausting native threads. With this release, all OPA authorization requests share a single pooled HTTP client with a fixed-size daemon-thread executor. Existing deployments need no configuration changes, as defaults are provided. Tracked in nifi-opa-plugin#30 and fixed in nifi-opa-plugin#31.
-
Breaking: Spark application templates are now namespaced objects instead of cluster-wide objects. They were unintentionally released as cluster-wide objects in SDP 26.3. You must recreate any templates in the namespaces where the applications run. Fixed in spark-k8s-operator#694 (reapplied in spark-k8s-operator#720).
-
User arguments are now correctly propagated to the Spark Connect server. Previously, the newline concatenation in the Spark Connect server entrypoint was faulty which resulted in user arguments being dropped. Fixed in spark-k8s-operator#696.
-
Spark executors now shut down gracefully on
SIGTERM. Previously the executor did not receiveSIGTERMwhen the driver did, so it was `SIGKILL`ed after the grace period. Fixed in docker-images#1564.
-
Previously, the User Info Fetcher’s outbound HTTP requests (to Microsoft Entra, Keycloak, and the XFSC AAS) had no timeout, so a slow or unresponsive backend could make a request hang indefinitely and stall user-info lookups. With this release, every outbound request has a 60-second overall timeout and a 15-second connection timeout. Implemented in opa-operator#859.
-
The Microsoft Entra backend of the OPA User Info Fetcher now retrieves complete group memberships for policy checks. Previously, it read only the first page of a user’s group memberships, so users belonging to many groups received an incomplete group list. With this release, the Entra backend follows the result pages until every page has been retrieved (bounded to 100 pages as a safeguard). Fixed in opa-operator#858.
As of SDP 26.3, hot-reloading of password file Secrets did not work anymore because a change to the Secret triggered a restart of the pods. With this release, the password file Secrets are excluded from the restart-controller and hot-reloading is supported again. Fixed in trino-operator#868.
Breaking: Support for NiFi 1.x has been dropped, along with a few CRD fields that only applied to 1.x and had no effect on NiFi 2.x:
-
spec.clusterConfig.createReportingTaskJob(includingenabledandpodOverrides) is removed. NiFi 2.x exposes Prometheus metrics directly at/nifi-api/flow/metrics/prometheus, so the reporting-task Job is obsolete. -
The deprecated
spec.clusterConfig.sensitiveProperties.algorithmvalues are removed. Use a supported algorithm instead:nifiArgon2AesGcm256(default) ornifiPbkdf2AesGcm256.
Removed in nifi-operator#960.
As with previous SDP releases, many product images have been updated to newer versions. Refer to the new Stackable Hub for a complete overview including LTS versions or deprecations.
The following product versions were already available before but are now marked as the LTS version:
-
Apache Hive: 4.2.0 (LTS)
The following new product versions are now supported:
-
Apache Airflow: 3.2.2
-
Note: this Airflow version uses Python 3.14.
-
-
Apache Druid: 37.0.0 (LTS)
-
Breaking: Druid 37.0.0 switched to AWS SDK v2. TLS is now enforced for S3 connections, and the S3
regionis now required (the operator passesaws.regionfromS3Connection.region).
-
-
Apache HBase: 2.6.6 (LTS)
-
Apache Hadoop: 3.4.3 (LTS), 3.5.0
-
Apache Kafka: 3.9.2 (LTS), 4.2.1 (experimental)
-
Apache NiFi: 2.9.0
-
Apache Phoenix: 5.3.1
-
Apache Spark: 4.1.2 (LTS)
-
Apache Superset: 6.1.0
-
Apache ZooKeeper: 3.9.5 (LTS)
-
Open Policy Agent: 1.16.2
-
OpenSearch: 3.6.0
-
Trino: 481
-
Vector: 0.55.0
The following product versions are deprecated and will be removed in a later release:
The following product versions are no longer supported. These images for released product versions remain available in the Stackable OCI Registry. Information on how to browse the registry can be found in the project overview documentation.
This release supports the following Kubernetes versions:
-
1.36 -
1.35 -
1.34 -
1.33 -
1.32 -
1.31
No Kubernetes versions were dropped in this release.
|
Tip
|
Please consult the following upgrade notes when upgrading from 26.3 to 26.7:
|
Uninstall the 26.3 release
$ stackablectl release uninstall 26.3
Uninstalled release '26.3'
Use "stackablectl release list" to list available releases.
# ...Install the 26.7 release
$ stackablectl release install 26.7
Installed release '26.7'
Use "stackablectl operator installed" to list installed operators.Use helm list to list the currently installed operators.
You can use the following command to uninstall all operators that are part of the 26.3 release:
$ helm uninstall airflow-operator <PRODUCT>-operator ...
release "airflow-operator" uninstalled
release "<PRODUCT>-operator" uninstalled
...Install the 26.7 release
|
Note
|
|
helm install --wait <PRODUCT>-operator oci://oci.stackable.tech/sdp-charts/<PRODUCT>-operator --version 26.7.0