External DNS 동작 방식

External DNS는 쿠버네티스 상에서 Ingress/Service와 도메인을 함께 관리하기 위한 도구입니다. 저도 쿠버네티스 운영할 때, 아주 유용하게 사용하고 있는데, 이번에 처음으로 코드를 살펴봤습니다.


동작 방식은 다음과 같습니다.(TXT Registry + AWS Route53 기준)


1. External DNS는 event handler를 설정할 수 있지만, 기본적으로는 주기적으로 상태를 체크하면서 도메인을 관리합니다. --interval 옵션을 통해서 주기를 조절할 수 있는데, 기본값은 60초입니다.


2. External DNS는 먼저 AWS Route53에서 관리하는 모든 Zone을 조회하고, 해당 Zone에서 자신이 관리하는 대상만 필터합니다. 이후에 필터된 Zone에서 모든 레코드를 조회합니다.


3. 레코드를 TXT, Non-TXT로 분리하고, TXT 레코드 중에 heritage=external-dns 값으로 들어있는 레코드만 걸러냅니다. 해당 레코드가 있는 레코드 이름으로 Map을 만들어서 라벨을 저장합니다. 그리고 Non-TXT 레코드를 순회하면서 Map에 등록된 이름이 있는 경우만 필터합니다.


4. 그 다음, 현재 Source에 등록된 정보들을 모두 확인합니다. 대표적으로 Service, Ingress 등에 external dns에서 지정한 annotation이 있는지, Rule.Host에 도메인 정보가 있는지를 찾습니다.


5. Route53에서 가져온 엔드포인트를 Current, 현재 Source에서 가져온 정보를 Desired로 설정합니다. 그리고 각 DNS 이름 별로 다음과 같이 판단해서 변경사항을 기록합니다.

- Current가 없고, Desired 가 있으면 -> Create

- Current가 있고, Desired가 없으면 -> Delete

- 둘 다 있는데, 정보가 다르면 - Update (단, 타입이 다르면, Delete + Create)


6. Create,Delete,Update 중에서 Policy에 맞게 원하는 것만 취사선택합니다.

- sync: 모든 변경

- upsert-only: Create, Update

- create-only: Create


7. AWS Route53 API를 통해 변경사항을 적용합니다. 이때 ChangeBatch 기능을 사용해서 전체 업데이트 내역을 Transactional하게 적용합니다. 만약 실패하게 되면 모든 레코드 변경이 함께 롤백됩니다.


8. 전체 업데이트에 실패하면, 이번에는 Owner 별로 나눠서 업데이트를 시도합니다. 만약 그럼에도 실패하는 경우에는 다음 Interval에서 재시도하기 위해 failed queue에 저장합니다.


꿀팁!!

현재는 레코드를 생성할 때, 두 개의 TXT 레코드가 생성됩니다. 하나는 옛날 버전이고, 하나는 새로운 버전입니다. 새로운 버전에서는 레코드 이름 앞에 자동으로 레코드 타입이 붙게 됩니다.


만약 --txt-prefix 설정에 %{record_type} 문자열을 사용하면, 옛날 버전은 생성하지 않도록 설정할 수 있습니다. 단, 이 기능은 v0.13.6 이상에 구현되어 있습니다.


뉴스레터를 구독하시면, 위 정보를 이메일로 편하게 받아보실 수 있습니다!

https://blog.techchallengearena.com/p/external-dns


#externaldns #kubernetes #쿠버네티스 #DevOps #AWS

External DNS 동작 방식

Techchallengearena

External DNS 동작 방식

다음 내용이 궁금하다면?

또는

이미 회원이신가요?

2024년 6월 30일 오후 12:37

댓글 0