Saltar para o conteúdo principal
Versão 3.0

Exposição externa: Ingress e Gateway API

CompatibilidadeKubernetes1.32+OpenShift4.19+Rancher2.10.x+Helm3.2.0+

Objetivo da página

Esta página explica como expor interfaces HTTP/HTTPS de componentes do TDP Kubernetes para fora do cluster, usando Ingress ou Gateway API.

Os dois modelos resolvem o mesmo objetivo — publicar tráfego HTTP/HTTPS com hostname estável — mas usam recursos Kubernetes diferentes, dependem de controladores distintos e têm blocos de configuração separados nos charts TDP.

Quando expor um componente externamente

Exponha um componente quando ele precisa ser acessado por usuários, navegadores, ferramentas externas ou integrações HTTP/HTTPS fora do cluster Kubernetes — por exemplo, quando você quer um endereço estável como https://superset.empresa.com em vez de depender de comandos temporários ou portas locais.

ModoQuando usar
Service interno (<SERVICE_NAME>.<NAMESPACE>.svc.cluster.local)Comunicação entre componentes dentro do cluster
kubectl port-forwardAcesso temporário para teste ou diagnóstico — depende do terminal, não é compartilhado
IngressExposição estável com hostname HTTP/HTTPS usando um Ingress Controller
Gateway APIExposição estável com hostname HTTP/HTTPS usando um Gateway Controller e recurso Gateway

Ingress vs Gateway API

Ingress e Gateway API são alternativas para publicar tráfego HTTP/HTTPS para fora do cluster. A escolha do modo é feita no bloco TDP-Settings.gateway, mas a configuração detalhada não é igual nos dois modelos.

AspectoIngressGateway API
Recurso Kubernetes criadoIngressHTTPRoute (e opcionalmente Gateway)
Controlador necessárioIngress Controller (NGINX, Traefik…)Gateway Controller (Envoy Gateway, Istio…)
Recurso de entrada no clusterGerenciado pelo Ingress ControllerRecurso Gateway (criado pelo chart ou pré-existente)
Associação ao controladoringressClassNamegatewayApi.gatewayClassName e gatewayApi.parentRefs
Hostnamehosts[].host ou hostnamehostnames[]
Caminhospaths[]rules[].matches[]
BackendDefinido pelo template do chart ou pelos pathsbackendRefs[]
TLSingress.tls ou bloco equivalente do componenteNo Gateway ou em certificateRefs

Regra de exclusividade

Use apenas um modo por componente

TDP-Settings.gateway.ingress.enabled e TDP-Settings.gateway.gatewayApi.enabled são mutuamente exclusivos.

  • Ingress: TDP-Settings.gateway.ingress.enabled: true e gatewayApi.enabled: false
  • Gateway API: TDP-Settings.gateway.gatewayApi.enabled: true e ingress.enabled: false

Nunca habilite os dois ao mesmo tempo para o mesmo componente.

Pré-requisitos

Comuns a ambos os modos:

  • Namespace do componente criado e chart instalado (ou arquivo de valores preparado).
  • DNS ou /etc/hosts apontando o hostname para o endereço do controlador de entrada.

Ingress:

  • Ingress Controller instalado no cluster (NGINX, Traefik ou equivalente).
  • ingressClassName conhecido (kubectl get ingressclass).

Gateway API:

  • Gateway Controller instalado no cluster.
  • GatewayClass disponível (kubectl get gatewayclass).
  • CRD gateways.gateway.networking.k8s.io instalada.

Para testes locais, adicione o hostname ao /etc/hosts:

# /etc/hosts
<CONTROLLER_IP> <COMPONENT_HOSTNAME>

Padrão comum de configuração

A chave de controle é TDP-Settings.gateway. A estrutura detalhada varia por chart — consulte a tabela abaixo, a página de configuração do componente ou o values.yaml:

Terminal input
helm show values oci://registry.tecnisys.com.br/tdp/charts/<CHART_NAME> > values-padrao.yaml

Exemplo:

Terminal input
helm show values oci://registry.tecnisys.com.br/tdp/charts/tdp-cloudbeaver > values-cloudbeaver.yaml

Como funciona

