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에 해당하는 값을 전부 더해서 네임서버에 확인합니다.
'스터디 > 쿠버네티스 스터디 (사내)' 카테고리의 다른 글
Nginx index.html 수정 후 쿠버네티스로 배포한 후 접속해보기 (0) | 2023.02.16 |
---|---|
맥에서 k3s를 이용하여 실습하는 방법 (0) | 2023.01.20 |