© 2020 GitHub, Inc.

CoreDNS를 통한 Dns Server 구축하기 with docker

CoreDNSkubernetes에서 dns resolve를 위해 사용하고 있는 오픈소스이다. 실제로 kuberneteskube-system 네임스페이스를 보면 coredns-xxx 파드가 떠있는 것이 보일 것이다.

사내에서 CoreDNS를 통한 DNS 서버를 구축하며 알게된 사실들, 구축 방법등을 공유한다.

CoreDNS를 시작하는 것은 정말 어렵지 않다. docker를 통해 컨테이너만 실행시켜도 우선은 CoreDNS를 맛볼 수 있다. 다만 나의 경우 docker를 그 자체로 실행시키는 것 보다 docker-compose를 통해 실행시키는 것을 더 선호하는 편이다. docker-compose의 장점이라면 복잡한 docker 명령어를 일일이 기억하고 있지 않아도 docker-compose up -d 명령어 하나로 사전에 설정된 명령을 실행시킬수 있다는 것이다.

CoreDNSdocker-compose.yml 구성은 구글링으로도 쉽게 구할 수 있으며, 내가 구한 설정은 다음과 같았다.

version: '2.1'

services:
  coredns:
    image: coredns/coredns
    restart: always
    command: -conf /root/coredns/config/Corefile
    ports:
      - 53:53/udp
    volumes:
      - ./config:/root/coredns/config/

volumes를 보면 config 폴더를 docker-compose.yml 파일과 함께 위치했다는 사실을 알 수 있다. 따라서 다음과 같은 디렉토리 구성을 한다.

$ tree
.
├── config
│   ├── Corefile
│   ├── kubeconfig
│   └── my.host.name.db
└── docker-compose.yml

여기서 kubeconfigCoreDNSkubernetes 플러그인을 사용해보기 위한 목적으로, 어떻게 kubernetes에서 DNS resolve를 하는 것이 밖에서도 볼 수 있는지 확인해보려고 구성해 보았다. 물론 클러스터 외부에서는 kubernetes의 서비스 대역과 통신이 불가능하기 때문에 거의 사용할 일이 없다.

my.host.name.db는 DNS resolve를 위한 DNS db 파일이다.

CorefileCoreDNS의 설정파일로, 매칭되는 Domain Name에 대해 어떤 rule로 DNS resolve를 할지 결정하는 파일이다.

나는 다음과 같이 Corefile을 구성했다.

my.host.name {
    file /root/coredns/config/my.host.name.db
    cache
    log
    errors
}

xx.x.xx.172.in-addr.arpa {
    whoami
}

. {
    forward . 8.8.8.8
    log
    cache
    errors
}

설정을 하나씩 보면 우선 my.host.name을 가지는 Domain에 대해서는 my.host.name.db 파일을 읽도록 해 두었다.

xx.x.xx.172.in-addr.arpa 의 경우 DNS server의 아이피로 hostname을 알려주고 싶을 경우 설정하는 것이다.

.으로 설정한 부분은 default 세팅이라고 봐도 무방하다. 여기에서는 8.8.8.8로 위에 설정한 두개의 Domain 빼고는 모두 포워딩한다. 즉, 내가 resolve를 하는게 아니라 8.8.8.8에서 resolve한 결과값을 리턴하겠다는 뜻이다.

위와같이 설정을 하고 난뒤 다음과 같이 입력한다.

docker-compose up -d

내 서버로 resolve를 하고싶다면, netplan의 nameserver 부분을 수정하거나 /etc/resolv.conf를 수정하면 된다.

/etc/resolv.conf에 관해서는 다른 페이지에서 다뤄보도록 한다.