[k8s] DNS for Service and Pods


Services, Load Balancing and Networking

Kubernetes networking은 4가지 문제를 해결

  • Pod 내의 Container들은 loopback을 통한 networking을 사용하여 통신
    • LoopBack?
      • 거의 coding없이 dynamic end-to-end REST API를 생성가능한 고확장가능한, 오픈소스 Node.js Framework
      • 가상의 인터페이스. 물리 인터페이스인 경우 serial일때 clock rate, WAN encapsulation등 부여 및 외부 간섭이 필요
      • 비교적 안전한 인터페이스
  • Cluster Networking은 다른 Pod 간의 communication을 제공
  • Service resource는 Pod안에 실행 중인 application을 cluster 바깥에서 접근하기 위해 외부로 노출
  • Service를 활용하여 cluster 내부에서 사용할 수 있는 서비스만 게시 가능

DNS for Service and Pods

Introduction

Kubernetes DNS은 DNS Pod와 Service 를 Cluster에 스케쥴링 함. 개별 container들이 DNS Name을 해석할때 DNS servier의 IP를 사용하도록 kubeletes를 구성

Cluster에 정의된 모든 Service들은 DNS Name에 할당. 기본적으로 client Pod의 DNS 검색은 Pod의 namespace와 cluster의 기본 domain을 포함하여 검색


Namespaces of Services

  • DNS query는 pod의 namespace에 따라서 다른 결과를 return한다 namespace를 특정하는 DNS query들은 pods의 namespace에 제한된다 DNS query에서 지정하여 다른 namespace의 서비스에 접근한다

    • example

      test라는 namespace가 있다고 가정. prod라는 namespace에 있는 data service 안에 존재. data를 위한 query는 결과를 얻을 수 없음. 왜냐하면 그것은 pod의 test namespace를 사용하기 떄문이다 data.prod의 query는 원하는 결과를 얻을 수 있음. 왜냐하면 특정한 namespace를 지정하였기 떄문이다

  • DNS query들은 pod의 /etc/resolvconf를 활용하여 확장된다. Kubelet은 이 file을 각각의 pod에 설정.
    • example

      data를 위한 query는 data.test.cluster.local로 확장된다 search option의 값은 query들은 확장한다.

    • 상세 : resolv.conf
        nameserver 10.32.0.10
        search <namespace>.svc.cluster.local svc.cluster.local cluster.local
        options ndots:5
      
  • 요약하면, test의 namespace에 있는 pod는 data.prod 또는 data.prod.cluster.local로 성공적으로 접근 가능

DNS Records

DNS record를 찾은 object들은 아래와 같음

1. services
2. pods

Services

A/AAAA records

  • "Normal" service들은 service ip계열에 따라 my-svc.my-namespace.svc.cluster-domain.example형식의 이름을 가진 DNS A또는 AAAA record에 할당. 이는 service의 cluster ip로 해석
  • Headless(cluster ip가 없는)는 service들은 또한 service ip계열에 따라 my-svc.my-namespace.svc.cluster-domain.example형식의 이름을 가진 DNS A또는 AAAA record에 할당. Normal service와 달리, 이것은 service에 의해 선택된 Pod의 ip집합으로 해석.
  • client들은 set를 사용하거나 set에서 표준 round-robin 선택을 사용

SRV records

  • SRV 레코드는 Normal service 또는 Headless service에 속하는 네임드 port 를 위해 만들어졌다.
  • 각각의 네임드 port에 대해서 SRV 레코드는 다음과 같은 형식을 가질 수 있다. _my-port-name._my-port-protocol.my-svc.my-namespace.svc.cluster-domain.example.
  • Normal service의 경우, 이는 포트 번호와 도메인 네임으로 해석된다. my-svc.my-namespace.svc.cluster-domain.example.
  • Headless service의 경우, 서비스를 지원하는 각 파드에 대해 하나씩 복수 응답으로 해석되며 이 응답은 pod의 포트 번호domain 이름을 포함한다. auto-generated-name.my-svc.my-namespace.svc.cluster-domain.example

