본문 바로가기

⭐ Kubernetes & EKS/CoreDNS

CoreDNS란? 그리고 역할은?

# CoreDNS란 무엇인가?

1. 사족

네이버에서 검색해보니 책이 한권 있더라... 그만큼 내용이 방대하다? 라는 뜻이겠지...

- 목차를 잠시 봤는데 음... 목차 내용들이 매우 심오하다.

간단하게 알고 넘어가쟈~

2. CoreDNS란 무엇인가?

- 나는 주로 클라우드 환경에서 그리고 EKS에서 CoreDNS와 접하는 경우가 많다.

뭐 특별히 CoreDNS와 작업을 하거나 그런건 아니고, (RBAC 처럼 Config 파일에 사용자 정보나 Role을 만들고 바인딩하는) 그냥 kubectl get pod -A 로 조회 했을때 항상 아래와 같이 조회가 되곤 해서 항상 궁금했다.

kube-system     coredns-556f6dffc4-784rd    1/1     Running   0          13d
kube-system     coredns-556f6dffc4-xnw6n    1/1     Running   0          13d

당연한 이야기겠지만, 노드1개당 1개의 coredns와 proxy가 기본적으로 생성이 되는거 같다. (그런데 저런 기본적으로 생성해야 하거나 생성되는 리소스들은 EC2 pod 제한 개수에서 빼줘야 하는거 아닌가? 😬 😬 불만 불만)

암튼,  본론으로 돌아가서 CoreDNS를 구글에서 검색하면 아래와 같은 설명을 보여준다.

영어로보니까 뭔말인지 의미가 잘 와닿지않네, 역시 한국사람은 한국사람이 쓴 블로그를 봐야함, 폭풍검색

검색결과 아래와 같은 결론을 얻었다.

- CoreDNS란...

일단 CoreDNS는 CNCF 재단에서 관리하는 프로젝트라고 한다.
(CNCF란? → 클라우드 네이티브 컴퓨팅 재단...)
CoreDNS의 역할은 클러스터를 지속적으로 모니터링을 하면서,
새로운 pod나 Service가 등록되면 해당 내용을 도메인 서버에 업데이트 한다.

3. EKS에서 CoreDNS 확인하기

- 일단 위에 CoreDNS란... 에서 설명한 기본적인 내용이 이해가 안될 수도 있다.

쉽게 말하면 CoreDNS는 pod로 동작하고 있고, ClusterIP 타입의 서비스를 사용한다. 즉 내부 서비스 목적의 사용된다는 점이다. 여기서 짚고 넘어가자면 k8s는 3가지의 서비스를 사용할수 있다. 앞에서 언급한 ClusterIP, NodePort, LoadBalancer이다. 3개의 서비스는 인터넷 검색하면 바로 설명이 나오니까 패스, ClusterIP는 내부 즉 EKS 클러스터 내부에서만 동작하는 Private 네트워크 성격의 서비스이다.

- pod나 서비스가 등록되면 이를 지속적으로 모니터링하다가 업데이트 한다는 말은, 쿠버네티스의 pod는 클러스터 내부에서 dns 통신을 할 수 있다. 어케 이게 가능하냐면 CoreDNS가 계속 모니터링하고 새로운 pod나 서비스가 들어오면 규칙에 의해 dns 주소를 만들어버린다. (아래에서 자세히 설명) 그렇기 때문에 CoreDNS는 외부에서 흔히 이야기하는 DNS 서버와 같은 존재라고 볼 수 있고, 클러스터 내의 DNS 통신을 지원한다.

- 실제 pod가 생성시 어떤 DNS로 생성이 되는지 테스트를 해보자.

일단 nginx라는 테스트용 pod를 생성 후 resolv.conf 파일을 조회하여 dns를 확인해보자.

resolv.conf파일 위치 : /etc/resolv.conf

root@nginx-cbdccf466-7gnz6:/etc# cat resolv.conf 
search nginx.svc.cluster.local svc.cluster.local cluster.local ap-northeast-2.compute.internal
nameserver 172.20.0.10
options ndots:5

search 라고 명시된 부분이 해당 pod의 dns 주소가 된다.

search는 DNS에 질의할 부분 도메인 주소 경로들을 표시,

nameserver는 DNS 쿼리를 보낼 곳, CoreDNS Service 오브젝트의 IP 주소

ndots는 FQDN으로 취급될 도메인에 포함될 .(점)의 최소 개수

(FQDN이란? 전체 주소 도메인 네임, 절대 도메인 네임 이라고 부르며 호스트 이름과 도메인 이름을 포함한 전체 도메인 이름을 일컫는 용어. 즉, 호스트의 전체 이름이다.)

4. 결론

CoreDNS는 파드 또는 서비스를 도메인으로 접근할 수 있다.

파드/서비스 도메인은 설정 후 변경되는 파드IP, 서비스 IP의 불편함을 해결해준다. (무슨 말이냐면 pod가 수시로 변경되면 ip가 바뀌니까 고정으로 domain을 사용할 수 있다는 이야기)

파드 또는 서비스가 수정된다면 (ClusterIP)가 수정된다.

CoreDNS는 파드와 서비스에 대한 도메인을 관리하며 해당하는 DNS요청이 오면 DNS응답을 전달한다.

- 파드 도메인과 서비스 도메인의 생성 방법은 아래와 같다.

    파드 도메인: <파드-ip>.<namespace>.pod.cluster.local
    서비스 도메인: <서비스이름>.<namespace>.svc.cluster.local

- 하지만 EKS에서 노드그룹을 수정하면 초기화가 서비스 도메인으로 설정해 놓아도 초기화가 된다.

- EKS 노드그룹의 내용을 변경하면 pod들을 재배치 한다. 그때 재배치되는 리소스의 정보가 변경 되므로, 고정 dns로 사용이 어렵다. (해결책을 찾아야 할 듯)

 

- 끝 -

'⭐ Kubernetes & EKS > CoreDNS' 카테고리의 다른 글

파드, 서비스 도메인을 이용한 통신  (0) 2023.06.19