No modo Ingress, o chart cria um recurso Ingress no cluster. Um Ingress Controller recebe o tráfego externo e o encaminha para o Service do componente com base no hostname e no path configurados.

Aplicar os valores

Adicione a configuração desejada ao seu arquivo de values e aplique via Helm:

Terminal input
helm upgrade --install <RELEASE_NAME> \
oci://registry.tecnisys.com.br/tdp/charts/<CHART_NAME> \
-n <NAMESPACE> --create-namespace --timeout 10m \
-f <VALUES_FILE>

Substitua <CHART_NAME> pelo nome do chart do componente (ex.: tdp-jupyter, tdp-airflow). O caminho OCI completo está na tabela de suporte acima ou na página de configuração do componente.

Teste local sem DNS

Se o hostname ainda não tiver entrada DNS, obtenha o IP do Ingress Controller e adicione ao /etc/hosts:

Terminal input
# Exemplo para ingress-nginx — ajuste namespace e nome do Service se diferente
kubectl get svc -n ingress-nginx ingress-nginx-controller \
-o jsonpath='{.status.loadBalancer.ingress[0].ip}'

# Adicione ao /etc/hosts (substitua pelos valores reais)
echo "<CONTROLLER_IP> <COMPONENT_HOSTNAME>" | sudo tee -a /etc/hosts

Acesse em seguida: http://<COMPONENT_HOSTNAME>

Padrão comum (Jupyter, Kafka UI, ClickHouse, Airflow)

Componentes com ingress.* top-level seguem este modelo:

TDP-Settings:
gateway:
ingress:
enabled: true
gatewayApi:
enabled: false

ingress:
ingressClassName: <INGRESS_CLASS>
hosts:
- host: <COMPONENT_HOSTNAME>
paths:
- path: /
pathType: Prefix
tls: []

JupyterHub

Para sessões longas de notebook, adicione as anotações de timeout ao 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: []

Sem as anotações de timeout, células com execução demorada podem resultar em timeout do gateway (504).

Airflow

Além do Ingress, configure proxy e CORS no 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

Usa estrutura própria em tdp-argo.server.ingressnão o bloco ingress top-level:

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

No OpenShift, use ingressClassName: openshift-default e o hostname segue o padrão de rotas do cluster:

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 expõe a interface HTTP (8123). Configure extraUsers para permitir conexões da rede do Ingress:

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: []
TCP nativo (porta 9000)

A porta TCP nativa do ClickHouse não pode ser exposta via Ingress. Use port-forward, LoadBalancer ou NodePort para acesso TCP.

Após a exposição, acesse as interfaces web do ClickHouse:

  • Play UI: http://<CLICKHOUSE_HOSTNAME>/play
  • Dashboard: http://<CLICKHOUSE_HOSTNAME>/dashboard

CloudBeaver

Use tdp-cloudbeaver.ingress para publicar a interface web do CloudBeaver:

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

Exemplos de hostname:

  • Kubernetes padrão: cloudbeaver.tdp.local
  • OpenShift: cloudbeaver-<NAMESPACE>.apps.<CLUSTER_DOMAIN>

Kafka UI

Expõe apenas a Kafka UI — não os brokers Kafka:

TDP-Settings:
gateway:
ingress:
enabled: true
gatewayApi:
enabled: false

ingress:
ingressClassName: <INGRESS_CLASS> # ex.: nginx, openshift-default
annotations: {}
hosts:
- host: <KAFKA_UI_HOSTNAME>
paths:
- path: /
pathType: Prefix
tls: []

Exemplos de hostname:

  • Kubernetes padrão: kafka-ui.tdp.local
  • OpenShift: kafka-ui-<NAMESPACE>.apps.<CLUSTER_DOMAIN>
Kafka UI ≠ brokers Kafka

O Ingress publica a interface web da Kafka UI. Produtores e consumidores externos continuam precisando de configuração adicional para acessar os brokers (listeners Kafka), que não é coberta por Ingress/Gateway API neste chart.

NiFi

O NiFi usa ingress.rules (não ingress.hosts) como estrutura de Ingress, e requer anotações de afinidade de sessão.

