Intro
DNS: Domain Name Server
- 사용자가 기억하기 쉬운 주소를 컴퓨터가 이해하는 IP 주소로 변환해주는 서버 혹은 시스템
- DNS 쿼리
- 캐시
CoreDNS
coreDNS: 쿠버네티스 클러스터의 DNS 역할을 수행할 수 있는 유연하고 확장 가능한 DNS 서버입니다.
- 클러스터 내부의 다른 Pod의 도메인 질의
- 클러스터 외부 도메인 질의
다른 App과 마찬가지로 Pod 형태로 호스팅됩니다. 예전에는 kube-dns가 쓰였는데 Kubernetes 1.13 이상부터 기본으로 CoreDNS를 사용합니다.
CoreDNS (기능/역할)
- 서비스 및 파드 이름 해석 클러스터 내부의 서비스 이름(
my-service.my-namespace.svc.cluster.local
와 같은 형식)을 IP 주소로 매핑해서 서비스 간 통신이 가능하도록 함. - 외부 DNS 쿼리 포워딩 내부 서비스가 아닌 도메인 (ex:
google.com
)에 대한 요청은 upstream DNS 서버(ex: /etc/resolv.conf
에 설정된 서버)로 전달해서 해석함. - 검색 도메인 및
ndots
설정으로 이름 축약 및 자동 확장 Pod 내의 /etc/resolve.conf
설정에 따라 짧은 이름(short name)이나 namespace 생략 등이 가능하게 해줌. 예: svc.cluster.local
등이 자동으로 덧붙여지는 경우 - Reverse lookup (PTR records) IP -> 이름 해석 등이 가능함(ex:
in-addr.arpa
, ip6.arpa
) - 모듈형 플러그인 아키텍처 여러 기능이 플러그인 형태로 구현되어 있고, 필요에 따라 활성화하거나 설정을 조정 가능함
- 확장성 및 고가용성 여러 개의 CoreDNS Pod를 띄워서 로드 밸런싱하고 장애에도 대응할 수 있음. 또한, 설정(ConfigMap)으로 Corefile을 조정하여 기능을 추가하거나 최적화 가능
- 모니터링 및 상태 확인 예: Pod로 띄워지기 때문에
prometheus
플러그인을 통해 메트릭을 수집, health
, ready
플러그인 등을 통해 상태 체크 가능.
CoreDNS 사용 이유
- 서비스 디스커버리 컨테이너에서 실행되는 애플리케이션은 IP 주소 대신 DNS 이름을 사용하여 다른 서비스를 찾고 통신할 수 있다. 이를 통해 서비스의 확장 또는 마이그레이션 시에도 결합도가 낮아지고 유연성이 향상됩니다.
- 사용자 정의 및 확장성 CoreDNS는 손쉽게 구성, 확장 가능한 서비스입니다. corefile 설정을 통해, 간편하게 플러그인을 추가하고 특정 요구사항을 충족시킬 수 있다. 이런 유연성은 DNS 캐싱, DNS 기반 보안 정책, 외부 DNS 공급자와의 통합 등의 기능을 가능하게 합니다.
- Kubernetes API와의 통합 CoreDNS는 Kubernetes API 서버와 원활하게 통합됩니다. Kubernetes API를 쿼리함으로써 클러스터 내의 서비스, 엔드포인트 및 기타 리소스를 자동으로 검색합니다.
구성 요소 / 주요 설정 요소
- Corefile
- CoreDNS가 어떻게 동작할 지 설정하는 파일. 어떤 플러그인을 쓸 지, 어떤 zone을 관리할 지, upstream DNS는 어디인지, TTL, Pods 모드, namespace 필터링 등 다양한 옵션이 있음.
- ConfigMap
- 이 Corefile은 Kubernetes내에
ConfigMap
리소스로 분류됨.
- Deployment/Pods
- CoreDNS는 Deployements 형태로 배포되어 여러 파드로 구성됨. 복제(replica) 수, 자원량(CPU, Mem), 노드 셀렉터(nodeSelector), 토러레이션(toleration) 등 설정 가능
- Service
- ClusterIP 서비스로 외부나 클러스터 내 파드들이 CoreDNS로 DNS 쿼리를 보낼 수 있게 함. Pod의
/etc/resolve.conf
에 지정되는 nameserver 주소가 이 서비스 IP가 됨.
- 플러그인 옵션 예시
작동 흐름
- 파드 또는 컨테이너에서 DNS 쿼리를 요청 보냄
/etc/resolve.conf
의 nameserver에 적힌 ClusterIP로 보냄. - CoreDNS 파드는 받은 쿼리를 Corefile 플러그인 체인에 따라 처리
- 먼저
kubernetes
플러그인이 내부 서비스/파드 레코드를 찾아본다. - 없으면
forward
로 넘어가 외부 DNS 서버에 조회를 한다. - 캐시(cache)가 있다면 캐시를 사용한다.
- 로그 또는 모니터링 플러그인이 로그/메트릭 수집
- 응답 -> 파드로 변환