IT/CKA

CKA 준비과정 - Networking (5) / DNS

Primes 2023. 7. 17. 11:59
728x90

쿠버네[티스는 클러스터를 구성할 때, 클러스터 내 구성요소간 통신할 수 있도록 하는 default DNS 서버를 배포한다.

쿠버네티스를 수동으로 설정하게 되면 이 DNS 서버를 직접 배포할 수도 있다.

 

모든 파드 및 서비스가 각자의 IP 주소를 가지고 서로 통신할 수 있다고 가정한다.

위 그림은 이전에 학습했던 내용과 같다. web 서버에 접근하기 위해서 web 서비스를 생성하고, 다른 파드들은 서비스를 통해 web서버에 접근할 수 있다. 이 때, 서비스가 생성되면 kube DNS 서버는 서비스의 이름과 IP 주소를 기록한다. 이를 통해 각 파드들은 서비스명으로도 접근이 가능하다.

 

이때 접근할 수 있는 조건이 있다.

- 같은 Namespace 내 라면 서비스 이름을 통해 접근 가능

- 다른 Namespace는 서브도메인을 추가하여 접근한다.

=> 각 서비스는 Namespace 에 종속되며, 강의의 예에서는 default-test, apps-web 의 관계로 가정한다.

이 때, apps 네임스페이스 내 web 에 접근하기 위해서는 서브도메인으로 .apps 를 붙여서 접근해야 한다. (web-service.apps)

 

유의할 점은, 모든 서비스는 svc 라는 하위 도메인으로 묶여 있는 점을 기억하자.

 

서비스 명 > 네임스페이스 명 > svc 순으로 종속된다. 또한, root의 기본값은 cluster.local이다.

기본 default 기준으로 봤을 때, web-service.apps.svc.cluster.local 이 된다.

서비스가 아닌 파드에 대해서도 그룹화를 할 수는 있다. type이 pod가 되며 ip주소의 .을 - 로 변경하면 hostname이 된다.

 

 

CoreDNS

두 개의 서비스가 서로를 인식하기에 가장 쉬운 방법은 각자의 hosts 파일에 항목을 추가하는 것이다.

하지만 거대한 서비스 규모에서 수천, 수백개의 파드와 서비스가 구성될 때는 이는 적절한 솔루션이 아니다.

따라서, 중앙에 DNS 서버를 따로 두고 항목을 추가한다. 새 파드가 만들어 질 때마다 DNS 서버에 파드의 정보가 추가되는 것이다.

hosts 파일이 도메인 명을 기록하는 파일이라면, resolv.conf 파일은 DNS 서버의 주소를 기록하는 파일이다.

따라서, 각 파드들은 resolv.conf 파일 내에 네임서버의 주소를 두고 정보를 얻어와 통신한다.

 

쿠버네티스에서는, 이 DNS 서버의 역할을 CoreDNS 라는 도메인 서버 서비스를 제공 및 권장하고 있다.

CoreDNS는 kube-system namespace에 파드 형태로 배포된다.

이 CoreDNS의 설정은 /etc/coredns/Corefile 경로에서 설정할 수 있다.

주황색으로 표기된 부분들은 모두 쿠버네티스 플러그인이다. (errors, health, kubernetes ... etc)

 

kubernetes 플러그인은 k8s의 최상위 도메인 이름을 설정하는 부분이다. 예시에서는 cluster.local이 최상위 도메인이 된다.

따라서 CoreDNS의 모든 레코드들은 이 도메인에 속하게 된다.

pod 옵션은 클러스터 내 파드에 대해 레코드 생성을 담당한다. default는 disabled 이다.

proxy 옵션은 파드가 DNS 외부로 연결을 시도할 경우, /etc/resolv.conf 파일에 정의되어 있는 네임서버로 연결해 외부 통신을 할 수 있도록 돕는다.

 

이 Corefile은 kube-system namespace에 configmap 형태로 저장되어 파드로 전달된다. 옵션값 변경은 위 경로로 접속하여 직접 수정하거나 configmap을 수정하는 방법도 있다.

 

CoreDNS pod를 설치할 때, 해당 파드에 접근할 수 있도록 서비스도 같이 생성하여 클러스터 내 다른 구성 요소가 접근할 수 있도록 한다. 이 서비스의 이름은 kube-dns로 자동으로 명명된다.

이 kube-dns 서비스의 IP 주소는 각 서비스의 resolv.conf에 자동으로 등록되어 있어 직접 따로 구성해줄 필요가 없다.

이러한 작업은 모두 kubelet을 통해 진행된다.

 

host 명령어를 이용하여 web-service 를 조회하게 되면, 도메인의 전제 주소를 리턴하게 된다. (FQDN)

**FQDN : 전체 주소 도메인 네임, 호스트이름 + 도메인 이

어떠한 이름을 입력하여도 서비스를 찾을 수 있다.

web-service 만 입력하거나 web-service.default 만 입력하거나, web-service.svc만 입력해도 같은 결괏값이 리턴된다.

이는 default.svc.cluster.local, svc.cluster.local, cluster.local 서브도메인을 모두 search 로 추가하였기 때문이다.

 

따라서, 위 서브도메인이 없는 케이스인 10-244-2-5 에서는 호스트를 찾을 수 없음을 알 수 있다.

서비스가 아닌 파드의 FQDN을 전부 입력하게 되면 IP 주소를 확인할 수 있다.

반응형