/etc/resolv 에 관해서

📘 리눅스 /etc/resolv.conf 완벽 가이드 (K8s 환경 포함)

1. /etc/resolv.conf 역할

  • 도메인 이름 → IP 주소 변환(DNS Resolution) 시 참조하는 설정 파일
  • 모든 DNS 조회(dig, nslookup, 웹 브라우저 등)의 기본 규칙 제공
  • 쿠버네티스에서는 노드의 resolv.conf → Pod의 resolv.conf로 전파됨

2. 기본 구조 예시

nameserver 8.8.8.8
nameserver 1.1.1.1
search example.com local.lan
options ndots:2 timeout:2 attempts:2 rotate

주요 지시어

지시어설명예시
nameserver <IP>사용할 DNS 서버 (최대 3개)nameserver 8.8.8.8
search <도메인>짧은 호스트명에 붙일 검색 도메인search local.lan home.lan
domain <도메인>단일 검색 도메인domain local.lan
options추가 옵션ndots:2, timeout:3, rotate

3. 자주 쓰는 options

  • ndots:N → 점(.)이 N개 이상이면 FQDN으로 판단
    예: ndots:5이면 foo.bar도 search 도메인 붙여 여러 번 시도 → 느려질 수 있음
  • timeout:T → 응답 대기 시간(초)
  • attempts:N → 재시도 횟수
  • rotate → nameserver 라운드로빈 방식
  • single-request-reopen → IPv4/IPv6 동시 요청 문제 회피

4. 직접 수정하면 안 되는 이유

  • 많은 배포판에서 자동 생성/관리
  • 부팅, DHCP 갱신, 네트워크 재시작 시 덮어씌워짐
  • 관리 주체 예시:
    • systemd-resolved/etc/resolv.conf는 127.0.0.53(stub) 가리킴
    • NetworkManager
    • resolvconf, dhclient
    • Netplan

5. 올바른 수정 방법

systemd-resolved 사용 시

sudo nano /etc/systemd/resolved.conf
# DNS, Domains, DNSStubListener 설정
[Resolve]
DNS=1.1.1.1 8.8.8.8
FallbackDNS=9.9.9.9
Domains=local.lan
sudo systemctl restart systemd-resolved
resolvectl status
  • kubelet이 참고할 파일: /run/systemd/resolve/resolv.conf

NetworkManager 사용 시

nmcli connection modify eth0 ipv4.dns "1.1.1.1 8.8.8.8"
nmcli connection modify eth0 ipv4.ignore-auto-dns yes
nmcli connection up eth0

DHCP 클라이언트 사용 시

# /etc/dhcp/dhclient.conf
supersede domain-name-servers 1.1.1.1, 8.8.8.8;

6. 쿠버네티스에서의 resolv.conf

dnsPolicy

설명
ClusterFirst기본값. 클러스터 DNS(CoreDNS) 우선
ClusterFirstWithHostNethostNetwork Pod에서 클러스터 DNS 우선
Default노드의 resolv.conf 그대로 사용
None완전 수동, dnsConfig 필요

Pod에서 dnsConfig 사용 예

apiVersion: v1
kind: Pod
metadata:
  name: dns-test
spec:
  dnsPolicy: None
  dnsConfig:
    nameservers:
      - 1.1.1.1
    searches:
      - example.com
    options:
      - name: ndots
        value: "1"
  containers:
    - name: busybox
      image: busybox
      command: ["sleep", "3600"]

7. CoreDNS 업스트림 변경 예

.:53 {
    forward . 1.1.1.1 8.8.8.8
    cache 30
    errors
}
internal.local:53 {
    forward . 192.168.0.1
}

8. 집 K8s 환경에서 추천 구성

  1. 노드:
    • /etc/resolv.conf가 127.0.0.53이면 kubelet에 다음 설정:
      --resolv-conf=/run/systemd/resolve/resolv.conf
      
  2. CoreDNS:
    • 신뢰 가능한 업스트림 DNS 명시
  3. Pod 특수 케이스:
    • 외부 DNS 바로 사용: dnsPolicy: None + dnsConfig

9. 디버깅 명령어

노드에서

cat /etc/resolv.conf
resolvectl status
dig @1.1.1.1 kubernetes.io

Pod에서

kubectl exec -it <pod> -- cat /etc/resolv.conf
kubectl exec -it <pod> -- dig kubernetes.default.svc.cluster.local

CoreDNS 로그

kubectl -n kube-system logs -l k8s-app=kube-dns

10. FAQ

  • Q: resolv.conf 직접 수정해도 돼?
    A: 재부팅/네트워크 재시작 시 덮어씌워짐. 상위 설정에서 변경 권장.
  • Q: nameserver 4개 넣으면?
    A: 3개까지만 유효.
  • Q: ndots 줄이면?
    A: 내부 DNS 성능 향상 가능.

📌 요약

  • /etc/resolv.confDNS 해석 기본 설정
  • 쿠버네티스에서는 노드 → Pod로 전파
  • Ubuntu + systemd-resolved 환경에서는 /run/systemd/resolve/resolv.conf를 kubelet에 지정
  • CoreDNS 업스트림 명시로 안정성 확보 셋업