Kubernetes DNS ( coreDNS )

2025. 5. 19. 18:31·DevOps/✏️ Cloud
반응형

쿠버네티스에서 DNS 를 어떻게 사용하는지에 대해 간략히 정리하려함.

CNI 까지 컨테이너 네트워크, 클러스터 네트워크 등을 공부하면서 어떻게 서로를 연결하고 식별하는지 흥미가 생기는 듯 하다.

DNS 의 의미

# ping db
ping: unknown host db

갑자기 db 에 ping 을 날리려고 하면, db 이름을 가진 host 가 어딘지 알 수 없지 않은가? 
하지만 모든 서비스에서 db 의 IP 를 일일히 기억하고 싶지도 않다. 그래서 나온 것이 DNS 의 개념이다.

cat >> /etc/hosts
192.168.1.11 	db

# ping db
PING db (192.168.1.11) 56(84) bytes of data.
64 bytes from db (192.168.1.11): icmp_seq=1 ttl=64 time=0.052 ms
64 bytes from db (192.168.1.11): icmp_seq=2 ttl=64 time=0.079 ms

리눅스를 사용한다면 /etc/hosts 파일에 ip , host 이름을 등록해주면 해당 ip를 host 이름으로 인식해서 ping db 가 가능해진다.

즉 이렇게 각 호스트 마다 통신이 필요한 정보를 /etc/hosts 에 등록해주면 사용할 수 있다.
하지만 통신이 필요한 서버가 무수히 늘어난다면 어떨까? 각각의 ip, host 이름을 각각의 /etc/hosts 에 모두 등록해줘야 한다.

그래서 탄생한 것이 DNS 서버 이다.
DNS 서버에 IP 와 host 이름을 모두 입력해두고, 통신이 필요한 host 는 해당 DNS 서버에 접속해서 host 이름에 대한 IP 를 질의 하는 식으로 하면 각각의 host 에 모두 입력할 필요가 없다.

이 도메인 네임 서버는 Root -> Top Level Domain Name -> Subdomain 으로 분류된다.

예를 들어 mail.google.com / drive.google.com 등등 많은 도메인이 있는데, 

- Root (DNS)
-> Top Level Domain Name ( .com )
-> Subdomain ( google )
-> Subdomain ( mail, drive, www ...) 

등으로 DNS 서버 내에서 분류된다고 볼 수 있다.

이러한 DNS 서버에 대한 정보는 /etc/resolv.conf 에 기입할 수 있다.

cat >> /etc/resolv.conf
nameserver	192.168.1.100
search		mycomnpany.com

이처럼 입력하면 질의 시 해당 nameserver 로 가서 ip를 얻도록 검색하며, search 에 입력한 도메인이 있다면, 해당 도메인을 생략하고 앞 부분만 작성해도 통신을 시도할 수 있다. (web.mycompany.com 이면 web만 입력이 가능)

이와 같이 주소로 IP 를 질의하려면 nslookup, dig 등의 명령어를 사용할 수 있음

이와 같이 DNS 에서는 등록하는 record type 이 있다.

A 레코드 Address Record 도메인 이름을 IPv4 주소에 매핑
AAAA 레코드 Quad-A Record IP 주소에 매핑하지만 IPv6 에 매핑
CNAME 레코드 Canonical Name Record 하나의 도메인 이름을 다른 도메인 이름에 매핑
- 서브도메인을 메인 도메인으로 연결
- 여러 도메인 이름이 동일한 서비스를 가리키도록 할 때 사용

 

DNS in kubernetes

그렇다면 쿠버네티스 안에서, 각 pod, service 등은 어떻게 domain 을 이용해 연결할 수 있도록 관리될까?

쿠버네티스는 클러스터를 설정할 때 기본 탑재된 DNS 서버를 배포함.
서비스 등의 리소스가 생기면 KubeDNS 에 서비스 이름과 IP 를 저장하게 된다. 그래서 서비스 이름으로 접근이 가능함.
하지만 쿠버네티스 내부에는 namespace 등이 있기 때문에 정확한 위치를 지정할 수 있어야 한다.
그렇기 때문에 단순히 서비스 이름, IP 로 기입되지 않고 namespace, resource type, Root cluster 까지 함께 저장된다.
예를 들어 web-service 라는 서비스에 접근하는 도메인의 저장된 이름은 web-service.apps.svc.cluster.local 로 볼 수 있다.

 

CoreDNS

클러스터 내부에 서버를 배포하는 것을 바로 CoreDNS 이며, 설치된 DNS 서버를 kube-dns 라고 한다.

CoreDNS 는 kube-system 네임스페이스에 pod 로 배포되게 된다. replicaset 을 통해 2개의 pod 가 뜬다.
기동된 kube-dns 파드는 설치되어 있는 coredns 를 실행하고 /etc/coredns/Corefile 이라는 구성파일을 읽는다.
해당 설정 파일에는 cluster.local 도메인에 저장하라는 설정 부터 cache, 매트릭 정보, prometheus 연결 등의 설정이 담겨 있다.

또한 이렇게 설정된 corefile 은 configmap 을 통해 각 포드에 전달된다.

# kubectl get configmap -n kube-system
coredns

이렇게 기동된 coredns 는 서비스가 생성되거나 포드가 생성될 때 마다 데이터베이스에 record 를 추가한다.
파드는 DNS 서버를 참고할 수 있도록 kube-dns 서비스의 ip 를 /etc/resolv.conf 에 기입되어 있다.
이러한 정보는 kubelet 이 기입해주는데, kubelet 의 config.yaml 을 살펴보면 clusterDNS , clusterDomain 의 정보를 가지고 있다.

 

반응형
저작자표시 (새창열림)

'DevOps > ✏️ Cloud' 카테고리의 다른 글

K8s Gateway API  (1) 2025.05.25
CNI (Container Network Interface)  (0) 2025.05.19
Docker Networking  (1) 2025.05.16
Network Namespace  (1) 2025.05.15
drain, cordon, uncordon 명령  (0) 2025.03.27
'DevOps/✏️ Cloud' 카테고리의 다른 글
  • K8s Gateway API
  • CNI (Container Network Interface)
  • Docker Networking
  • Network Namespace
자동화를 꿈꿉니다.
자동화를 꿈꿉니다.
DevOps 개발자
  • 자동화를 꿈꿉니다.
    데봅스 성장기
    자동화를 꿈꿉니다.
  • 전체
    오늘
    어제
    • 분류 전체보기 (29)
      • DevOps (29)
        • ✏️ Cloud (12)
        • ✏️ CICD (11)
        • ✏️ Mac (6)
      • 경제 (0)
      • 운동 (0)
  • 블로그 메뉴

    • 홈
  • hELLO· Designed By정상우.v4.10.3
자동화를 꿈꿉니다.
Kubernetes DNS ( coreDNS )
상단으로

티스토리툴바