AWS EKS POD DNS 문제 해결 - Route53 CNAME/A record

2023. 9. 13. 17:28Dev/EKS

728x90
반응형

지난 편에 이어서

AWS EKS CoreDNS의 configmap을 수정해서

forward의 값을 1.1.1.1로 변경시키는 것은 퍼블릭 도메인에는 효과가 있었습니다.

 

하지만 프라이빗 도메인으로 연결해 놓은 AWS 내부 리소스를 못 찾는 문제가 발생했습니다.

CoreDNS 설정을 롤백하고 진짜 원인을 찾기 시작했습니다.

 

처음 문제

1. EKS Pod에서 api.example.com를 호출하면 DNS를 찾을 수 없다는 에러가 발생
(실제로는 messages.dev.exampleapis.com/v1/api/abcd ...)

 

발견한 현상

2. 디버그용 컨테이너를 띄워서 nslookup api.example.com 해보면 192.168 IP를 알려줌

Non-authoritative answer:
messages.dev.exampleapis.com   canonical name = d-1234567890.execute-api.ap-northeast-2.amazonaws.com
Name:   d-1234567890.execute-api.ap-northeast-2.amazonaws.com
Address: 192.168.119.131
Name:   d-1234567890.execute-api.ap-northeast-2.amazonaws.com
Address: 192.168.139.217
Name:   d-1234567890.execute-api.ap-northeast-2.amazonaws.com
Address: 192.168.150.22

3. 로컬이나 다른 EKS에서 nslookup api.example.com 해보면 3.37 이나 15.165 IP를 알려줌

/ # nslookup messages.dev.exampleapis.com
Server:         10.100.0.10
Address:        10.100.0.10:53

Non-authoritative answer:
messages.dev.exampleapis.com   canonical name = d-1234567890.execute-api.ap-northeast-2.amazonaws.com

Non-authoritative answer:
Name:   d-1234567890.execute-api.ap-northeast-2.amazonaws.com
Address: 15.165.175.206
Name:   d-1234567890.execute-api.ap-northeast-2.amazonaws.com
Address: 3.37.218.253

 

 

해결 과정

 

EKS 내부에서 해볼 건 다 해봤기 때문에 처음부터 문제를 다시 봅니다.

그리고 한참을 생각하고 테스트해 보다가

messages.dev.exampleapi.com를 DNS질의했을 때, IP가 아니라 CNAME을 알려줘서 생기는 문제가 아닐까 생각했습니다.

 

팀장님께 "이거 A record로 바꾸면 될 거 같아요. 이유는 모르겠어요."라고 말했습니다.

실제로 Route53에서 해당 도메인의 레코드를 확인해 보니 유형이 A도 있고 CNAME도 있었습니다.

팀장님은 침착하라며 테스트를 해보자고 하셨습니다.

 

일단 라우팅 대상이 동일하게 API GW이고 유형이 A 레코드인 레코드 이름을 찾았습니다. (core.dev.exampleapi.com)

그리고 문제가 생긴 우리의 레코드가 있습니다. 유형은 CNAME입니다. (messages.dev.exampleapi.com)

EKS 내부 파드에서 두 도메인에 nslookup을 해봤습니다.

/ # nslookup messages.dev.exampleapis.com
Server:         10.100.0.10
Address:        10.100.0.10:53

Non-authoritative answer:
messages.dev.exampleapis.com   canonical name = d-1234567890.execute-api.ap-northeast-2.amazonaws.com

Non-authoritative answer:
messages.dev.exampleapis.com   canonical name = d-1234567890.execute-api.ap-northeast-2.amazonaws.com
Name:   d-1234567890.execute-api.ap-northeast-2.amazonaws.com
Address: 192.168.119.131
Name:   d-1234567890.execute-api.ap-northeast-2.amazonaws.com
Address: 192.168.139.217
Name:   d-1234567890.execute-api.ap-northeast-2.amazonaws.com
Address: 192.168.150.22

/ # nslookup core.dev.exampleapis.com
Server:         10.100.0.10
Address:        10.100.0.10:53

Non-authoritative answer:

