External exposure: Ingress and Gateway API
Page purpose
This page explains how to expose HTTP/HTTPS interfaces of TDP Kubernetes components outside the cluster, using Ingress or Gateway API.
Both models solve the same goal — publishing HTTP/HTTPS traffic with a stable hostname — but use different Kubernetes resources, depend on distinct controllers, and have separate configuration blocks in TDP charts.
When to expose a component externally
Expose a component when it needs to be accessed by users, browsers, external tools, or HTTP/HTTPS integrations outside the Kubernetes cluster — for example, when you want a stable address like https://superset.company.com instead of relying on temporary commands or local ports.
| Mode | When to use |
|---|---|
Internal Service (<SERVICE_NAME>.<NAMESPACE>.svc.cluster.local) | Communication between components inside the cluster |
kubectl port-forward | Temporary access for testing or diagnostics — depends on the terminal, not shared |
| Ingress | Stable HTTP/HTTPS hostname exposure using an Ingress Controller |
| Gateway API | Stable HTTP/HTTPS hostname exposure using a Gateway Controller and Gateway resource |
Ingress vs Gateway API
Ingress and Gateway API are alternatives for publishing HTTP/HTTPS traffic outside the cluster. The mode is chosen in the TDP-Settings.gateway block, but the detailed configuration is not the same in both models.
| Aspect | Ingress | Gateway API |
|---|---|---|
| Kubernetes resource created | Ingress | HTTPRoute (and optionally Gateway) |
| Required controller | Ingress Controller (NGINX, Traefik…) | Gateway Controller (Envoy Gateway, Istio…) |
| Entry resource in the cluster | Managed by the Ingress Controller | Gateway resource (created by the chart or pre-existing) |
| Controller association | ingressClassName | gatewayApi.gatewayClassName and gatewayApi.parentRefs |
| Hostname | hosts[].host or hostname | hostnames[] |
| Paths | paths[] | rules[].matches[] |
| Backend | Defined by the chart template or paths | backendRefs[] |
| TLS | ingress.tls or the component's equivalent block | In the Gateway or in certificateRefs |
Exclusivity rule
TDP-Settings.gateway.ingress.enabled and TDP-Settings.gateway.gatewayApi.enabled are mutually exclusive.
- Ingress:
TDP-Settings.gateway.ingress.enabled: trueandgatewayApi.enabled: false - Gateway API:
TDP-Settings.gateway.gatewayApi.enabled: trueandingress.enabled: false
Never enable both at the same time for the same component.
Prerequisites
Common to both modes:
- Component namespace created and chart installed (or values file prepared).
- DNS or
/etc/hostspointing the hostname to the entry controller address.
Ingress:
- Ingress Controller installed in the cluster (NGINX, Traefik, or equivalent).
ingressClassNameknown (kubectl get ingressclass).
Gateway API:
- Gateway Controller installed in the cluster.
GatewayClassavailable (kubectl get gatewayclass).- CRD
gateways.gateway.networking.k8s.ioinstalled.
For local testing, add the hostname to /etc/hosts:
# /etc/hosts
<CONTROLLER_IP> <COMPONENT_HOSTNAME>
Common configuration pattern
The control key is TDP-Settings.gateway. The detailed structure varies by chart — consult the table below, the component configuration page, or the values.yaml:
helm show values oci://registry.tecnisys.com.br/tdp/charts/<CHART_NAME> > default-values.yaml
Example:
helm show values oci://registry.tecnisys.com.br/tdp/charts/tdp-cloudbeaver > values-cloudbeaver.yaml
- Ingress
- Gateway API
How it works
In Ingress mode, the chart creates an Ingress resource in the cluster. An Ingress Controller receives external traffic and forwards it to the component Service based on the configured hostname and path.
Apply the values
Add the desired configuration to your values file and apply via Helm:
helm upgrade --install <RELEASE_NAME> \
oci://registry.tecnisys.com.br/tdp/charts/<CHART_NAME> \
-n <NAMESPACE> --create-namespace --timeout 10m \
-f <VALUES_FILE>
Replace <CHART_NAME> with the component chart name (e.g., tdp-jupyter, tdp-airflow). The full OCI path is in the support table above or on the component configuration page.
Test locally without DNS
If the hostname doesn't yet have a DNS entry, get the Ingress Controller IP and add it to /etc/hosts:
# Example for ingress-nginx — adjust namespace and Service name if different
kubectl get svc -n ingress-nginx ingress-nginx-controller \
-o jsonpath='{.status.loadBalancer.ingress[0].ip}'
# Add to /etc/hosts (replace with actual values)
echo "<CONTROLLER_IP> <COMPONENT_HOSTNAME>" | sudo tee -a /etc/hosts
Then access: http://<COMPONENT_HOSTNAME>
Common pattern (Jupyter, Kafka UI, ClickHouse, Airflow)
Components with top-level ingress.* follow this model:
TDP-Settings:
gateway:
ingress:
enabled: true
gatewayApi:
enabled: false
ingress:
ingressClassName: <INGRESS_CLASS>
hosts:
- host: <COMPONENT_HOSTNAME>
paths:
- path: /
pathType: Prefix
tls: []
JupyterHub
For long notebook sessions, add timeout annotations to the Ingress:
TDP-Settings:
gateway:
ingress:
enabled: true
gatewayApi:
enabled: false
ingress:
ingressClassName: <INGRESS_CLASS>
annotations:
nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
hosts:
- host: <JUPYTER_HOSTNAME>
paths:
- path: /
pathType: Prefix
tls: []
Without timeout annotations, cells with long execution can result in a gateway timeout (504).
Airflow
In addition to the Ingress, configure proxy and CORS in the subchart:
TDP-Settings:
gateway:
ingress:
enabled: true
gatewayApi:
enabled: false
ingress:
ingressClassName: <INGRESS_CLASS>
annotations: {}
hosts:
- host: <AIRFLOW_HOSTNAME>
paths:
- path: /
pathType: Prefix
tls: []
tdp-airflow:
config:
webserver:
base_url: "http://<AIRFLOW_HOSTNAME>"
x_forwarded_proto: "http"
x_forwarded_host: "<AIRFLOW_HOSTNAME>"
x_forwarded_port: "<SERVICE_PORT>"
api:
cors_enabled: "True"
cors_allow_origin: "*"
Argo CD
Uses its own structure under tdp-argo.server.ingress — not the top-level ingress block:
TDP-Settings:
gateway:
ingress:
enabled: true
gatewayApi:
enabled: false
tdp-argo:
configs:
params:
server.insecure: "true"
cm:
url: http://<ARGOCD_HOSTNAME>
server:
ingress:
enabled: true
controller: generic
hostname: <ARGOCD_HOSTNAME>
ingressClassName: <INGRESS_CLASS>
annotations: {}
path: /
pathType: Prefix
OpenShift
On OpenShift, use ingressClassName: openshift-default and the hostname follows the cluster's route pattern:
TDP-Settings:
gateway:
ingress:
enabled: true
gatewayApi:
enabled: false
tdp-argo:
configs:
params:
server.insecure: "true"
cm:
url: http://argocd-<NAMESPACE>.apps.<CLUSTER_DOMAIN>
server:
ingress:
enabled: true
controller: generic
ingressClassName: openshift-default
hostname: argocd-<NAMESPACE>.apps.<CLUSTER_DOMAIN>
path: /
pathType: Prefix
annotations: {}
ClickHouse
Ingress exposes the HTTP interface (8123). Configure extraUsers to allow connections from the Ingress network:
TDP-Settings:
gateway:
ingress:
enabled: true
gatewayApi:
enabled: false
tdp-clickhouse:
clickhouse:
extraUsers: |
<yandex>
<profiles>
<default>
<query_cache_system_table_handling>ignore</query_cache_system_table_handling>
</default>
</profiles>
<users>
<default>
<networks>
<ip>::/0</ip>
</networks>
</default>
</users>
</yandex>
ingress:
ingressClassName: <INGRESS_CLASS>
annotations: {}
hosts:
- host: <CLICKHOUSE_HOSTNAME>
paths:
- path: /
pathType: Prefix
tls: []
The native ClickHouse TCP port cannot be exposed via Ingress. Use port-forward, LoadBalancer, or NodePort for TCP access.
After exposure, access the ClickHouse web interfaces:
- Play UI:
http://<CLICKHOUSE_HOSTNAME>/play - Dashboard:
http://<CLICKHOUSE_HOSTNAME>/dashboard
CloudBeaver
Use tdp-cloudbeaver.ingress to publish the CloudBeaver web UI:
TDP-Settings:
gateway:
ingress:
enabled: true
gatewayApi:
enabled: false
tdp-cloudbeaver:
ingress:
ingressClassName: <INGRESS_CLASS>
annotations:
nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
hosts:
- host: <CLOUDBEAVER_HOSTNAME>
paths:
- path: /
pathType: Prefix
tls: false
Hostname examples:
- Standard Kubernetes:
cloudbeaver.tdp.local - OpenShift:
cloudbeaver-<NAMESPACE>.apps.<CLUSTER_DOMAIN>
Kafka UI
Exposes only the Kafka UI — not the Kafka brokers:
TDP-Settings:
gateway:
ingress:
enabled: true
gatewayApi:
enabled: false
ingress:
ingressClassName: <INGRESS_CLASS>
annotations: {}
hosts:
- host: <KAFKA_UI_HOSTNAME>
paths:
- path: /
pathType: Prefix
tls: []
Hostname examples:
- Standard Kubernetes:
kafka-ui.tdp.local - OpenShift:
kafka-ui-<NAMESPACE>.apps.<CLUSTER_DOMAIN>
Ingress publishes the Kafka UI web interface. External producers and consumers still need additional configuration to access the brokers (Kafka listeners), which is not covered by Ingress/Gateway API in this chart.
NiFi
NiFi uses ingress.rules (not ingress.hosts) as the Ingress structure, and requires session affinity annotations.
Standard Kubernetes (HTTP)
TDP-Settings:
gateway:
ingress:
enabled: true
gatewayApi:
enabled: false
ingress:
enabled: true
ingressClassName: <INGRESS_CLASS>
annotations:
nginx.ingress.kubernetes.io/backend-protocol: "HTTP"
nginx.ingress.kubernetes.io/affinity: "cookie"
nginx.ingress.kubernetes.io/affinity-mode: "persistent"
nginx.ingress.kubernetes.io/session-cookie-name: "INGRESSCOOKIE"
nginx.ingress.kubernetes.io/session-cookie-path: "/"
rules:
- host: <NIFI_HOSTNAME>
paths:
- path: /
pathType: Prefix
backend:
service:
name: tdp-nifi-service
port:
number: 8080
tls: []
Standard Kubernetes (HTTPS)
When nifiCluster.security.protocol: "https", change the annotation and port:
ingress:
annotations:
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
rules:
- host: <NIFI_HOSTNAME>
paths:
- path: /
pathType: Prefix
backend:
service:
name: tdp-nifi-service
port:
number: 8443
OpenShift
TDP-Settings:
gateway:
ingress:
enabled: true
gatewayApi:
enabled: false
ingress:
enabled: true
ingressClassName: openshift-default
annotations:
haproxy.router.openshift.io/balance: "cookie"
haproxy.router.openshift.io/cookie_name: "INGRESSCOOKIE"
rules:
- host: nifi-<NAMESPACE>.apps.<CLUSTER_DOMAIN>
paths:
- path: /
pathType: Prefix
backend:
service:
name: tdp-nifi-service
port:
number: 8080
tls: []
Hostname examples:
- Standard Kubernetes:
nifi.tdp.local - OpenShift:
nifi-<NAMESPACE>.apps.<CLUSTER_DOMAIN>
Use any name you prefer for the Ingress values file and pass it with -f <VALUES_FILE>.
OpenMetadata
For OpenMetadata, the Ingress configuration is under tdp-openmetadata.ingress.* (inside the subchart), not the root ingress.*.
Standard Kubernetes
TDP-Settings:
gateway:
ingress:
enabled: true
gatewayApi:
enabled: false
tdp-openmetadata:
ingress:
className: <INGRESS_CLASS>
annotations: {}
hosts:
- host: <OPENMETADATA_HOSTNAME>
paths:
- path: /
pathType: Prefix
tls: []
OpenShift
TDP-Settings:
gateway:
ingress:
enabled: true
gatewayApi:
enabled: false
tdp-openmetadata:
ingress:
className: openshift-default
annotations: {}
hosts:
- host: openmetadata-<NAMESPACE>.apps.<CLUSTER_DOMAIN>
paths:
- path: /
pathType: Prefix
tls: []
Hostname examples:
- Standard Kubernetes:
openmetadata.tdp.local - OpenShift:
openmetadata-<NAMESPACE>.apps.<CLUSTER_DOMAIN>
Ozone
Ozone exposes four independent endpoints: S3 Gateway REST, S3 Gateway Web UI, Ozone Manager UI, and SCM UI. Each endpoint has its own Ingress block:
TDP-Settings:
gateway:
ingress:
enabled: true
gatewayApi:
enabled: false
tdp-ozone:
ingress:
s3g:
rest:
enabled: true
ingressClassName: <INGRESS_CLASS>
annotations: {}
hosts:
- host: <OZONE_S3_REST_HOSTNAME>
paths:
- path: /
pathType: Prefix
tls: []
web:
enabled: true
ingressClassName: <INGRESS_CLASS>
annotations: {}
hosts:
- host: <OZONE_S3_WEB_HOSTNAME>
paths:
- path: /
pathType: Prefix
tls: []
om:
enabled: true
ingressClassName: <INGRESS_CLASS>
annotations: {}
hosts:
- host: <OZONE_OM_HOSTNAME>
paths:
- path: /
pathType: Prefix
tls: []
scm:
enabled: true
ingressClassName: <INGRESS_CLASS>
annotations: {}
hosts:
- host: <OZONE_SCM_HOSTNAME>
paths:
- path: /
pathType: Prefix
tls: []
Hostname examples:
- Standard Kubernetes:
ozone-s3.tdp.local,ozone-s3-ui.tdp.local,ozone-om.tdp.local,ozone-scm.tdp.local - OpenShift:
ozone-s3-<NAMESPACE>.apps.<CLUSTER_DOMAIN>,ozone-s3-ui-<NAMESPACE>.apps.<CLUSTER_DOMAIN>,ozone-om-<NAMESPACE>.apps.<CLUSTER_DOMAIN>,ozone-scm-<NAMESPACE>.apps.<CLUSTER_DOMAIN>
Ranger
TDP-Settings:
gateway:
ingress:
enabled: true
gatewayApi:
enabled: false
ingress:
ingressClassName: <INGRESS_CLASS>
annotations: {}
hosts:
- host: <RANGER_HOSTNAME>
paths:
- path: /
pathType: Prefix
tls: []
Hostname examples:
- Standard Kubernetes:
ranger.tdp.local - OpenShift:
ranger-<NAMESPACE>.apps.<CLUSTER_DOMAIN>
Superset
In Superset, the Ingress configuration is nested under tdp-superset.ingress.* (inside the subchart), not under the root ingress.*.
TDP-Settings:
gateway:
ingress:
enabled: true
gatewayApi:
enabled: false
tdp-superset:
ingress:
enabled: true
ingressClassName: <INGRESS_CLASS>
annotations: {}
path: /
pathType: Prefix
hosts:
- <SUPERSET_HOSTNAME>
tls: []
Hostname examples:
- Standard Kubernetes:
superset.tdp.local - OpenShift:
superset-<NAMESPACE>.apps.<CLUSTER_DOMAIN>
Trino
TDP-Settings:
gateway:
ingress:
enabled: true
gatewayApi:
enabled: false
ingress:
enabled: true
ingressClassName: <INGRESS_CLASS>
annotations: {}
path: /
pathType: Prefix
hosts:
- <TRINO_HOSTNAME>
tls: []
Hostname examples:
- Standard Kubernetes:
trino.tdp.local - OpenShift:
trino-<NAMESPACE>.apps.<CLUSTER_DOMAIN>
Spark
Spark requires additional reverse proxy parameters for the UI to work correctly via Ingress. The configuration is under spark.ingress.* (not the root ingress.*).
TDP-Settings:
gateway:
ingress:
enabled: true
gatewayApi:
enabled: false
spark:
ingress:
enabled: true
ingressClassName: <INGRESS_CLASS>
hostname: <SPARK_HOSTNAME>
path: /
pathType: Prefix
master:
configOptions: "-Dspark.ui.reverseProxy=true -Dspark.ui.reverseProxyUrl=http://<SPARK_HOSTNAME>"
worker:
configOptions: "-Dspark.ui.reverseProxy=true -Dspark.ui.reverseProxyUrl=http://<SPARK_HOSTNAME>"
sparkConf:
"spark.ui.reverseProxy": "true"
"spark.ui.reverseProxyUrl": "http://<SPARK_HOSTNAME>"
Examples:
- Standard Kubernetes:
<INGRESS_CLASS>: nginx,<SPARK_HOSTNAME>: spark.tdp.local - OpenShift:
<INGRESS_CLASS>: openshift-default,<SPARK_HOSTNAME>: spark-<NAMESPACE>.apps.<CLUSTER_DOMAIN>
TLS with Ingress
In the examples above, tls: [] means no TLS entry is configured. To enable HTTPS on the Ingress, replace the empty array with a list that follows the Kubernetes spec.tls format:
ingress:
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
tls:
- secretName: <SECRET_NAME>
hosts:
- <COMPONENT_HOSTNAME>
Use the same format in the component-specific block when the chart does not use top-level ingress.*, for example tdp-ozone.ingress.s3g.rest.tls or tdp-openmetadata.ingress.tls.
If the TLS Secret is created manually, it must exist in the component namespace before installation or upgrade. With cert-manager, the Ingress annotation requests automatic issuance/renewal and the controller writes the Secret referenced by secretName.
Validation
kubectl get ingress -n <NAMESPACE>
kubectl describe ingress <INGRESS_NAME> -n <NAMESPACE>
curl -I http://<COMPONENT_HOSTNAME>
Troubleshooting
| Problem | Diagnosis | Solution |
|---|---|---|
| Ingress not created | kubectl get ingress -n <NAMESPACE> shows nothing | Check TDP-Settings.gateway.ingress.enabled: true and re-apply Helm |
Incorrect ingressClassName | kubectl describe ingress shows error events | Run kubectl get ingressclass |
| Hostname does not resolve | curl fails with DNS lookup error | Configure /etc/hosts or DNS to point to the Ingress Controller IP |
| 404 Not Found | Ingress created but returns 404 | Check path and pathType |
| 502 Bad Gateway | Ingress created but service does not respond | Run kubectl get endpoints -n <NAMESPACE> |
ClickHouse AUTHENTICATION_FAILED | Access via Ingress rejected | Configure tdp-clickhouse.clickhouse.extraUsers with <ip>::/0</ip> |
| Airflow providers do not load | UI opens but resources fail | Check tdp-airflow.config.webserver.base_url and x_forwarded_* headers |
| Argo CD redirect loop | UI does not load correctly | Check server.insecure: "true" and configs.cm.url |
How it works
In Gateway API mode, the chart creates an HTTPRoute resource and, when gatewayApi.gateway.enabled: true, also a Gateway resource. A Gateway Controller processes these resources and forwards traffic to the component Service.
Apply the values
Add the desired configuration to your values file and apply via Helm:
helm upgrade --install <RELEASE_NAME> \
oci://registry.tecnisys.com.br/tdp/charts/<CHART_NAME> \
-n <NAMESPACE> --create-namespace --timeout 10m \
-f <VALUES_FILE>
Replace <CHART_NAME> with the component chart name (e.g., tdp-jupyter, tdp-airflow).
Access via Gateway API
After deploy, get the Gateway Controller IP and add it to /etc/hosts for local testing:
# Check the name and namespace of the created Gateway
kubectl get gateway -A
# Get the LoadBalancer IP of the Gateway Controller (adjust namespace/name)
kubectl get svc -n <GATEWAY_NAMESPACE> <GATEWAY_SERVICE> \
-o jsonpath='{.status.loadBalancer.ingress[0].ip}'
# Add to /etc/hosts (replace with actual values)
echo "<CONTROLLER_IP> <COMPONENT_HOSTNAME>" | sudo tee -a /etc/hosts
Then access: http://<COMPONENT_HOSTNAME>
Common Gateway API pattern
When the chart creates the Gateway automatically, the base structure is:
TDP-Settings:
gateway:
ingress:
enabled: false
gatewayApi:
enabled: true
gatewayApi:
gatewayClassName: <GATEWAY_CLASS>
gateway:
enabled: true
name: <GATEWAY_NAME>
listeners:
- name: web
port: 8000
protocol: HTTP
hostname: <COMPONENT_HOSTNAME>
parentRefs:
- name: <GATEWAY_NAME>
<CHART_VALUES_KEY>:
enabled: true
hostnames:
- <COMPONENT_HOSTNAME>
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- port: <SERVICE_PORT>
tls:
certificateRefs: []
Replace <CHART_VALUES_KEY> with the chart key (airflow, server, clickhouse, cloudbeaver, jupyter, kafkaUi).
Airflow
TDP-Settings:
gateway:
ingress:
enabled: false
gatewayApi:
enabled: true
gatewayApi:
gatewayClassName: <GATEWAY_CLASS>
gateway:
enabled: true
name: <GATEWAY_NAME>
listeners:
- name: web
port: 8000
protocol: HTTP
hostname: <AIRFLOW_HOSTNAME>
parentRefs:
- name: <GATEWAY_NAME>
airflow:
enabled: true
hostnames:
- <AIRFLOW_HOSTNAME>
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: ""
port: 8080
tls:
certificateRefs: []
tdp-airflow:
config:
webserver:
base_url: "http://<AIRFLOW_HOSTNAME>"
x_forwarded_proto: "http"
x_forwarded_host: "<AIRFLOW_HOSTNAME>"
x_forwarded_port: "<SERVICE_PORT>"
api:
cors_enabled: "True"
cors_allow_origin: "*"
Argo CD
TDP-Settings:
gateway:
ingress:
enabled: false
gatewayApi:
enabled: true
tdp-argo:
configs:
params:
server.insecure: "true"
cm:
url: http://<ARGOCD_HOSTNAME>
gatewayApi:
gatewayClassName: <GATEWAY_CLASS>
gateway:
enabled: true
name: <GATEWAY_NAME>
listeners:
- name: web
port: 8000
protocol: HTTP
hostname: <ARGOCD_HOSTNAME>
parentRefs:
- name: <GATEWAY_NAME>
namespace: <GATEWAY_NAMESPACE>
server:
enabled: true
hostnames:
- <ARGOCD_HOSTNAME>
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- port: 80
tls:
certificateRefs: []
ClickHouse
Requires extraUsers (same requirement as Ingress):
TDP-Settings:
gateway:
ingress:
enabled: false
gatewayApi:
enabled: true
tdp-clickhouse:
clickhouse:
extraUsers: |
<yandex>
<profiles>
<default>
<query_cache_system_table_handling>ignore</query_cache_system_table_handling>
</default>
</profiles>
<users>
<default>
<networks>
<ip>::/0</ip>
</networks>
</default>
</users>
</yandex>
gatewayApi:
gatewayClassName: <GATEWAY_CLASS>
gateway:
enabled: true
name: <GATEWAY_NAME>
listeners:
- name: web
port: 8000
protocol: HTTP
hostname: <CLICKHOUSE_HOSTNAME>
parentRefs:
- name: <GATEWAY_NAME>
clickhouse:
enabled: true
hostnames:
- <CLICKHOUSE_HOSTNAME>
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: ""
port: 8123
tls:
certificateRefs: []
After exposure, access the ClickHouse web interfaces:
- Play UI:
http://<CLICKHOUSE_HOSTNAME>/play - Dashboard:
http://<CLICKHOUSE_HOSTNAME>/dashboard
CloudBeaver
TDP-Settings:
gateway:
ingress:
enabled: false
gatewayApi:
enabled: true
gatewayApi:
gatewayClassName: <GATEWAY_CLASS>
gateway:
enabled: true
name: <GATEWAY_NAME>
listeners:
- name: web
port: 8000
protocol: HTTP
hostname: <CLOUDBEAVER_HOSTNAME>
parentRefs:
- name: <GATEWAY_NAME>
cloudbeaver:
enabled: true
hostnames:
- <CLOUDBEAVER_HOSTNAME>
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: ""
port: 8978
tls:
certificateRefs: []
Jupyter (common pattern)
TDP-Settings:
gateway:
ingress:
enabled: false
gatewayApi:
enabled: true
gatewayApi:
gatewayClassName: <GATEWAY_CLASS>
gateway:
enabled: true
name: <GATEWAY_NAME>
listeners:
- name: web
port: 8000
protocol: HTTP
hostname: <JUPYTER_HOSTNAME>
parentRefs:
- name: <GATEWAY_NAME>
jupyter:
enabled: true
hostnames:
- <JUPYTER_HOSTNAME>
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: ""
port: 80
tls:
certificateRefs: []
Kafka UI
TDP-Settings:
gateway:
ingress:
enabled: false
gatewayApi:
enabled: true
gatewayApi:
gatewayClassName: <GATEWAY_CLASS>
gateway:
enabled: true
name: <GATEWAY_NAME>
listeners:
- name: web
port: 8000
protocol: HTTP
hostname: <KAFKA_UI_HOSTNAME>
parentRefs:
- name: <GATEWAY_NAME>
kafkaUi:
enabled: true
hostnames:
- <KAFKA_UI_HOSTNAME>
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: ""
port: 80
tls:
certificateRefs: []
Gateway API publishes only the Kafka UI. The Kafka brokers remain accessible internally via listeners configured in the chart — not via HTTPRoute.
OpenMetadata
OpenMetadata uses TDP-Settings (not TDP-Settings) to control the exposure mode.
The backend operates on port 8585 (API and web interface).
TDP-Settings:
gateway:
ingress:
enabled: false
gatewayApi:
enabled: true
gatewayApi:
gatewayClassName: <GATEWAY_CLASS>
gateway:
enabled: true
name: <GATEWAY_NAME>
listeners:
- name: web
port: 8000
protocol: HTTP
hostname: <OPENMETADATA_HOSTNAME>
parentRefs:
- name: <GATEWAY_NAME>
openmetadata:
enabled: true
hostnames:
- <OPENMETADATA_HOSTNAME>
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: ""
port: 8585
tls:
certificateRefs: []
Hostname examples:
- Standard Kubernetes:
openmetadata.tdp.local - OpenShift:
openmetadata-<NAMESPACE>.apps.<CLUSTER_DOMAIN>
NiFi
NiFi uses TDP-Settings (not TDP-Settings) to control the exposure mode.
The backend uses port 8080 (HTTP) or 8443 (HTTPS), depending on nifiCluster.security.protocol.
TDP-Settings:
gateway:
ingress:
enabled: false
gatewayApi:
enabled: true
gatewayApi:
parentRefs:
- name: <GATEWAY_NAME>
namespace: <GATEWAY_NAMESPACE>
nifi:
enabled: true
hostnames:
- <NIFI_HOSTNAME>
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: ""
port: 8080
tls:
certificateRefs: []
Use any name you prefer for the Gateway API values file and pass it with -f <VALUES_FILE>.
Ozone
Ozone exposes four endpoints via Gateway API: S3 REST, S3 Web UI, OM UI, and SCM UI:
TDP-Settings:
gateway:
ingress:
enabled: false
gatewayApi:
enabled: true
tdp-ozone:
gatewayApi:
parentRefs:
- name: <GATEWAY_NAME>
namespace: <GATEWAY_NAMESPACE>
s3g:
rest:
enabled: true
hostnames:
- <OZONE_S3_REST_HOSTNAME>
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: ""
port: 9878
tls:
certificateRefs: []
web:
enabled: true
hostnames:
- <OZONE_S3_WEB_HOSTNAME>
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: ""
port: 19878
tls:
certificateRefs: []
om:
enabled: true
hostnames:
- <OZONE_OM_HOSTNAME>
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: ""
port: 9874
tls:
certificateRefs: []
scm:
enabled: true
hostnames:
- <OZONE_SCM_HOSTNAME>
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: ""
port: 9876
tls:
certificateRefs: []
Hostname examples:
- Standard Kubernetes:
ozone-s3.tdp.local,ozone-s3-ui.tdp.local,ozone-om.tdp.local,ozone-scm.tdp.local - OpenShift:
ozone-s3-<NAMESPACE>.apps.<CLUSTER_DOMAIN>,ozone-s3-ui-<NAMESPACE>.apps.<CLUSTER_DOMAIN>,ozone-om-<NAMESPACE>.apps.<CLUSTER_DOMAIN>,ozone-scm-<NAMESPACE>.apps.<CLUSTER_DOMAIN>