중앙에서 DNS 서버를 운영해서 사용자에게 DNS 관리를 편하게 해주는 CoreDNS를 k8s 클러스터에서도 사용한다.
두 파드가 존재한다고 가정할 때,
두 파드 간의 DNS를 가능하게 하는 가장 쉬운 방법은 /etc/hosts 파일에 서로의 호스트 명과 아이피를 입력하여 사용하는 것이다.
그러나 파드가 점점 늘어나면 사용자는 /etc/hosts 파일을 매번 관리할 수 없어진다. 그래서 한 번에 중앙에서 관리하는 CoreDNS 서버를 사용한다.
(k8s v1.12 이후부터 CoreDNS)
CoreDNS는 k8s에서 파드로 배포된다.(정확히는 deployment)
Coredns
라는 실행파일을 사용하며, Corefile
이라는 설정 파일이 필요하다.
cluster.local 이라는 최상위 도메인 설정도 여기서 이루어짐
DNS 서버가 해결할 수 있는 모든 레코드 예를 들어 파드가 www.google.com으로 접근하려 할 때,
이 요청은 coredns 파드의 /etc/resolv.conf 파일에서 지정된 네임서버로 전달된다.
만약 이 Corefile 설정을 수정하고 싶다면 configmap를 수정한다.
kubectl get configmap -n kube-system
---
NAME DATA AGE
coredns 1 168d
coredns는 새 서비스나 파드가 추가될 때 마다 레코드를 추가한다.
coredns가 배포될 때, kube-dns 라는 이름의 서비스도 함께 배포된다.
k8s의 다른 객체들은 이 kube-dns 라는 서비스를 호출하여 DNS 서비스를 사용한다.
kubelet 설정 중 DNS에 관련된 설정이 존재함
이 파일에는 바라봐야 하는 네임서버에 대한 설정과 search 조건이 존재한다.
(참조) 클라이언트가 DNS 서버로부터 결과가 없다는 응답을 받으면, 이 부분 도메인 목록을 차례대로 붙여가며 추가로 DNS 서버를 호출한다.
위의 search 설정 덕분에 서비스 이름만으로도 목적지를 찾아갈 수 있다.
다만 파드에 대해서는 FQDN을 설정해야 파드 이름만으로 찾을 수 있다고 한다.