For the complete documentation index, see llms.txt.
Skip to main content
Version: 8.9

Configure the Helm chart with Gateway API

Use this guide to configure the Camunda 8 Helm chart with the Kubernetes Gateway API instead of a traditional Ingress controller.

The Gateway API provides a modern way to manage Ingress traffic in Kubernetes clusters. It improves on the Ingress API in the following ways:

  • Separates cluster operators, who manage Gateway resources, from application developers, who manage HTTPRoute resources.
  • Enables configuration of NGINX without relying on labels and annotations, which also helps limit permissions.
note

The Ingress-NGINX controller is planned to reach end of life in March 2026 (see the Kubernetes announcement on Ingress-NGINX retirement). Plan a migration to the Gateway API where it fits your use case.

If you decide not to adopt the Gateway API, you can migrate to a different Ingress controller and continue using the Ingress API. This remains a supported approach.

Prerequisites

Ensure both are installed in your cluster.

  • Gateway API CRDs
  • A Gateway API controller

Gateway controllers

Just like Ingress Controllers, Gateway controllers need to be installed before a cluster can use the Gateway API. See the list of Gateway API implementations for details.

In testing, we use the NGINX Gateway Fabric.

Configure the Helm chart

ParameterTypeDefaultDescription
global.hoststring""The external-facing URL hostname where Camunda will be installed.
global.gateway.enabledbooleanfalseEnable creating resources for the Kubernetes Gateway API.
global.gateway.createGatewayResourcebooleantrueCreate the Gateway CustomResource. Do not enable if you already have a Gateway resource.
global.gateway.externalbooleantrueSet this to true if you are using the Gateway API but want to create the resources yourself.
global.gateway.classNamestring""Name of the GatewayClass resource that defines which Gateway controller operates on your Gateway and HTTPRoute resources.
global.gateway.labelsmap{}Labels to add to the Gateway and HTTPRoute resources.
global.gateway.annotationsmap{}Annotations to add to the Gateway and HTTPRoute resources.
global.gateway.tls.enabledbooleanfalseEnable TLS.
global.gateway.tls.secretNamestring""Name of the Kubernetes Secret resource containing a TLS cert
global.gateway.portinteger80The port of the plaintext (HTTP) Gateway listener. Change this when your Gateway controller exposes HTTP on a non-standard port.
global.gateway.tls.portinteger443The port of the HTTPS Gateway listener. Change this when your Gateway controller exposes HTTPS on a non-standard port (for example, Traefik's 8443 websecure entrypoint).
global.gateway.httpSectionNamestring""Override the parentRefs.sectionName on the HTTPRoutes. Must match a listener name on the target Gateway. Only set this for an externally-managed Gateway. See externally-managed gateway with custom listener names.
global.gateway.grpcSectionNamestring""Override the parentRefs.sectionName on the GRPCRoute. Must match a listener name on the target Gateway. Only set this for an externally-managed Gateway. See externally-managed gateway with custom listener names.
global.gateway.namestring""The name of the Gateway resource that Routes attach to. Defaults to the Helm release fullname when unset. Set this when the target Gateway has a different name than your release.
global.gateway.namespacestring""The namespace where the Gateway resource lives. Set this only when using a shared Gateway in a different namespace than your Camunda components. When unset, Kubernetes defaults to the Route's own namespace.
global.gateway.controllerNamespacestring""The namespace where the Gateway controller is installed.

Example configuration

global:
host: "camunda.example.com"
gateway:
createGatewayResource: true
enabled: true
className: nginx
tls:
enabled: true
secretName: camunda-platform
annotations:
external-dns.alpha.kubernetes.io/hostname: "{{ .Values.global.gateway.hostname }}"
external-dns.alpha.kubernetes.io/ttl: "60"

Custom listener ports

By default the Gateway listens on port 80 for HTTP and port 443 for HTTPS. Set global.gateway.port and global.gateway.tls.port when your Gateway controller exposes these on non-standard ports, for example, Traefik's websecure entrypoint on 8443:

global:
host: "camunda.example.com"
gateway:
createGatewayResource: true
enabled: true
className: nginx
port: 8080
tls:
enabled: true
secretName: camunda-platform
port: 8443

Externally-managed Gateway with custom listener names

When attaching Routes to a Gateway you do not manage, its listener names may not match the chart defaults (http, https, grpc, grpcs). Use global.gateway.httpSectionName and global.gateway.grpcSectionName to point the Routes' parentRefs.sectionName at the listener names the target Gateway actually defines:

global:
host: "camunda.example.com"
gateway:
enabled: true
createGatewayResource: false
name: shared-gateway
namespace: shared-infra
httpSectionName: web
grpcSectionName: grpc-web
warning

Only set the sectionName overrides for an externally-managed Gateway, and make sure each value matches a listener name on that Gateway. When the chart manages the Gateway (createGatewayResource: true), the listener names are always http, https, grpc, and grpcs. Setting an override in that case detaches the Routes from the Gateway with no error.

NGINX Gateway Fabric: ProxySettingsPolicy

If you are using the Gateway API with the NGINX Gateway Fabric, the default proxy buffer size is likely too small.

ProxySettingsPolicy documentation.

You may need to install a CRD to be able to create ProxySettingsPolicy resources. This can be found here: CRD location

An error that might indicate you need to change something is:

502: upstream sent too big header while reading response header from upstream

apiVersion: gateway.nginx.org/v1alpha1
kind: ProxySettingsPolicy
metadata:
name: camunda-platform
namespace: camunda
spec:
buffering:
bufferSize: 128k
buffers:
number: 8
size: 128k
busyBuffersSize: 256k
targetRefs:
- group: gateway.networking.k8s.io
kind: Gateway
name: camunda-platform