ExternalDNS — инструмент для автоматического управления DNS-записями на основе ресурсов Kubernetes. Он обновляет DNS-записи в соответствии с аннотациями, указанными в манифестах сервисов и ingress-ресурсов. ExternalDNS помогает упростить управление доменными именами для сервисов в кластере Kubernetes, устраняя необходимость вручную изменять записи в панели управления DNS.
Для установки ExternalDNS откройте панель управления кластером, перейдите во вкладку «Дополнения», нажмите на три точки рядом с ExternalDNS и нажмите «Установить».
После установки дождитесь обновления кластера и убедитесь, что ресурсы ExternalDNS имеют статус «Running»:
kubectl get pods -n external-dns
Перед использованием ExternalDNS необходимо вручную создать домены в панели управления, чтобы ExternalDNS мог управлять их записями.
ExternalDNS управляет DNS-записями на основе аннотаций в манифестах. Например, для привязки доменного имени к Ingress-ресурсу можно использовать следующий манифест:
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
Описание аннотаций:
external-dns.alpha.kubernetes.io/hostname
— задает доменное имя, которое будет связано с этим ресурсом.
external-dns.alpha.kubernetes.io/ttl
— задает TTL DNS-записи в секундах.
Этот вариант подойдет, если Ingress-контроллер развернут на всех узлах. Однако у него есть недостатки:
Если Ingress-контроллер работает не на всех узлах, часть трафика может отправляться на недоступные IP-адреса.
Kubernetes может переместить поды на другие узлы, изменив IP-адреса, что приведет к недоступности сервиса.
DNS-балансировка не учитывает доступность узлов, из-за чего могут возникнуть потери трафика.
Один из удобных способов работы с ExternalDNS — использовать его с балансировщиком нагрузки. В этом случае сервис получает фиксированный внешний IP-адрес и балансирует трафик между подами. ExternalDNS автоматически создаст DNS-запись с этим IP-адресом. Пример манифеста:
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
В этом примере балансировщик направляет трафик в поды с app.kubernetes.io/name: ingress-nginx
, где работает Ingress-контроллер.
Использование ExternalDNS с балансировщиком нагрузки упрощает управление DNS. Вместо того чтобы следить за изменением IP-адресов на разных узлах, достаточно привязать доменное имя к одному фиксированному IP. Это снижает риски недоступности из-за смены узлов, а балансировка нагрузки между подами обеспечивает стабильную работу сервиса. При изменении конфигурации кластера ExternalDNS автоматически обновит DNS-запись, исключая необходимость ручного вмешательства.