본문 바로가기

스터디/쿠버네티스 스터디 (사내)

k8s의 CoreDNS

728x90

DNS

Domain Name System 의 약자로 사람이 읽을 수 있는 도메인명을 IP 주소로 변환하는 기능이다

도메인으로 IP 조회를 할 때는 로컬 캐시 조회 -> /etc/hosts 조회 -> DNS 조회 순으로 진행됩니다.

 

 

/etc/hosts

$ cat /etc/hosts

127.0.1.1 k3s k3s
127.0.0.1 localhost

우리가 흔히 쓰는 localhost 도메인을 사용하면 127.0.0.1 IP 로 변경되어 사용되고있다.

 

 

/etc/resolv.conf

$ cat /etc/resolv.conf

nameserver 8.8.8.8
options edns0 trust-ad
search .

resolv.conf 파일은 DNS 서버 목록이 있는 파일인데 
host 파일에 도메인명이 존재하지 않는 경우 resolv.conf 파일에서 도메인명을 검색할 도메인 서버의 주소를 찾습니다.


위에서 nameserver 는 ip와 도메인 주소를 연결해주는 역할을 합니다.

만약 인터넷 주소에 도메인을 입력하면 지정된 nameserver를 통해 연결되어있는 IP 주소를 찾아내서 확인하는 역할을 합니다.


k8s 에서의 DNS - Core DNS

 

CoreDNS는 쿠버네티스 클러스터의 DNS 역할을 수행할 수 있는, 유연하고 확장 가능한 DNS 서버이다. 쿠버네티스와 동일하게, CoreDNS 프로젝트도 CNCF가 관리합니다.

사용자는 기존 디플로이먼트인 kube-dns를 교체하거나, 클러스터를 배포하고 업그레이드하는 kubeadm과 같은 툴을 사용하여 클러스터 안의 kube-dns 대신 CoreDNS를 사용할 수 있습니다.

Core DNS 는 클러스터를 지속적으로 모니터링 하며, 새로운 서비스나 파드가 추가될 경우 도메인서버에 이를 업데이트 합니다.

 

 

현재 실습환경은 k3s 이고, k3s 는 기본적으로 Core DNS 가 네임서버로 사용됩니다.

 

파드로 실행되는 Core DNS 확인

$ kubectl get po -n kube-system -l k8s-app=kube-dns

NAME                       READY   STATUS    RESTARTS      AGE
coredns-597584b69b-mk6nf   1/1     Running   1 (49d ago)   54d

 

 

Core DNS 는 파드로 실행되기 때문에 외부 요청을 받기 위한 Service 오브젝트가 있습니다.

제 환경에서 코어 DNS 의 클러스터 IP 는 10.43.0.10 입니다.

$ kubectl get svc -n kube-system -l k8s-app=kube-dns

NAME       TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
kube-dns   ClusterIP   10.43.0.10   <none>        53/UDP,53/TCP,9153/TCP   54d

 

kubelet 은 새로운 파드가 생성될때 파드의 /etc/resolv.conf 파일에 ClusterDNS 서버의 주소를 추가하여

파드에서 클러스터 내부 DNS 를 사용할 수 있도록 해줍니다.

 

$ kubectl describe cm -n kube-system coredns

Name:         coredns
Namespace:    kube-system
Labels:       objectset.rio.cattle.io/hash=bce283298811743a0386ab510f2f67ef74240c57
Annotations:  objectset.rio.cattle.io/applied:
                H4sIAAAAAAAA/4yQwWrzMBCEX0Xs2fEf20nsX9BDybH02lMva2kdq1Z2g6SkBJN3L8IUCiVtbyNGOzvfzoAn90IhOmHQcKmgAIsJQc+wl0CD8wQaSr1t1PzKSilFIUiIix4JfRoXHQ...
              objectset.rio.cattle.io/id:
              objectset.rio.cattle.io/owner-gvk: k3s.cattle.io/v1, Kind=Addon
              objectset.rio.cattle.io/owner-name: coredns
              objectset.rio.cattle.io/owner-namespace: kube-system

