Exposição externa: Ingress e Gateway API
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.
| Modo | Quando usar |
|---|---|
Service interno (<SERVICE_NAME>.<NAMESPACE>.svc.cluster.local) | Comunicação entre componentes dentro do cluster |
kubectl port-forward | Acesso temporário para teste ou diagnóstico — depende do terminal, não é compartilhado |
| Ingress | Exposição estável com hostname HTTP/HTTPS usando um Ingress Controller |
| Gateway API | Exposiçã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.
| Aspecto | Ingress | Gateway API |
|---|---|---|
| Recurso Kubernetes criado | Ingress | HTTPRoute (e opcionalmente Gateway) |
| Controlador necessário | Ingress Controller (NGINX, Traefik…) | Gateway Controller (Envoy Gateway, Istio…) |
| Recurso de entrada no cluster | Gerenciado pelo Ingress Controller | Recurso Gateway (criado pelo chart ou pré-existente) |
| Associação ao controlador | ingressClassName | gatewayApi.gatewayClassName e gatewayApi.parentRefs |
| Hostname | hosts[].host ou hostname | hostnames[] |
| Caminhos | paths[] | rules[].matches[] |
| Backend | Definido pelo template do chart ou pelos paths | backendRefs[] |
| TLS | ingress.tls ou bloco equivalente do componente | No Gateway ou em certificateRefs |
Regra de exclusividade
TDP-Settings.gateway.ingress.enabled e TDP-Settings.gateway.gatewayApi.enabled são mutuamente exclusivos.
- Ingress:
TDP-Settings.gateway.ingress.enabled: trueegatewayApi.enabled: false - Gateway API:
TDP-Settings.gateway.gatewayApi.enabled: trueeingress.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/hostsapontando o hostname para o endereço do controlador de entrada.
Ingress:
- Ingress Controller instalado no cluster (NGINX, Traefik ou equivalente).
ingressClassNameconhecido (kubectl get ingressclass).
Gateway API:
- Gateway Controller instalado no cluster.
GatewayClassdisponível (kubectl get gatewayclass).- CRD
gateways.gateway.networking.k8s.ioinstalada.
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:
helm show values oci://registry.tecnisys.com.br/tdp/charts/<CHART_NAME> > values-padrao.yaml
Exemplo:
helm show values oci://registry.tecnisys.com.br/tdp/charts/tdp-cloudbeaver > values-cloudbeaver.yaml
- Ingress
- Gateway API
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:
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:
# 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.ingress — nã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: []
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>