/etc/hosts 에 관해서

/etc/hosts 완전 정리 (K8s 운영자 관점)

집/랩 환경에서 K8s를 굴릴 때 /etc/hosts를 정확히 이해하면 “DNS가 안 잡히는 상황”, “부트스트랩 시 통신 안 됨”, “로컬 테스트 도메인 강제 매핑” 같은 문제를 빠르게 뚫을 수 있어요.
아래를 쭉 보면 역할 → 동작 원리 → 실전 설정 → K8s 특화 팁 순으로 정리돼 있습니다.


1) /etc/hosts는 뭐 하는 파일?

  • 로컬(host) 단에서 “이름 → IP”를 가장 먼저(보통) 해석하는 정적 매핑표
  • 네트워크를 타지 않고 OS가 파일을 읽어서 즉시 해석
  • nsswitch.conf 순서에 따라 보통 /etc/hosts가 DNS보다 우선
  • DNS 레코드와 충돌 시 /etc/hosts가 항상 이김

확인 명령:

getent hosts myname.local

2) 파일 형식과 기본 규칙

# IPv4 예시
192.168.219.151 master-node-1.home.lan master-node-1

# IPv6 예시
fe80::1234:abcd master-node-1-v6
  • 주석은 # 이후
  • 한 이름당 한 IP 원칙
  • IPv4/IPv6 동시 사용 시 우선순서 확인 (getent ahosts NAME)

3) K8s에서 왜 중요한가?

  • 부트스트랩/장애 시 DNS가 준비 전이어도 노드 간 통신 가능
  • 고정 FQDN ↔ IP 매핑 가능
  • 로컬 개발/테스트 시 특정 도메인을 내부 IP로 강제

단, K8s 서비스/파드 이름 해석은 CoreDNS가 담당


4) K8s 홈 클러스터 권장 패턴

4.1 호스트네임 & FQDN 정리

sudo hostnamectl set-hostname master-node-1.home.lan
hostname -f   # master-node-1.home.lan
hostname -s   # master-node-1

4.2 /etc/hosts 예시

127.0.0.1       localhost
127.0.1.1       master-node-1

192.168.219.151 master-node-1.home.lan master-node-1
192.168.219.181 worker-node-1.home.lan worker-node-1
192.168.219.182 worker-node-2.home.lan worker-node-2
192.168.219.183 worker-node-3.home.lan worker-node-3

192.168.219.200 harbor.home.lan
192.168.219.201 grafana.home.lan
192.168.219.202 argocd.home.lan

5) 안전한 수정 방법

# 백업
sudo cp /etc/hosts /etc/hosts.bak.$(date +%F)

# 편집
sudo nano /etc/hosts

# 추가 (명령 사용)
echo "192.168.219.151 master-node-1.home.lan master-node-1" | sudo tee -a /etc/hosts

# 검증
getent hosts master-node-1
ping -c1 master-node-1

6) 활용 패턴 예시

  1. 외부 DNS 건너뛰기

    192.168.219.200 harbor.home.lan
    

    → 브라우저에서 https://harbor.home.lan 시 내부 IP로 바로 연결

  2. 장애 시 우회

    • DNS 장애 시 핵심 서비스 IP를 /etc/hosts에 임시로 등록
  3. 관리용 별칭

    192.168.219.151 m1
    192.168.219.181 w1
    

7) Kubernetes 파드 /etc/hosts

  • 노드 /etc/hosts와 별개로 파드 전용 파일 제공
  • 기존 파드는 노드 수정 후 자동 갱신 안 됨 → 재시작 필요
  • 추가 엔트리는 hostAliases 사용
apiVersion: v1
kind: Pod
metadata:
  name: demo
spec:
  hostAliases:
    - ip: "192.168.219.200"
      hostnames:
        - "harbor.home.lan"
  containers:
    - name: c
      image: curlimages/curl
      command: ["sleep","infinity"]

8) 흔한 함정 & 베스트 프랙티스

  • 루프백 매핑 실수 주의
  • 중복/상충 엔트리 금지
  • DHCP 예약으로 IP 고정
  • *.svc.cluster.local은 매핑하지 말 것
  • IPv6 우선순서 확인
  • /etc/hosts 권한 유지 (root:root 644)

9) 문제 진단 체크리스트

  1. hostname -f가 기대한 FQDN인지?
  2. getent hosts <이름> 결과 확인
  3. /etc/nsswitch.conf 순서 확인 (files dns)
  4. 중복 매핑 없는지
  5. 파드 내부 /etc/hosts 내용 확인
  6. DHCP 예약 여부 확인

10) 빠른 템플릿

127.0.0.1       localhost
127.0.1.1       <this-node-shortname>

192.168.219.151 master-node-1.home.lan master-node-1
192.168.219.181 worker-node-1.home.lan worker-node-1
192.168.219.182 worker-node-2.home.lan worker-node-2
192.168.219.183 worker-node-3.home.lan worker-node-3

192.168.219.200 harbor.home.lan
192.168.219.201 grafana.home.lan
192.168.219.202 argocd.home.lan