Skip to content

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.tpl
  • infrastructure/modules/oke-extras/helm.tf
  • config/hml/oke-extras/config.hcl
  • config/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:

  • ingress
  • gateway-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:

  1. declarar o hostname corretamente
  2. apontar para o Gateway esperado
  3. 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:

  1. o HTTPRoute declara o host
  2. o ExternalDNS cria o registro público
  3. o DNS aponta para o target do Gateway
  4. 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.