파드가 사용하는 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 로 질의한다.
- FQDN 으로 인식하지 않으면, search 에 설정된 도메인 이름을 하나씩 suffix 로 붙여 질의함.
- 내부 DNS 이름으로 통신하는 경우가 많은 경우, 대부분의 짧은 이름들이 내부 DNS 도메인을 통해 먼저 해석되도록 유도하기 위해 ndots:5 를 설정하는 경우가 많다.(응답속도 빠름)
- ndots 는 name with dots 의 약자로, 질의된 도메인 이름에 최소 몇개의 dot 이 있어야 완전한 도메인(FQDN)으로 인식할지 정의하는 값이다.
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 확인
'Kubernetes' 카테고리의 다른 글
[Kubernetes] 컨테이너 작업 디렉터리 설정 (0) | 2025.08.24 |
---|---|
[Kubernetes] 파드 내 모든 컨테이너의 정적 호스트 설정 (0) | 2025.08.24 |
[Kubernetes] 파드 디자인 패턴 (0) | 2025.07.29 |
[Kubernetes] static pod 생성하기 (0) | 2025.05.25 |
[Kubernetes] pod 생성하기 (0) | 2025.05.25 |