Ververica Platform 3.1.2
On this page
- New Features and Improvements
- Platform-Wide Deployment Defaults Through Helm Values
- Platform-Wide Session Cluster Defaults
- Pod and Container Security Context
- Default File System Group for Volume Permissions
- Independent Custom Resource Definition Installation
- AppManager API Endpoint Visibility
- ServiceAccount Configuration Across All Subcharts
- On-Premises Installations Render No Default Ingress
- Configurable Artifact Upload Size Limit
- Audit Logs to Standard Output
- Configuration Changes Roll the Affected Pods
- JDK 17 Recommended Engine
- Bug Fixes
- Force Termination for Stuck Deployments
- Helm Chart Values Silently Ignored
- Loading a Savepoint from a Custom Location Through YAML
- OpenShift Upgrade Issues
- SQL Gateway Support for s3a:// Paimon and Iceberg Catalogs
- Kerberos JDBC Authentication on Private-CA Blob Storage
- Prometheus and JMX Metrics Reporters Did Not Start
- Kubernetes ownerReferences Missing on Platform Resources
- NullPointerException on AppManager Endpoint Lookup
- Maximum Parallelism Setting Ignored
- Pod Template Fields Dropped on the V2 API
- Vulnerability Fixes (Inside Apache Flink®)
- Vulnerability Fixes (Outside Apache Flink®)
- Upgrade
Release Date: 2026-07-31
Ververica Platform 3.1.2 is a maintenance and feature release focused on declarative Helm chart configuration, private-certificate trust, and on-premises installation defaults, plus bug fixes across the Kubernetes Operator, SQL Gateway, and metrics reporting.
Deployments and session clusters are impacted on OpenShift in this release. Compatibility is being addressed for the next release.
Do not install or upgrade to version 3.1.2 on OpenShift. Other Kubernetes distributions are not affected.
New Features and Improvements
Platform-Wide Deployment Defaults Through Helm Values
The deployment default blocks rendered into the AppManager configuration are now Helm values instead of hardcoded template content. Operators can set globalDeploymentDefaults, flinkConfigurationStream, flinkConfigurationBatch, systemDeploymentDefaults, and systemSessionClusterDefaults in values.yaml, and the values are applied to deployments created afterwards.
globalDeploymentDefaults accepts two top-level keys. spec applies to streaming deployments and batchSpec applies to deployments that set batchMode: true. Both keys accept flinkConfiguration and kubernetes.pods, which means a trust store volume and the corresponding JVM options can be delivered to every JobManager and TaskManager from the chart.
Because the same blocks accept kubernetes.pods.volumeMounts, a private certificate authority can be mounted into Flink pods declaratively. This removes the need for a post-install job that patches the AppManager configuration after every upgrade.
For configuration details, precedence rules, and a complete private certificate example, see Platform-Wide Deployment Defaults.
Platform-Wide Session Cluster Defaults
Ververica Platform restores platform-wide session cluster defaults, matching the capability available in Ververica Platform 2.x. Operators can set globalSessionClusterDefaults in values.yaml to apply flinkConfiguration and kubernetes.pods settings to session clusters created afterwards.
Session cluster defaults are applied when the session cluster is created. Changing the value affects session clusters created after the change, and existing session clusters keep the configuration they were created with.
For more information, see Platform-Wide Deployment Defaults.
Pod and Container Security Context
You can now configure a pod and container security context through Helm values, so Ververica Platform pods can run as non-root and meet stricter cluster security policies.
Default File System Group for Volume Permissions
Ververica Platform now ships a default file system group configuration that resolves permission errors when Flink jobs write to mounted volumes. You no longer need to set runAsGroup: 0 manually for the general case.
Published: Defaults
Independent Custom Resource Definition Installation
The custom resource definition can now be installed and upgraded independently of the platform chart. Set ververica-platform-crd.enabled: false in values.yaml to exclude the custom resource definition from the release, and apply it separately. This suits environments where cluster-scoped resources are managed by a different team or under a separate change-control process than namespaced workloads.
Published: Kubernetes Operator
AppManager API Endpoint Visibility
AppManager endpoints, including metrics and logs, are now exposed through the customer-facing public API allowlist.
ServiceAccount Configuration Across All Subcharts
Every subchart that creates a ServiceAccount now honors serviceAccount.create and serviceAccount.name. Setting serviceAccount.create: false together with serviceAccount.name makes the component use a pre-created ServiceAccount instead of creating one, and suits clusters where ServiceAccounts and their role bindings are provisioned outside the application chart. This applies to access-control, vvp-appmanager, vvp-gateway, vvp-advisor, vvp-autopilot, vvp-meta, and vvp-k8s-operator.
On-Premises Installations Render No Default Ingress
On-premises installations no longer render an Ingress resource or a default host by default. global.ingress is empty in the shipped values, and an Ingress is created only when explicitly configured through global.ingress.enabled: true together with className, host, and, where required, tls.enabled. Set path and pathType explicitly, because they have no fallback value.
Configurable Artifact Upload Size Limit
The maximum artifact upload size is now a single Helm value, global.upload.maxFileSize, applied consistently to every service that accepts a job-artifact upload. The default is 200MB.
In Ververica Platform 2.x this limit was raised by passing Spring Boot environment variables through each service's env block, which has no effect in Ververica Platform 3.x.
Published: Artifacts
Audit Logs to Standard Output
Audit events can now be written to standard output with an audit marker, so an existing cluster log pipeline becomes the durable store instead of the file-based sidecar, and the log-forwarding sidecar is not deployed in this mode. Set api-gateway.audit.output: stdout. Audit events are emitted as JSON lines carrying "audit": true. The default remains file-based output.
For more information, see Audit Logs.
Configuration Changes Roll the Affected Pods
Platform components previously read their configuration once at startup, so a Helm upgrade that changed only rendered configuration left running pods untouched until a manual restart. Platform components now carry a configuration checksum in their pod template, so a Helm upgrade that changes their rendered configuration rolls the affected pods automatically.
JDK 17 Recommended Engine
JDK 17 is now labeled as the recommended VERA engine version in the deployment and session cluster creation forms. JDK 11 engine versions remain available and supported.
Published: VERA Engine Versions and Java Compatibility
Bug Fixes
Force Termination for Stuck Deployments
Deployments that got stuck indefinitely in a starting or cancelling state now have a supported way to force termination.
- Submission-time pod-template validation: a new validation during job submission that rejects unrecognized or misplaced Kubernetes pod-template fields (for example
fsGroupset at the container level instead of pod level, orvolumeMountsplaced directly under the pod spec instead of inside a container). Previously, these malformed specs were silently accepted and persisted, then crashed on each reconcile attempt. This feature has its own toggle to disable the checks if needed. - Force-stop for application-mode jobs: Ververica Platform had a
POST /jobs/{jobId}:forceStopendpoint, but it worked only for session-mode deployments. The fix removes this restriction, controlled by a new toggle,vvp.appmanager.force-terminate-enabled(defaultfalse).
Helm Chart Values Silently Ignored
This release resolves several issues where Helm chart values were silently ignored, including custom image registry settings and pod template volume mounts.
Published (pod template volume mount part): Pod-Level Customization
Loading a Savepoint from a Custom Location Through YAML
Fixed an issue where a savepoint path supplied through the deployment YAML was not applied, which prevented state restoration from an external location without using the API directly. You can now load a savepoint from a custom location through YAML configuration, either through the Kubernetes Operator CR's new restoreStrategy field or the REST API.
Published: Load a Savepoint from a Custom Location
OpenShift Upgrade Issues
Several issues affecting upgrades on OpenShift deployments are resolved.
SQL Gateway Support for s3a:// Paimon and Iceberg Catalogs
The SQL Gateway now resolves s3a:// warehouse locations for catalogs that use the Hadoop file system API, including Paimon and Iceberg with catalog-type=hadoop, removing a previous ClassNotFoundException. Paimon resolves s3a:// through the Hadoop file system API, which loads from the main class loader, while flink-s3-fs-hadoop ships only in the isolated plugin class loader. The platform now places the required class on the SQL Gateway class path at startup.
This behavior is controlled by vvp-appagent.sqlService.s3aCompatibility.enabled, which defaults to true. Set it to false to keep the main class path free of the unshaded Hadoop S3 file system.
Credentials supplied in the catalog WITH clause are used for the connection, and the configuration survives SQL Gateway restarts without manual reapplication. This is scoped to s3a:///s3://; the platform's internal s3i:// blob storage scheme is not a Hadoop file system scheme and still can't be used as a catalog warehouse.
Published: Blob Storage
Kerberos JDBC Authentication on Private-CA Blob Storage
Fixes native Kerberos JDBC deployments (for example SQL Server Integrated Security) failing to start when the platform's blob storage serves its TLS certificate from a private certificate authority. The agent and JAR services now use the same CA-truststore convention already used by the SQL, AppManager, and Gateway components.
Published: Connecting to SQL Server with Integrated Security (Kerberos)
Prometheus and JMX Metrics Reporters Did Not Start
Fixed an issue where the shipped deployment defaults set metrics.reporters to a colon-separated list. Apache Flink® splits this setting on commas only, so neither the JMX nor the Prometheus reporter was registered and no metrics were served. The shipped defaults now use a comma-separated list and include the reporter factory class and port.
No documentation change is needed: the existing Monitoring and Metrics guide already describes the correct, now-restored configuration.
Kubernetes ownerReferences Missing on Platform Resources
Fixed an issue where resources created by the platform did not carry Kubernetes ownerReferences, which prevented dependent objects from being garbage collected when their owner was deleted.
NullPointerException on AppManager Endpoint Lookup
Fixed an issue where the Gateway threw a NullPointerException during an AppManager endpoint lookup.
Maximum Parallelism Setting Ignored
Fixed an issue where the maximum parallelism configured for a deployment was not respected at runtime.
Pod Template Fields Dropped on the V2 API
Fixed an issue where kubernetes and pod template fields submitted through the V2 API were accepted but not persisted.
Vulnerability Fixes (Inside Apache Flink®)
- Removed binutils, binutils-common, binutils-x86-64-linux-gnu, libbinutils, libctf-nobfd0, libctf0, libgprofng0, libsframe1 to address CVE-2017-13716, CVE-2025-1152, CVE-2025-69644, CVE-2025-69645, CVE-2025-69646, CVE-2025-69647, CVE-2025-69648, CVE-2025-69651, CVE-2025-69652
- Removed bsdutils, libblkid1, libfdisk1, libmount1, libsmartcols1, libuuid1, mount, util-linux to address CVE-2026-27456
- Removed ch.qos.logback:logback-core to address CVE-2024-12798, CVE-2024-12801, CVE-2025-11226, CVE-2026-10532, CVE-2026-1225, CVE-2026-9828
- Removed curl, libcurl3t64-gnutls, libcurl4t64 to address CVE-2026-10536, CVE-2026-4873, CVE-2026-5545, CVE-2026-5773, CVE-2026-6253, CVE-2026-6276, CVE-2026-6429, CVE-2026-7168, CVE-2026-8286, CVE-2026-8458, CVE-2026-8924, CVE-2026-8925, CVE-2026-8927, CVE-2026-9547
- Removed dpkg, dpkg-dev, libdpkg-perl to address CVE-2026-2219
- Removed gir1.2-packagekitglib-1.0, libpackagekit-glib2-18, packagekit, packagekit-tools to address CVE-2022-0987, CVE-2024-0217
- Removed gzip to address CVE-2026-41991, CVE-2026-41992
- Removed io.netty:netty-codec to address CVE-2025-58057, CVE-2026-42583
- Removed io.netty:netty-codec-http to address CVE-2025-58056, CVE-2025-67735, CVE-2026-33870, CVE-2026-41417, CVE-2026-42580, CVE-2026-42581, CVE-2026-42584, CVE-2026-42585, CVE-2026-42587, CVE-2026-50020
- Removed io.netty:netty-common to address CVE-2024-47535, CVE-2025-25193
- Removed io.netty:netty-handler to address CVE-2025-24970, CVE-2026-44249, CVE-2026-45416, CVE-2026-50010
- Removed libc-bin, libc-dev-bin, libc6, libc6-dev, locales to address CVE-2026-4046, CVE-2026-4437, CVE-2026-4438, CVE-2026-5435, CVE-2026-6238
- Removed libduktape207 to address CVE-2026-12216
- Removed libdw1t64, libelf1t64 to address CVE-2025-1352, CVE-2025-1376
- Removed libexpat1, libexpat1-dev to address CVE-2025-66382
- Removed libgcrypt20 to address CVE-2024-2236, CVE-2026-41989
- Removed libgnutls30t64 to address CVE-2026-33845, CVE-2026-33846, CVE-2026-3832, CVE-2026-3833, CVE-2026-42009, CVE-2026-42010, CVE-2026-42011, CVE-2026-42012, CVE-2026-42013, CVE-2026-42014, CVE-2026-42015, CVE-2026-5260, CVE-2026-5419
- Removed libicu74 to address CVE-2025-5222
- Removed liblzma5, xz-utils to address CVE-2026-34743
- Removed libncursesw6, libtinfo6, ncurses-base, ncurses-bin to address CVE-2025-69720
- Removed libnghttp2-14 to address CVE-2026-27135, CVE-2026-58055
- Removed libnss-systemd, libpam-systemd, libsystemd-shared, libsystemd0, libudev1, systemd, systemd-dev, systemd-resolved, … (+2 more) to address CVE-2026-40226, CVE-2026-40228
- Removed libp11-kit0, p11-kit, p11-kit-modules to address CVE-2026-13757
- Removed libperl5.38t64, perl, perl-base, perl-modules-5.38 to address CVE-2026-42496, CVE-2026-8376
- Removed libpng16-16t64 to address CVE-2026-33416, CVE-2026-33636, CVE-2026-34757
- Removed libpolkit-agent-1-0, libpolkit-gobject-1-0, polkitd to address CVE-2016-2568
- Removed libpython3.12-minimal, libpython3.12-stdlib, python3.12, python3.12-minimal to address CVE-2025-13462, CVE-2025-69534, CVE-2026-1299, CVE-2026-1502, CVE-2026-2297, CVE-2026-3276, CVE-2026-3644, CVE-2026-4224, CVE-2026-4519, CVE-2026-4786, CVE-2026-6019, CVE-2026-6100, CVE-2026-7774, CVE-2026-8328, CVE-2026-9669
- Removed libsqlite3-0 to address CVE-2026-11822, CVE-2026-11824
- Removed libssl3t64, openssl to address CVE-2026-34180, CVE-2026-34182, CVE-2026-42766, CVE-2026-42767, CVE-2026-42770, CVE-2026-45445, CVE-2026-45446, CVE-2026-45447, CVE-2026-7383, CVE-2026-9076
- Removed libxml2 to address CVE-2026-6653
- Removed linux-libc-dev to address CVE-2013-7445, CVE-2015-7837, CVE-2015-8553, CVE-2016-8660, CVE-2017-0537, CVE-2017-13165, CVE-2017-13693, CVE-2018-1121, CVE-2018-12928, CVE-2018-12929, CVE-2018-12930, CVE-2018-12931, CVE-2018-17977, CVE-2019-14899, CVE-2019-15213, CVE-2019-15794, CVE-2019-19378, CVE-2019-19814, CVE-2019-20426, CVE-2020-14304, CVE-2020-14356, CVE-2020-35501, CVE-2021-26934, CVE-2021-3714, CVE-2021-3864, CVE-2022-0400, CVE-2022-0480, CVE-2022-1247, CVE-2022-25836, CVE-2022-2961, CVE-2022-3238, CVE-2022-41848, CVE-2022-44034, CVE-2022-4543, CVE-2022-45885, CVE-2022-48846, CVE-2022-48929, CVE-2022-49940, CVE-2022-50090, CVE-2022-50230, CVE-2022-50232, CVE-2022-50240, CVE-2022-50332, CVE-2022-50380, CVE-2022-50551, CVE-2023-0030, CVE-2023-0160, CVE-2023-1193, CVE-2023-20585, CVE-2023-26242, … (+2024 more)
- Removed login, passwd to address CVE-2024-56433
- Removed patch to address CVE-2018-6952, CVE-2021-45261
- Removed pytest to address CVE-2025-71176
- Removed sed to address CVE-2026-5958
- Removed tar to address CVE-2025-45582, CVE-2026-5704
- Removed wget to address CVE-2021-31879, CVE-2026-58469, CVE-2026-58470, CVE-2026-58471, CVE-2026-58472
- Removed zlib1g to address CVE-2026-27171
- Updated idna to 3.18 to address CVE-2026-45409
- Updated requests to 2.34.2 to address CVE-2026-25645
- Updated urllib3 to 2.7.0 to address CVE-2025-50181, CVE-2025-50182, CVE-2025-66418, CVE-2025-66471, CVE-2026-21441, CVE-2026-44431
Vulnerability Fixes (Outside Apache Flink®)
Base images for the platform tool containers were rebuilt, and the kubectl, nginx, and postgresql images used by init containers and sidecars report no known vulnerabilities.
- Removed com.microsoft.sqlserver:mssql-jdbc to address CVE-2025-59250
- Removed jaraco.context to address CVE-2026-23949
- Removed libcrypto3, libssl3 to address CVE-2026-34180, CVE-2026-34181, CVE-2026-34182, CVE-2026-34183, CVE-2026-42764, CVE-2026-42766, CVE-2026-42767, CVE-2026-42768, CVE-2026-42769, CVE-2026-42770, CVE-2026-45445, CVE-2026-45446, CVE-2026-45447, CVE-2026-7383, CVE-2026-9076
- Removed pip to address CVE-2023-5752, CVE-2025-8869, CVE-2026-1703, CVE-2026-3219, CVE-2026-6357, CVE-2026-8643
- Removed wheel to address CVE-2026-24049
- Updated @angular/common to 21.2.17 to address CVE-2026-50170, CVE-2026-50171, CVE-2026-54266, CVE-2026-54268
- Updated @angular/core to 21.2.17 to address CVE-2026-50557, CVE-2026-52725, CVE-2026-54267
- Updated ch.qos.logback:logback-core to 1.5.34 to address CVE-2026-10532
- Updated io.grpc:grpc-netty-shaded to 1.75.0 to address CVE-2025-55163
- Updated org.apache.commons:commons-configuration2 to 2.15.0 to address CVE-2026-45205
Upgrade
To upgrade Ververica Platform to version 3.1.2, run the following Helm command:
1helm upgrade --install <RELEASE_NAME> \
2 oci://registry.ververica.cloud/platform-charts/ververica-platform \
3 --version 3.1.2 \
4 --namespace vvp-system \
5 --values values.yamlCheck the Placement of upgradeStrategy in Deployment Defaults
Ververica Platform 3.1.2 validates the globalDeploymentDefaults value at startup. If upgradeStrategy is nested under spec.template.spec instead of spec, AppManager does not start and reports the following:
1Failed to deserialize vvp.globalDeploymentDefaults to a GlobalDeploymentDefaults resource.
2Action: Please verify that the provided value for
3vvp.globalDeploymentDefaults.spec.template.spec.upgradeStrategy has the expected type.Move upgradeStrategy to the spec level, as a sibling of template:
1vvp-appmanager:
2 globalDeploymentDefaults: |-
3 spec:
4 template:
5 spec:
6 resources:
7 jobmanager:
8 cpu: 1
9 memory: 1Gi
10 upgradeStrategy:
11 kind: STATELESSThe AppManager readiness probe has a long initial delay. A pod that fails this validation stays in the Running state without becoming ready, rather than entering CrashLoopBackOff. Check the AppManager log for APPLICATION FAILED TO START before concluding that the pod is still starting.
Add batchSpec for Batch Deployment Defaults
globalDeploymentDefaults applies spec to streaming deployments and batchSpec to batch deployments. The shipped default does not include batchSpec, so batch deployments inherit nothing from this block until it is added. If batch deployments require the same resources, Flink configuration, or volume mounts as streaming deployments, add a batchSpec key alongside spec. The spec key is required and must be present even when only batch defaults are needed.
Retire Post-Install Configuration Jobs
Installations that patch the AppManager configuration after installation, for example with a job that writes namespace deployment defaults, can move that content into the globalDeploymentDefaults, flinkConfigurationStream, and flinkConfigurationBatch values and remove the job.
Minimum MariaDB Version
MariaDB 11.4.5 or later is required. Earlier 11.4.x releases don't provide the utf8mb4_0900_ai_ci collation used by the advisor schema migration, and the migration fails on those versions.