파드가 사용하는 DNS 또한 매니페스트 파일을 통해 설정할 수 있다.

spec.dnsPolicy 필드에 지정하며, 지정할 수 있는 값은 아래와 같다.

설정값 동작
ClusterFirst k8s 클러스터 내부 DNS 서비스에 질의하고, 해석되지 않으면 업스트림 DNS 서버(외부 DNS)에 질의(기본값)
None 파드 정의 내에서 정적으로 설정(직접 지정)
Default 파드가 올라간 k8s 노드의 /etc/resolv.conf 를 상속받음
ClusterFirstWithHostNet spec.hostNetwork: true 설정시, DNS 만 ClustFirst 로 동작

 

1. ClusterFirst

기본값으로, 클러스터 내부의 DNS 서버에 질의를 하고, 해석이 안되는 경우 업스트림 DNS 서버에 질의한다.

apiVersion: v1
kind: Pod
metadata:
  name: dnspolicy-clusterfirst
spec:
  dnsPolicy: ClusterFirst
  containers:
  - name: nginx-container
    image: nginx:1.16

 

위 파드를 실행하고, 아래 커맨드를 이용해서 컨테이너 내부의 DNS 설정파일과 클러스터 내부의 DNS Service에 할당된 IP 주소가 동일한 것을 알 수 있다.

 

$ kubectl exec -it dnspolicy-clusterfirst -- cat /etc/resolv.conf
# nameserver 의 IP 주소 확인

$ kubectl get services -n kube-system
# kube-dns 서비스의 CLUSTER-IP 확인

 

2. None

파드에서 클러스터 내부의 DNS 를 사용하지 않고, 외부 DNS 를 사용하도록 설정하는 방식이다. sepc.dnsConfig 에 직접 DNS 를 설정한다.

apiVersion: v1
kind: Pod
metadata:
  name: dnspolicy-none
spec:
  dnsPolicy: None
  dnsConfig:
    nameservers:
    - 8.8.8.8
    - 8.8.4.4
    searches:
    - example.com
    options:
    - name: ndots
      value: "5"
  containers:
  - name: nginx-container
    image: nginx:1.16

 

위 파드를 실행하고, 아래 커맨드를 실행시, DNS 설정이 직접 지정한 값으로 사용되는 것을 확인할 수 있다.

다만, search 와 ndots option 없이 정적으로 외부 DNS 서버만 사용하도록 설정하면, 클러스터 내부 DNS 를 사용한 서비스 디스커버리는 사용할 수 없게 된다.

$ kubectl exec -it dnspolicy-none -- cat /etc/resolv.conf
# nameserver 의 IP 주소 확인
search example.com
nameserver 8.8.8.8
nameserver 8.8.4.4
options ndots:5

 

참고로, 컨테이너 내의 /etc/resolv.conf 의 의미는 다음과 같다.

  • options ndots:5 와 search example.com
    • ndots 는 name with dots 의 약자로, 질의된 도메인 이름에 최소 몇개의 dot 이 있어야 완전한 도메인(FQDN)으로 인식할지 정의하는 값이다.
      • FQDN 으로 인식하지 않으면, search 에 설정된 도메인 이름을 하나씩 suffix 로 붙여 질의함.
        • 예를 들어, ndots:5 이고, search search.domain.com 일 때 test.example.com 으로 질의하면, test.example.com.search.domain.com 과 같이 search 도메인을 붙여 질의한다.
      • FQDN 으로 인식되면, 그대로 DNS 로 질의함.
        • 예를 들어, ndots:2 일 때 test.example.com 으로 질의하면 그대로 DNS 로 질의한다.
    • 내부 DNS 이름으로 통신하는 경우가 많은 경우, 대부분의 짧은 이름들이 내부 DNS 도메인을 통해 먼저 해석되도록 유도하기 위해 ndots:5 를 설정하는 경우가 많다.(응답속도 빠름)

 

3. Default

쿠버네티스 노드의 DNS 설정을 그대로 상속받는다. 이름이 default 이지만 기본값이 아님에 유의하자.

쿠버네티스 노드의 네트워크 설정(DNS 설정 포함)을 상속받는 설정인 spec.hostNetwork: true 과 동일한 효과를 가진다.

apiVersion: v1
kind: Pod
metadata:
  name: dnspolicy-default
spec:
  dnsPolicy: Default
  containers:
  - name: nginx-container
    image: nginx:1.16

 

위 파드를 실행하고, 아래 커맨드를 실행하면 노드에서 상속받은 DNS 설정을 확인할 수 있다.

$ kubectl exec -it dnspolicy-default -- cat /etc/resolv.conf
# node 에서 상속받은 DNS 설정이 조회됨

 

 

노드의 DNS 설정을 상속받기 때문에, 클러스터 내부의 DNS 를 사용한 서비스 디스커버리를 할 수 없다.

 

4. ClusterFirstWithHostNet

spec.hostNetwork: true 를 설정한 파드는 노드의 네트워크 설정을 상속받기 때문에, spec.dnsPolicy: ClusterFirst 를 설정해도 클러스터 내부 DNS 를 사용하지 않게 된다. 이때 ClusterFirst 와 같은 효과를 가지기 위해 사용하는 설정이다.

apiVersion: v1
kind: Pod
metadata:
  name: dnspolicy-clusterfirstwithhostnet
spec:
  dnsPolicy: ClusterFirstWithHostNet
  hostNetwork: true
  containers:
  - name: nginx-container
    image: nginx:1.16

 

위 파드를 실행하고, 아래 커맨드를 실행하면 ClusterFirst 와 동일하게 컨테이너 내부의 DNS 설정파일과 클러스터 내부의 DNS Service에 할당된 IP 주소가 동일한 것을 알 수 있다.

$ kubectl exec -it dnspolicy-clusterfirstwithhostnet -- cat /etc/resolv.conf
# nameserver 의 IP 주소 확인

$ kubectl get services -n kube-system
# kube-dns 서비스의 CLUSTER-IP 확인

 

블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,