DNS 서비스 발견
Kubernetes 내부 DNS 시스템과 서비스 발견 메커니즘
Kubernetes 내부 DNS 시스템과 서비스 발견 메커니즘
목표: Pod가 서비스를 찾고 통신하는 원리를 이해할 수 있는 수준
🌐 CoreDNS
개요
graph TB
subgraph "DNS 질의 흐름"
Pod["📦 Pod"] -->|"my-service"| CoreDNS["🌐 CoreDNS"]
CoreDNS -->|"질의"| API["🔷 API Server"]
API -->|"Service 정보"| CoreDNS
CoreDNS -->|"10.96.123.456"| Pod
end
CoreDNS는 Kubernetes의 기본 DNS 서버입니다.
- 클러스터 낮 DNS 질의 처리
- Service/Pod 이름 → IP 변환
- 플러그인 기반 확장
📋 DNS 이름 규칙
| 리소스 | DNS 이름 | 예시 |
|---|---|---|
| Service | service.namespace.svc.cluster.local | my-svc.default.svc.cluster.local |
| Pod | pod-ip.namespace.pod.cluster.local | 10-244-1-2.default.pod.cluster.local |
| Headless Service | pod-name.service.namespace.svc.cluster.local | mysql-0.mysql.default.svc.cluster.local |
짧은 이름
# 같은 네임스페이스
my-service
# 다른 네임스페이스
my-service.other-namespace
# 전체 도메인
my-service.default.svc.cluster.local
🔧 CoreDNS 설정
ConfigMap
# CoreDNS ConfigMap 확인
kubectl get configmap coredns -n kube-system -o yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: coredns
namespace: kube-system
data:
Corefile: |
.:53 {
errors
health {
lameduck 5s
}
ready
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
ttl 30
}
prometheus :9153
forward . /etc/resolv.conf {
max_concurrent 1000
}
cache 30
loop
reload
loadbalance
}
🎯 Headless Service
개념
ClusterIP가 None인 서비스.
- 로드밸런싱 없음
- 각 Pod의 IP 직접 반환
- StatefulSet과 함께 사용
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
selector:
app: mysql
ports:
- port: 3306
clusterIP: None # Headless
DNS 조회 결과
# Headless Service
nslookup mysql
# Name: mysql.default.svc.cluster.local
# Address: 10.244.1.10
# Address: 10.244.1.11
# Address: 10.244.1.12
# 일반 Service
nslookup my-service
# Name: my-service.default.svc.cluster.local
# Address: 10.96.123.456 # ClusterIP만 반환
🐛 문제 해결
DNS 테스트
# DNS Pod 실행
kubectl run -it --rm debug --image=busybox:1.28 --restart=Never -- sh
# 테스트
nslookup kubernetes.default
nslookup my-service
nslookup my-service.other-namespace
# 외부 DNS
nslookup google.com
CoreDNS 문제
# CoreDNS Pod 상태
kubectl get pods -n kube-system -l k8s-app=kube-dns
# 로그 확인
kubectl logs -n kube-system -l k8s-app=kube-dns
# 재시작
kubectl rollout restart deployment coredns -n kube-system
📋 체크리스트
- CoreDNS 동작 확인
- Service DNS 이름 규칙
- Headless Service 사용처
- Pod DNS 질의 테스트
- 네임스페이스 간 DNS
- CoreDNS 문제 해결
🔗 관련 노트
- 01-06-Service-타입 — 서비스 노출
- 02-03-CNI-네트워크 — 네트워크 플러그인
- 02-11-Pod-실패-원인-분석 — DNS 문제
마지막 업데이트: 2026-06-01