DNS Automático¶
Objetivo¶
O DNS automático dos ambientes HML e NOX é feito pelo chart do ExternalDNS, instalado pelo módulo oke-extras. O papel dele é observar recursos Kubernetes suportados, extrair hostnames válidos e reconciliar os registros na zona OCI configurada.
Fonte de verdade no pipeline¶
Os arquivos principais são:
infrastructure/modules/oke-extras/templates/external-dns-values.tplinfrastructure/modules/oke-extras/helm.tfconfig/hml/oke-extras/config.hclconfig/nox/oke-extras/config.hcl
Como o chart é instalado¶
O módulo oke-extras instala o chart external-dns via Helm:
```terraform resource "helm_release" "external_dns" { repository = "oci://registry-1.docker.io/bitnamicharts" chart = "external-dns" version = var.charts_config.external_dns.version
name = "external-dns" namespace = "external-dns"
values = local.external_dns_values } ```
Nos ambientes atuais, a versão é controlada em charts_config.external_dns.version dentro dos arquivos config/{env}/oke-extras/config.hcl.
Valores aplicados pelo módulo¶
O template external-dns-values.tpl produz a configuração abaixo:
```yaml extraArgs: combine-fqdn-annotation: "" annotation-filter: "external-dns.enabled==true"
policy: sync txtOwnerId: "${ENV}"
domainFilters: - ${DOMAIN}
sources: - ingress - gateway-httproute
provider: oci oci: useInstancePrincipal: true region: ${REGION} compartmentOCID: ${COMPARTMENT_OCID} ```
O que cada configuração faz¶
annotation-filter: "external-dns.enabled==true"¶
Somente recursos com essa annotation entram na reconciliação. Isso evita publicar registros para qualquer Ingress ou HTTPRoute criado por engano.
Contrato prático:
- se o recurso não tiver
external-dns.enabled: "true", o ExternalDNS ignora - se tiver, ele passa a extrair hostnames e reconciliar DNS
sources¶
Os recursos observados são:
ingressgateway-httproute
Isso cobre dois padrões do ambiente:
- aplicações normais usando Gateway API e
HTTPRoute - Kiali usando NGINX Ingress
domainFilters¶
Restringe a atuação ao domínio configurado, hoje nox.app.br. Isso reduz risco de publicar registros fora da zona esperada.
policy: sync¶
O modo sync faz o ExternalDNS convergir o DNS ao estado atual do cluster:
- cria registros necessários
- atualiza registros quando os hosts mudam
- remove registros quando os recursos deixam de existir
txtOwnerId¶
Cria marcadores TXT por ambiente. Isso evita conflito entre múltiplas instâncias do ExternalDNS operando em zonas iguais ou parcialmente sobrepostas.
provider: oci + useInstancePrincipal: true¶
O controller autentica usando Instance Principal e escreve diretamente na zona OCI DNS, sem secret manual de credenciais para o provider.
O que uma aplicação precisa para ganhar DNS automático¶
Via HTTPRoute¶
O chart ou manifest precisa, no mínimo:
- declarar o hostname corretamente
- apontar para o Gateway esperado
- incluir
external-dns.enabled: "true"
Exemplo conceitual:
yaml
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
annotations:
external-dns.enabled: "true"
spec:
hostnames:
- tre.nox.app.br
Via Ingress¶
O mesmo princípio vale para Ingresses. O caso mais relevante hoje é o Kiali.
Integração com Istio¶
No padrão principal das aplicações:
- o
HTTPRoutedeclara o host - o ExternalDNS cria o registro público
- o DNS aponta para o target do Gateway
- o Gateway do Istio recebe o tráfego e encaminha para o backend
Os detalhes de Gateway, wildcard TLS e lb_publlic_ip estão em Istio & Gateway API.
Limite de responsabilidade¶
O módulo configura o controller e a política de reconciliação. Ele não garante sozinho que o tráfego externo chegará ao cluster. Isso ainda depende de:
- IP público correto no DNS
- NAT/firewall de borda quando existir
- reachability entre borda e balanceador interno
Esse ponto fica especialmente importante quando o Gateway está anotado como internal LB e o DNS aponta para um IP público externo.