O ExternalDNS é uma ferramenta para gerenciar automaticamente registros DNS com base em recursos do Kubernetes. Ele atualiza os registros DNS de acordo com as anotações especificadas nos manifests de Services e Ingress.
O ExternalDNS simplifica o gerenciamento de domínios para serviços em um cluster Kubernetes, eliminando a necessidade de alterar registros manualmente no painel de controle de DNS.
Para instalar o ExternalDNS:
Após a instalação, aguarde a atualização do cluster e verifique se os recursos do ExternalDNS estão no estado Running:
kubectl get pods -n external-dns
Antes de usar o ExternalDNS, você deve criar manualmente os domínios no painel de controle para que o ExternalDNS possa gerenciar os registros deles.
O ExternalDNS gerencia registros DNS com base em anotações nos manifests. Por exemplo, para associar um domínio a um recurso Ingress, você pode usar o seguinte manifesto:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
namespace: ingress-example
annotations:
external-dns.alpha.kubernetes.io/hostname: "app.example.com"
external-dns.alpha.kubernetes.io/ttl: "1200"
spec:
rules:
- host: app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-app
port:
number: 80
Descrição das anotações:
external-dns.alpha.kubernetes.io/hostname: especifica o nome de domínio que será associado a este recurso.external-dns.alpha.kubernetes.io/ttl: define o TTL do registro DNS em segundos.Esse método é adequado quando o controlador de Ingress está implantado em todos os nós. No entanto, ele apresenta algumas desvantagens:
Uma das formas mais eficientes de usar o ExternalDNS é em conjunto com um load balancer. Nesse caso, o serviço recebe um IP externo fixo e distribui o tráfego entre os pods. O ExternalDNS cria automaticamente um registro DNS apontando para esse IP.
Exemplo de manifesto:
apiVersion: v1
kind: Service
metadata:
name: ingress-nginx
namespace: ingress-nginx
annotations:
external-dns.alpha.kubernetes.io/hostname: "app.example.com"
external-dns.alpha.kubernetes.io/ttl: "1200"
spec:
selector:
app.kubernetes.io/name: ingress-nginx
ports:
- name: http
port: 80
targetPort: 80
- name: https
port: 443
targetPort: 443
type: LoadBalancer
Neste exemplo, o load balancer direciona o tráfego para pods com o rótulo app.kubernetes.io/name: ingress-nginx, onde o controlador de Ingress está em execução.
Usar o ExternalDNS com um load balancer simplifica o gerenciamento de DNS. Em vez de acompanhar mudanças de IP em diferentes nós, você só precisa associar o domínio a um único IP fixo. Isso reduz o risco de indisponibilidade causada por mudanças de nós, e o balanceamento entre pods garante maior estabilidade do serviço.
Se a configuração do cluster mudar, o ExternalDNS atualizará automaticamente o registro DNS, eliminando a necessidade de intervenção manual.