CoreDNS in Kubernetes

Yu Sang Min·2025년 6월 28일

CKA

목록 보기
84/110
post-thumbnail

🌐 Kubernetes DNS 동작 원리 — CoreDNS 구성과 메커니즘


🔥 DNS가 필요한 이유

  • Pod IP는 동적이다 (삭제/재배포 시 변경).
  • IP가 아닌 DNS 이름 기반 서비스 디스커버리가 필수.
  • 수천 개의 Pod와 서비스가 생성/삭제되는 환경에서 /etc/hosts 방식은 불가능.

🚀 Kubernetes DNS 아키텍처

DNS 구성 요소

컴포넌트역할
CoreDNS클러스터 내부 DNS 서버
kube-dns이전 버전 (v1.12 이전)에서 사용
kubeletPod 생성 시 /etc/resolv.conf 파일에 DNS 서버 정보 자동 주입
KubeDNS 서비스CoreDNS에 접근하는 클러스터 내부 서비스

CoreDNS 배포 구조

  • Deployment 형태로 운영
  • 일반적으로 ReplicaSet 2개 이상의 Pod로 고가용성 유지
  • 네임스페이스: kube-system
  • 서비스 이름: kube-dns
  • 서비스 타입: ClusterIP
  • 기본 IP: 예) 10.96.0.10

⚙️ CoreDNS 설정 구조

Corefile 예시

.:53 {
    errors
    health
    kubernetes cluster.local in-addr.arpa ip6.arpa {
        pods insecure       # Pod DNS 레코드 활성화
        fallthrough in-addr.arpa ip6.arpa
    }
    forward . /etc/resolv.conf
    cache 30
    loop
    reload
    loadbalance
}

✅ 주요 플러그인

플러그인기능
kubernetesKubernetes 리소스를 DNS로 변환
forward클러스터 외부 도메인 질의 처리 (예: 구글 DNS)
cache성능 향상용 캐싱
health헬스체크 엔드포인트 제공
errors에러 로깅

🏗️ Pod의 DNS 구성 방식

  • kubelet이 Pod를 생성하면서 자동으로 /etc/resolv.conf에 DNS 서버 정보 주입
  • 예시:
nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5

search 도메인 덕분에 짧은 이름으로도 검색 가능


🌍 DNS 이름 해석 과정

✅ 서비스 이름 해석 순서

예: web-service 호출 시
→ 검색 순서:

1. web-service.default.svc.cluster.local
2. web-service.svc.cluster.local
3. web-service.cluster.local

✅ 실제 FQDN

web-service.default.svc.cluster.local

→ 같은 네임스페이스에서는 단순히 web-service만으로도 접근 가능.


🎯 Pod DNS 레코드

  • 기본적으로 Pod는 DNS 레코드가 생성되지 않음
  • CoreDNS pods 옵션을 통해 활성화 가능
  • 형식:
[IP-하이픈변환].[네임스페이스].pod.cluster.local

✅ 예시

Pod IPDNS
10.244.1.510-244-1-5.default.pod.cluster.local

🔗 서비스 vs Pod DNS 정리

구분서비스 DNSPod DNS
기본 활성화❌ (옵션)
이름 형태svc.cluster.localpod.cluster.local
추천 사용디버깅, 특수 목적만 권장

🧠 DNS 동작 흐름

1️⃣ 사용자가 kubectl apply -f service.yaml로 서비스 생성
2️⃣ Kubernetes API 서버가 서비스 생성 이벤트 발생
3️⃣ CoreDNS가 Kubernetes API를 watch하여 서비스 레코드 생성
4️⃣ Pod는 /etc/resolv.conf를 통해 DNS 서버로 질의
5️⃣ CoreDNS는 해당 이름 → 서비스 IP 반환

→ Pod 간 통신이 서비스 이름만으로 이루어짐


🔥 CoreDNS를 통한 외부 도메인 해석

  • CoreDNS는 클러스터 외부 도메인도 해석 가능

  • 예) www.google.com 요청 시

    • forward 플러그인이 /etc/resolv.conf 또는 외부 Public DNS로 포워딩

🏆 DNS 장애 시 영향

  • CoreDNS 다운 → 서비스 이름으로의 접근 불가
  • 하지만 이미 열린 연결이나 IP 직접 호출은 영향 없음
  • 일반적으로 CoreDNS는 ReplicaSet으로 최소 2개 이상 운영

🏗️ DNS 관련 주요 명령어

✅ DNS 레코드 확인

kubectl get svc -n kube-system

✅ Pod 내부에서 DNS 테스트

kubectl exec -it <pod-name> -- nslookup web-service
kubectl exec -it <pod-name> -- dig web-service
kubectl exec -it <pod-name> -- cat /etc/resolv.conf

🚀 결론

  • Kubernetes는 서비스 디스커버리를 위해 CoreDNS를 클러스터 내부에 기본 제공
  • 서비스는 svc.cluster.local 도메인으로, Pod는 옵션에 따라 pod.cluster.local로 접근 가능
  • kubelet이 각 Pod의 /etc/resolv.conf를 자동 구성하여 DNS 서버로 CoreDNS 서비스 IP를 설정
  • search 도메인 덕분에 짧은 이름만으로도 쉽게 서비스 접근 가능

profile
React, Node.js, AWS, Git, Github, Github Action, Docker, K8S

0개의 댓글