Kubernetes DNS

inuit·2025년 5월 9일

All about 쿠버네티스

목록 보기
13/21
post-thumbnail

최근 업데이트일 2024-11-20

따라하며 배우는 쿠버네티스: Kubernetes DNS

쿠버네티스: DNS for Services and Pods

쿠버네티스 내에서 사용할 수 있는 DNS와 이를 구현하는 CoreDNS에 대해서 배워보자.

Kubernetes DNS

쿠버네티스는 클러스터 내부 통신을 위한 전용 DNS 시스템을 내장하고 있어, Pod와 Service 간의 도메인 기반 통신이 가능하다.

  • 이를 통해 Pod가 삭제 후 재생성 되더라도 새 IP가 DNS로 등록되기 때문에 별도의 변경 없이 다시 연결할 수 있다.
  • 서비스 이름만으로 다른 Pod나 Service의 IP를 찾을 수 있는 서비스 디스커버리 용도로도 사용할 수 있다.
  • 특정 서비스의 도메인은 [service Name].[namespace].svc.cluster.local 이고 특정 Pod의 도메인은 [Pod-IP].[namespace].pod.cluster.local이다.
  • Pod는 IP에 따라 도메인이 바뀌므로 Pod에 spec.template.spec.hostnamesubdomain을 지정하면 DNS가 [hostname].[subdomain].[namespace].svc.cluster.local로 생성된다.
  • spec.dnsPolicy: Pod가 도메인 name을 어떻게 해석할지, 즉 DNS 질의가 어떤 흐름으로 처리될지를 지정하는 설정
    • Default: DNS 설정을 Pod가 실행되는 노드의 설정을 가져와서 사용
      • Node의 /etc/resolv.conf를 그대로 사용하므로 Kubernetes DNS 기능 사용하지 않는다.
    • ClusterFirst(기본값): 클러스터 DNS(CoreDNS) 를 우선 사용
      • 클러스터 내부 도메인과 일치하지 않는 경우 클러스터 외부 DNS인 upstream DNS에 질의한다.
    • ClusterFirstWithHostNet: hostNetwork 옵션으로 실행할때 반드시 사용해야 하는 옵션
      • hostNetwork는 Pod가 자기만의 격리된 가상 네트워크 네임스페이스를 사용하지 않고, Node의 네트워크를 그대로 사용하는 설정이다.
      • Pod가 hostNetwork: true일 때도 Cluster DNS 사용 가능하게 한다.
    • None: 쿠버네티스 클러스터 내부의 DNS 설정을 무시spec.dnsConfig에서 별도의 DNS 설정 필수

Core DNS

쿠버네티스 클러스터의 DNS 역할을 수행할 수 있는, 유연하고 확장 가능한 DNS 서버

  • 클러스터 내 Pod에서 어떤 도메인을 찾고자 할 때 kube-system 네임스페이스에 실행되고 있는 CoreDNS가 nameserver로 사용된다.
    • 기존 kube-dns에서 CoreDNS가 표준이 되었다.
  • 장점
    • 서비스 디스커버리
    • 사용자 정의 확장성 (Corefile 기반)
    • Kubernetes API와의 통합
      • Kubernetes API 서버와 직접 연결되어 클러스터 안의 Service, Pod 정보를 실시간으로 가져올 수 있다.
  • Corefile 설정 파일
    • /etc/resolv.conf에 원하는 것들만 플러그인처럼 추가하는 방식으로 사용한다.
    • 해당 설정 파일을 통해 사용자가 원하는 DNS 처리 흐름을 유연하게 만들 수 있다.
.: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가 자기 자신에게 무한 재귀 요청하는 상황을 감지하고 차단
}
  • Pod 내부에서 사용되는 /etc/resolv.conf 내용을 커스터마이징하고 싶다면, Pod의 spec.dnsPolicy: None과 함께 spec.dnsConfig를 설정해야 한다.
    • nameservers: Pod가 DNS 질의를 보낼 nameserver의 IP 주소 목록
      • 일반적으로는 CoreDNS의 ClusterIP 주소를 지정하지만, dnsPolicy: None일 경우 외부 DNS도 지정 가능
    • searches: 상대 도메인 이름을 보완하기 위해 자동으로 붙일 도메인 접미사들
      • 즉, my-service라고 입력했을 때 my-service.default.svc.cluster.local처럼 자동 확장되게 함.
    • options: /etc/resolv.conf에 들어가는 옵션들 중 하나로, 몇 개의 점(dot)이 있어야 도메인을 절대 경로(FQDN) 로 판단할지를 설정.
  • Pod 예시
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"]
profile
It’s always white night here.

0개의 댓글