Pods

  • 일반적으로 파드에는 다음과 같은 DNS 주소를 갖는다.

    pod-ip-address.my-namespace.pod.cluster-domain.example.

예를 들어, default 네임스페이스의 파드에 IP 주소 172.17.0.3이 있고, 클러스터의 도메인 이름이 cluster.local 이면, 파드는 다음과 같은 DNS 주소를 갖는다.

172-17-0-3.default.pod.cluster.local.

  • 서비스에 의해 노출된 디플로이먼트(Deployment)나 데몬셋(DaemonSet)에 의해 생성된 모든 파드는 다음과 같은 DNS 주소를 갖는다.

pod-ip-address.deployment-name.my-namespace.svc.cluster-domain.example


Pod’s Hostname and subdomain fields

Pod’s DNS Policy

DNS 정책은 파드별로 설정할 수 있다. 현재 k8s는 다음과 같은 pod별 DNS 정책을 지원한다. 이 정책들은 pod spec dnsPolicy 필드에서 지정할 수 있다.

  • Default: 파드는 파드가 실행되고 있는 노드로부터 네임 해석 설정(the name resolution configuration)을 상속받는다. 자세한 내용은 관련 논의에서 확인할 수 있다.

  • ClusterFirst: “www.kubernetes.io”와 같이 클러스터 도메인 suffix 구성과 일치하지 않는 DNS 쿼리는 노드에서 상속된 업스트림 네임서버로 전달된다. 클러스터 관리자는 추가 스텁-도메인(stub-domain)과 업스트림 DNS 서버를 구축할 수 있다. 그러한 경우 DNS 쿼리를 어떻게 처리하는지에 대한 자세한 내용은 관련 논의에서 확인할 수 있다.

  • ClusterFirstWithHostNet: hostNetwork에서 running 상태인 파드의 경우 DNS 정책인 “ClusterFirstWithHostNet”을 명시적으로 설정해야 한다.

  • None: 이 정책은 파드가 쿠버네티스 환경의 DNS 설정을 무시하도록 한다. 모든 DNS 설정은 파드 스펙 내에 dnsConfig필드를 사용하여 제공해야 한다. 아래 절인 파드의 DNS 설정에서 자세한 내용을 확인할 수 있다.

Note: Default is not the default DNS policy. If dnsPolicy is not explicitly specified, then ClusterFirst is used.


Pods’s DNS Config

사용자가 Pod의 DNS setting을 직접 설정 가능

dnsConfig field는 optional이고, dnsPolicy setting과 함께 동작 dnsPolicy값이 None으로 설정되어 있어야 dnsConfig field를 지정가능

  • nameservers : pod의 dns서버가 사용할 IP주소의 목록. dnsPolicyNone으로 설정된 경우 적어도 하나의 IP주소가 포함되어야함. 그렇지 않으면 이 속성은 생략 가능. nameservers에 나열된 서버는 지정된 dns policy를 통해 생성된 기본 nameserver와 합쳐지며 중복되는 주소는 제거
  • searches : pod의 hostname을 찾기 위한 dns search domain. 이 속성은 생략가능. 값을 지정한 경우 나열된 검색 domain은 지정된 dns policyy를 통해 기본 search domain과 합쳐진다. 병합 시 중복되는 domain은 제거되며, kubernetes는 최대6개의 search domains을 허용
  • options : name 속성(필수)과 value 속성(선택)을 가질 수 있는 오브젝트들의 선택적 목록이다. 이 속성의 내용은 지정된 DNS 정책에서 생성된 옵션으로 병합된다. 이 속성의 내용은 지정된 DNS 정책을 통해 생성된 옵션으로 합쳐지며, 병합 시 중복되는 항목은 제거된다.

  • custom dns setting의 예시

    • 위에서 pod가 생성되면, container의 test/etc/resolv.conf 파일에는 다음과 같은 내용이 검색
        nameserver 1.2.3.4
        search ns1.svc.cluster-domain.example my.dns.search.suffix
        options ndots:2 edns0
      

참고

kubernetes - dns