
쿠버네티스 내에서 사용할 수 있는 DNS와 이를 구현하는 CoreDNS에 대해서 배워보자.
쿠버네티스는 클러스터 내부 통신을 위한 전용 DNS 시스템을 내장하고 있어, Pod와 Service 간의 도메인 기반 통신이 가능하다.
[service Name].[namespace].svc.cluster.local 이고 특정 Pod의 도메인은 [Pod-IP].[namespace].pod.cluster.local이다.spec.template.spec.hostname과 subdomain을 지정하면 DNS가 [hostname].[subdomain].[namespace].svc.cluster.local로 생성된다.spec.dnsPolicy: Pod가 도메인 name을 어떻게 해석할지, 즉 DNS 질의가 어떤 흐름으로 처리될지를 지정하는 설정Default: DNS 설정을 Pod가 실행되는 노드의 설정을 가져와서 사용/etc/resolv.conf를 그대로 사용하므로 Kubernetes DNS 기능 사용하지 않는다.ClusterFirst(기본값): 클러스터 DNS(CoreDNS) 를 우선 사용ClusterFirstWithHostNet: hostNetwork 옵션으로 실행할때 반드시 사용해야 하는 옵션hostNetwork: true일 때도 Cluster DNS 사용 가능하게 한다.None: 쿠버네티스 클러스터 내부의 DNS 설정을 무시 → spec.dnsConfig에서 별도의 DNS 설정 필수쿠버네티스 클러스터의 DNS 역할을 수행할 수 있는, 유연하고 확장 가능한 DNS 서버
kube-system 네임스페이스에 실행되고 있는 CoreDNS가 nameserver로 사용된다./etc/resolv.conf에 원하는 것들만 플러그인처럼 추가하는 방식으로 사용한다..:53 { # 모든 도메인 요청을 처리하겠으며, DNS 표준 포트인 UDP 53번 포트로 리스닝
errors # DNS 응답에 오류가 발생했을 때 로그로 출력
health # CoreDNS의 헬스체크 엔드포인트를 활성화
# cluster.local 도메인 하위 요청을 Kubernetes API로부터 서비스 정보 받아 응답
# in-addr.arpa, ip6.arpa: 역방향 DNS 조회(PTR) 요청도 처리
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure # 보안 제한 없이 Pod 이름 기반 DNS 조회 허용
fallthrough in-addr.arpa ip6.arpa # 매칭되는 요청이 없으면 다음 블록에 넘김
ttl 30 # 응답에 포함되는 DNS 캐시 시간을 30초로 설정
}
prometheus :9153 # Prometheus로 CoreDNS 메트릭을 수집할 수 있도록 서버 오픈
forward . /etc/resolv.conf # 클러스터 내에서 처리할 수 없는 도메인 요청 전달
cache 30 # TTL과 별개로 CoreDNS 내부 캐싱을 30초간 유지
loop # CoreDNS가 자기 자신에게 무한 재귀 요청하는 상황을 감지하고 차단
}
/etc/resolv.conf 내용을 커스터마이징하고 싶다면, Pod의 spec.dnsPolicy: None과 함께 spec.dnsConfig를 설정해야 한다.nameservers: Pod가 DNS 질의를 보낼 nameserver의 IP 주소 목록dnsPolicy: None일 경우 외부 DNS도 지정 가능searches: 상대 도메인 이름을 보완하기 위해 자동으로 붙일 도메인 접미사들my-service라고 입력했을 때 my-service.default.svc.cluster.local처럼 자동 확장되게 함.options: /etc/resolv.conf에 들어가는 옵션들 중 하나로, 몇 개의 점(dot)이 있어야 도메인을 절대 경로(FQDN) 로 판단할지를 설정.apiVersion: v1
kind: Pod
metadata:
name: dns-demo
namespace: default
spec:
# Node와 네트워크를 공유하되
hostNetwork: true
# Kubernetes DNS를 사용하지 않음
dnsPolicy: None
# 사용자 정의 DNS 설정 적용, 사용자가 모든 DNS 설정을 직접 관리
dnsConfig:
nameservers:
- 10.96.0.10 # CoreDNS의 ClusterIP
- 1.1.1.1 # 외부 DNS fallback (선택 사항)
searches:
- default.svc.cluster.local
- svc.cluster.local
options:
- name: ndots
value: "2"
# 고정 도메인 이름 구성 (Stateful DNS 구성 방식)
hostname: web
subdomain: app
containers:
- name: curl
image: curlimages/curl:latest
command: ["sh", "-c", "sleep 3600"]