DNS
는 Domain Name System의 약자이다. DNS는 사람이 쉽게 해석할 수 있는 도메인명(ex, www.bluewhale.com
)을 IP 주소(179.10.2.10
)로 변환하는 기능을 의미한다. DNS는 /etc/hosts
파일에 저장된 도메인-IP 맵핑 정보를 읽거나, 이를 갖고 있는 네임 서버와의 통신을 통해 이루어진다.
Linux 환경에서 DNS를 사용하는 방법은 크게 2가지가 있다.
/etc/hosts
파일은 컴퓨터가 도메인명으로 IP를 찾을 때 가장 먼저 열어보는 파일이다. 윈도우에서는 C:\Windows\System32\drivers\etc\hosts
경로에 파일이 위치한다.
파일을 열어보면 아래와 같이 localhost
가 이미 추가되어 있는 것을 볼 수 있다.
$ cat /etc/hosts
# localhost is used to configure the loopback interface
# when the system is booting. Do not change this entry.
##
127.0.0.1 localhost
255.255.255.255 broadcasthost
::1 localhost
/etc/hosts
파일에서 localhost
외에 127.0.0.1
에 대한 새로운 도메인명(ex, loopback
)을 추가하고 아래의 명령어로 network 데몬을 재실행하면, 새로운 도메인 명이 정상적으로 추가된 것을 확인할 수 있다.
$ cat /etc/hosts
...
127.0.0.1 localhost loopback
...
# linux
$ sudo /etc/init.d/networking restart
# mac
$ sudo ifconfig en0 down
$ sudo ifconfig en0 up
$ curl http://loopback:8080
Hello World!
/etc/resolv.conf
파일은 DNS resolver, DNS 서버 목록을 기록한 파일이다. 컴퓨터는 /etc/hosts
파일에 도메인 명이 존재하지 않는 경우, /etc/resolv.conf
파일에서 도메인 명을 검색할 도메인 서버의 주소를 찾는다.
통신사나 PC 환경에 따라, 도메인 서버의 주소가 다를 수 있다. 대표적인 도메인 서버로는 구글의 8.8.8.8
이 있다.
$ cat /etc/resolv.conf
nameserver 8.8.8.8
CoreDNS
는 CNCF 재단에서 관리하는 프로젝트이다. CoreDNS
는 v.1.12 이후로 kubernetes에서 사용을 권장하고 있는 도메인 서버 서비스이다. CoreDNS
는 클러스터를 지속적으로 모니터링하며, 새로운 Service 혹은 Pod이 추가되는 경우, 도메인 서버에 이를 업데이트한다.
minikube
로 클러스터를 설치한 경우, CoreDNS
서비스가 이미 자동으로 실행되고 있는 것을 확인할 수 있다.
CoreDNS
Pod에 대한 서비스는 kube-system
네임스페이스에 kube-dns
라는 이름으로 실행되고 있다.
kubelet
은 새로운 Pod이 생성될 때에, Pod의 /etc/resolv.conf
파일에 clusterDNS 서버의 IP 주소를 추가하여, Pod에서 my-service.default.svc.cluster.local
과 같은 클러스터 내부의 DNS를 사용할 수 있도록 해준다.
kubelet
은 바이너리 실행 시, clusterDNS
와 관련된 설정을 인자로 받는다. minikube
에서는 아래의 경로에서 찾을 수 있다.
$ minikube ssh
$ sudo cat /var/lib/kubelet/config.yaml
...
clusterDNS: # cluster DNS 서버의 주소
- 10.96.0.10
...
실제로, kubelet에 의해 실행된 Pod에 접속하여, /etc/resolv.conf
파일을 열어보면 CoreDNS
의 IP 주소가 네임서버로 추가되어 있는 것을 확인할 수 있다.
$ kubectl exec -it my-pod -- /bin/sh
$ cat /etc/resolv.conf
nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5