Data
====
Corefile:
----
.:53 {
    log
    errors
    health
    ready
    kubernetes cluster.local in-addr.arpa ip6.arpa {
      pods insecure
      fallthrough in-addr.arpa ip6.arpa
    }
    hosts /etc/coredns/NodeHosts {
      ttl 60
      reload 15s
      fallthrough
    }
    prometheus :9153
    forward . /etc/resolv.conf
    cache 30
    loop
    reload
    loadbalance
}
import /etc/coredns/custom/*.server

NodeHosts:
----
192.168.64.2 k3s


BinaryData
====

Events:  <none>

 

 

 

 


 

https://kubernetes.io/docs/tasks/administer-cluster/dns-debugging-resolution/

 

테스트환경에서 사용할 간단한 파드

$ vim dnsutils.yaml

apiVersion: v1
kind: Pod
metadata:
  name: dnsutils
  namespace: default
spec:
  containers:
  - name: dnsutils
    image: registry.k8s.io/e2e-test-images/jessie-dnsutils:1.3
    command:
      - sleep
      - "infinity"
    imagePullPolicy: IfNotPresent
  restartPolicy: Always

 

파드 생성

$ kubectl apply -f dnsutils.yaml

pod/dnsutils created

 

파드 상태 확인

$ kubectl get pods dnsutils

NAME       READY   STATUS    RESTARTS   AGE
dnsutils   1/1     Running   0          65s

 

실행한 파드의 로컬 DNS 구성 확인

$ kubectl exec -ti dnsutils -- cat /etc/resolv.conf

search default.svc.cluster.local svc.cluster.local cluster.local
nameserver 10.43.0.10
options ndots:5

CoreDNS 의 클러스터 IP 가 네임서버에 들어가있습니다.

 

search : DNS에 확인 요청할 부분 도메인경로

nameserver : CoreDNS 의 서비스 오브젝트 IP

options : FQDN 으로 취급할 도메인의 최소 dot(.) 갯수

# FQDN : 전체 도메인 네임 -> www.naver.com  중 www 는 호스트고 naver.com 이 도메인이다. 이 두개를 합한 www.naver.com  이 FQDN 이다. k8s 의 경우 다른 pod 를 찾을때 해당 네임스페이스 외부에서 찾을경우 FQDN 을 써야한다 합니다.

 

 

nslookup으로 도메인 ip조회

$ kubectl exec -i -t dnsutils -- nslookup kubernetes.default

Server:		10.43.0.10
Address:	10.43.0.10#53

Name:	kubernetes.default.svc.cluster.local
Address: 10.43.0.1

 

위의 nslookup 의 로그 확인 

$ kubectl logs --namespace=kube-system -l k8s-app=kube-dns

[INFO] 10.42.0.40:57042 - 54686 "A IN kubernetes.default.default.svc.cluster.local. udp 62 false 512" NXDOMAIN qr,aa,rd 155 0.001626834s
[INFO] 10.42.0.40:49781 - 5205 "A IN kubernetes.default.svc.cluster.local. udp 54 false 512" NOERROR qr,aa,rd 106 0.000224334s

 

 

만약 이상한 도메인으로 요청했을경우?

$ kubectl exec -i -t dnsutils -- nslookup foameraserblue.test.hihi

Server:		10.43.0.10
Address:	10.43.0.10#53

** server can't find foameraserblue.test.hihi: NXDOMAIN

command terminated with exit code 1

 

로그확인

$ kubectl logs --namespace=kube-system -l k8s-app=kube-dns

[INFO] 10.42.0.40:46408 - 39315 "A IN foameraserblue.test.hihi.default.svc.cluster.local. udp 68 false 512" NXDOMAIN qr,aa,rd 161 0.00063342s
[INFO] 10.42.0.40:45043 - 14992 "A IN foameraserblue.test.hihi.svc.cluster.local. udp 60 false 512" NXDOMAIN qr,aa,rd 153 0.000121334s
[INFO] 10.42.0.40:35792 - 47119 "A IN foameraserblue.test.hihi.cluster.local. udp 56 false 512" NXDOMAIN qr,aa,rd 149 0.000074833s
[INFO] 10.42.0.40:58535 - 48770 "A IN foameraserblue.test.hihi. udp 42 false 512" NXDOMAIN qr,rd,ra 117 0.038752236s

파드의 로컬 DNS 구성(resolv.conf) 의 search 은
default.svc.cluster.local / svc.cluster.local / cluster.local 총3개입니다.

제가 호출한 foameraserblue.test.hihi 에다 이 3개를 더한 경우 총 4번 탐색하는것을 확인 가능

 

resolv.conf 의 search에 해당하는 값을 전부 더해서 네임서버에 확인합니다.

728x90