Home
home

05. ExternalDNS

1. ExternalDNS 란?

: ExternalDNS는 쿠버네티스 클러스터에서 실행되는 애플리케이션의 도메인 서비스를 위해 외부 DNS 제공자의 DNS 레코드를 자동으로 생성하고 관리하는 오픈소스 도구입니다. 이를 통해 쿠버네티스 자원을 기반으로 DNS 레코드를 동적으로 업데이트하여 애플리케이션을 외부에서 쉽게 접근할 수 있도록 지원합니다.
[Caption] ExternalDNS 소개

2. ExternalDNS 주요 기능

DNS 레코드 자동 생성
쿠버네티스 자원을 감지하여 외부 DNS 제공자에 A 레코드 또는 CNAME 레코드를 생성합니다.
다양한 DNS 제공자 지원
AWS Route 53, Google Cloud DNS, Cloudflare, Azure DNS 등 (Custom Provider 지원)
TTL(Time-To-Live) 설정
생성된 DNS 레코드의 TTL 값을 설정 가능합니다.
동적 업데이트 및 삭제
연결된 자원이 삭제되거나 변경되면 관련된 DNS 레코드도 자동으로 업데이트 또는 삭제합니다.
멀티테넌시 지원
여러 네임스페이스에서 각각의 도메인을 관리할 수 있도록 설정 가능합니다.

3. ExternalDNS 작동 원리

1.
쿠버네티스 API 서버가 Ingress 또는 Service의 이벤트를 감시합니다.
2.
탐지된 리소스를 기반으로 외부 DNS 제공자에게 API 호출을 통해 DNS 레코드 생성, 업데이트, 삭제 작업을 진행합니다.
3.
사용자가 정의한 Annotation을 기반으로 세부 동작을 제어합니다.
ExternalDNS 작동 흐름 정리 Ingress 또는 Service 생성 → ExternalDNS 감지 → 외부 DNS 제공자에 API 호출 → 레코드 생성

4. ExternalDNS 설치 및 확인

Helm을 통한 설치
helm repo add external-dns https://kubernetes-sigs.github.io/external-dns/ helm repo update
Bash
복사
# helm 저장소 추가 및 업데이트
helm install external-dns external-dns/external-dns -n kube-system \ --set serviceAccount.create=false \ --set serviceAccount.name=external-dns-sa \ --set domainFilters={{MyDomain}} \ --set txtOwnerId={DnsHostedZoneId}
Bash
복사
# helm으로 external-dns 설치
YAML 매니페스트를 통한 설치
curl -s -O https://raw.githubusercontent.com/cloudneta/cnaeblab/master/_data/externaldns.yaml
Bash
복사
# YAML 파일 다운로드
MyDomain=<자신의 도메인> echo "export MyDomain=$MyDomain" >> /etc/profile echo $MyDomain
Bash
복사
# 도메인 주소 변수 지정
MyDnsHostedZoneId=`aws route53 list-hosted-zones-by-name --dns-name "${MyDomain}." --query "HostedZones[0].Id" --output text` echo "export MyDnsHostedZoneId=$MyDnsHostedZoneId" >> /etc/profile echo $MyDnsHostedZoneId
Bash
복사
# 도메인 ID 변수 지정
MyDomain=$MyDomain MyDnsHostedZoneId=$MyDnsHostedZoneId envsubst < externaldns.yaml | kubectl apply -f -
Bash
복사
# yaml 파일에 변수 치환 후 배포
설치 확인
kubectl get pod -l app.kubernetes.io/name=external-dns -n kube-system
Bash
복사
# ExternalDNS 설치 확인

5. ExternalDNS 고려 사항

Route 53 자원을 관리하기 위해 IRSA(IAM Role for Service Account)를 지정하는데 필요한 권한만 최소화하여 설정합니다.
TTL 값을 설정할 때는 Annotation에서 external-dns.alpha.kubernetes.io/ttl 주석을 추가합니다.
네임 스페이스 별로 도메인을 분리하거나 특정 네임스페이스만 관리하도록 멀티테넌시 환경을 설정할 수 있습니다.
ExternalDNS는 충돌 방지를 위해 TXT 레코드를 사용합니다.
externalDNS를 사용하여 A 레코드를 추가할 때 동일한 A 레코드가 이미 존재한다면 (예: 수동으로 생성된 경우) 해당 레코드를 덮어쓰지 않습니다. externalDNS가 기존 레코드를 소유하지 않는 경우 해당 레코드를 건드리지 않도록 설계되었기 때문입니다. 동작 원리는 자신이 관리하는 레코드임을 표시하기 위해 A 레코드와 함께 특정 TXT 레코드를 생성하는데 이 TXT 레코드가 존재하지 않거나 일치하지 않으면, externalDNS는 해당 A 레코드를 관리하지 않고 건너뜁니다. 이를 통해 수동으로 생성된 A 레코드를 덮어써서 발생할 수 있는 서비스 중단을 방지할 수 있습니다.

6. 결론

ExternalDNS는 쿠버네티스 클러스터에서 외부 DNS 관리를 자동화하는 강력한 도구입니다. 이를 통해 애플리케이션 배포 시 수동으로 DNS 레코드를 생성하거나 관리할 필요가 없어지고, 운영 효율성을 크게 향상시킬 수 있습니다. AWS Route 53, Google Cloud DNS 등 다양한 클라우드 환경에서 동작하며, 멀티클라우드 환경에서도 지원합니다.