Non-authoritative answer:
Name:   core.dev.exampleapis.com
Address: 54.180.###.###
Name:   core.dev.exampleapis.com
Address: 3.36.###.###

어? A 레코드를 사용하는 도메인은 해당 IP주소가 로컬주소가 아닙니다.

 

이 부분을 확인하고 팀장님도 CNAME을 A로 바꾸자고 하십니다.

 

Dev환경이었기때문에 바로 바꿉니다.

다시 EKS에서 확인을 하니 마침내!

/ # nslookup messages.dev.exampleapis.com
Server:         10.100.0.10
Address:        10.100.0.10:53

Non-authoritative answer:
messages.dev.exampleapis.com   canonical name = d-1234567890.execute-api.ap-northeast-2.amazonaws.com

Non-authoritative answer:
Name:   messages.dev.exampleapis.com
Address: 15.165.###.###
Name:   messages.dev.exampleapis.com
Address: 3.37.###.###

192.168이 아닌 제대로 된 IP주소를 확인합니다.

 

문제를 해결했습니다.

 

원인은 이렇습니다.

Route53에 도메인으로 요청을 하면, 레코드에 따라 라우팅을 해줍니다.

레코드의 라우팅 대상이 public이라서 CNAME으로 반환을 해도 다른 DNS를 찾아서 연결이 됩니다.

하지만 EKS 내부에서는 API GW의 canonical name을 DNS에 질의하면 내부 IP를 알려주는 것 같습니다.
(원하는 API GW가 EKS와 같은 VPC도 아니고, 같은 계정도 아님에도)

아마 리전이 같아서 ap-northeast-2.amazonaws.com 의 주소를 반환했을 수도 있고요.
(커뮤니티에 질문했을 때 DNS의 ndots를 기본 5에서 2로 변경해 보라는 의견도 있었습니다. 이렇게 해도 해결 됐을 수 도 있겠네요)

EKS 안에서는 명확한 IP Address로 반환을 받은 경우에는 퍼블릭하게 열려있는 API Gateway를 잘 찾아갔습니다.

진짜 원인

VPC에 Pirivate DNS가 enable 되어있어서 vpc endpoint로 resolve되어서 생긴 문제

Private DNS Name이 활성화되어있어 *.execute-api.ap-northeast-2.amazonaws.com 형식의 도메인은 모두 VPC endpoint interface IP(Private IP)로 resolve 됩니다.

해당 이슈를 해결하기위해서는 두가지 솔루션이 있습니다.

1) CNAME 레코드를 A 레코드로 변경 (Alias 활성화)

2) Private DNS name 비활성화

 

AWS VPC에서 생긴 일이라 EKS pod뿐 아니라 EC2, ECS, Lambda등 모든 AWS computing에서 일어날 수 있습니다.

endpoint 역시 api gateway뿐 아니라 s3, sqs, sns, dynamodb, rds 등 다른 AWS 리소스들로 접근할 때 발생할 수 있습니다.

 

 

---

Route53에서 record를 만들때는 Record Type을 A로 선택하고

Alias 옵션을 켜줍니다. (한글로는 별칭)

그러면 endpoint와 region을 선택할 수 있습니다.

 

제 경우는 API GW와 Seoul 리전을 선택했고

같은 계정에 있는 리소스가 아니라서 No resources found가 나옵니다.

당황하지않고 API GW가 만들어준 execute-api endpoint를 찾아서 등록해줍니다.

같은 리전의 같은 리소스를 퍼블릭과 프라이빗으로 동시에 사용하려면 Route53의 경우 A record에서 Alias를 켜서 주소 등록 후 사용하시면 됩니다.

 

 

결론

오랜만에 문제를 해결해서 뿌듯했습니다.

EKS 파드에서 생긴 문제지만, 문제는 EKS가 아니었다는 결론입니다.

API 게이트웨이를 비롯한 AWS 리소스를 퍼블릭 도메인으로 접근하는 경우 호스팅 영역에서 레코드 유형이 문제가 될 수 있다.

 

EKS뿐 아니라 EC2, ECS, Lambda등 AWS 컴퓨팅을 사용할 때는 다 생길 수 있는 문제입니다.