Kubernetes padrão (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: []

Kubernetes padrão (HTTPS)

Quando nifiCluster.security.protocol: "https", altere a anotação e a porta:

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: []

Exemplos de hostname:

  • Kubernetes padrão: nifi.tdp.local
  • OpenShift: nifi-<NAMESPACE>.apps.<CLUSTER_DOMAIN>
Nome do arquivo de valores

Use o nome que preferir para o arquivo de valores de Ingress e passe com -f <VALUES_FILE>.

OpenMetadata

No OpenMetadata, a configuração de Ingress fica sob tdp-openmetadata.ingress.* (dentro do subchart), não no ingress.* raiz.

Kubernetes padrão

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: []

Exemplos de hostname:

  • Kubernetes padrão: openmetadata.tdp.local
  • OpenShift: openmetadata-<NAMESPACE>.apps.<CLUSTER_DOMAIN>

Ozone

O Ozone expõe quatro endpoints independentes: S3 Gateway REST, S3 Gateway Web UI, Ozone Manager UI e SCM UI. Cada endpoint tem seu próprio bloco de Ingress:

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: []

Exemplos de hostname:

  • Kubernetes padrão: 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: []

Exemplos de hostname:

  • Kubernetes padrão: ranger.tdp.local
  • OpenShift: ranger-<NAMESPACE>.apps.<CLUSTER_DOMAIN>

Superset

No Superset, a configuração de Ingress fica sob tdp-superset.ingress.* (dentro do subchart), não no ingress.* raiz.

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: []

Exemplos de hostname:

  • Kubernetes padrão: 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: []

Exemplos de hostname:

  • Kubernetes padrão: trino.tdp.local
  • OpenShift: trino-<NAMESPACE>.apps.<CLUSTER_DOMAIN>

Spark

O Spark requer parâmetros adicionais de reverse proxy para que a UI funcione corretamente via Ingress. A configuração fica em spark.ingress.* (não no ingress.* raiz).

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>"

Exemplos:

  • Kubernetes padrão: <INGRESS_CLASS>: nginx, <SPARK_HOSTNAME>: spark.tdp.local
  • OpenShift: <INGRESS_CLASS>: openshift-default, <SPARK_HOSTNAME>: spark-<NAMESPACE>.apps.<CLUSTER_DOMAIN>

TLS com Ingress

Nos exemplos anteriores, tls: [] indica que nenhuma entrada TLS foi definida. Para habilitar HTTPS no Ingress, substitua o array vazio por uma lista no formato de spec.tls do Kubernetes:

ingress:
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
tls:
- secretName: <SECRET_NAME>
hosts:
- <COMPONENT_HOSTNAME>

Use o mesmo formato no bloco equivalente do componente quando o chart não usa ingress.* top-level, por exemplo tdp-ozone.ingress.s3g.rest.tls ou tdp-openmetadata.ingress.tls.

Se o Secret TLS for criado manualmente, ele deve existir no namespace do componente antes da instalação ou atualização. Com cert-manager, a anotação do Ingress solicita a emissão/renovação automática e o controlador grava o Secret indicado em secretName.

Validação

Terminal input
kubectl get ingress -n <NAMESPACE>
kubectl describe ingress <INGRESS_NAME> -n <NAMESPACE>
curl -I http://<COMPONENT_HOSTNAME>

Resolução de problemas

ProblemaDiagnósticoSolução
Ingress não criadokubectl get ingress -n <NAMESPACE> não listaVerifique TDP-Settings.gateway.ingress.enabled: true e reaplique o Helm
ingressClassName incorretokubectl describe ingress mostra eventos de erroExecute kubectl get ingressclass
Hostname não resolvecurl falha com DNS lookup errorConfigure /etc/hosts ou DNS para o IP do Ingress Controller
404 Not FoundIngress criado mas retorna 404Verifique path e pathType
502 Bad GatewayIngress criado mas serviço não respondeExecute kubectl get endpoints -n <NAMESPACE>
ClickHouse AUTHENTICATION_FAILEDAcesso via Ingress rejeitadoConfigure tdp-clickhouse.clickhouse.extraUsers com <ip>::/0</ip>
Airflow providers não carregamUI abre mas recursos falhamVerifique tdp-airflow.config.webserver.base_url e headers x_forwarded_*
Argo CD redirect loopUI não carrega corretamenteVerifique server.insecure: "true" e configs.cm.url