HostAliases로 파드 /etc/hosts에 항목 추가하기

HostAliases로 파드 /etc/hosts에 항목 추가하기 (Adding entries to Pod /etc/hosts with HostAliases)

파드의 /etc/hosts 파일에 항목을 추가하면 DNS 및 기타 옵션이 적용되지 않을 때 호스트 이름 해석을 파드 수준에서 재정의(override)할 수 있어요. 이러한 사용자 지정 항목은 PodSpec의 HostAliases 필드로 추가할 수 있어요.

쿠버네티스 프로젝트는 /etc/hosts를 직접 편집하는 init 컨테이너나 다른 수단을 쓰지 말고, hostAliases 필드(파드의 .spec의 일부)를 사용해 DNS 구성을 수정할 것을 권장해요. 다른 방식으로 변경하면 파드 생성이나 재시작 시 kubelet이 덮어쓸 수 있어요.

출처: 문서

본문

기본 hosts 파일 내용

Pod IP가 할당된 Nginx 파드를 시작해요.

kubectl run nginx --image nginx
pod/nginx created

파드 IP를 확인해요.

kubectl get pods --output=wide
NAME     READY     STATUS    RESTARTS   AGE    IP           NODE
nginx    1/1       Running   0          13s    10.200.0.4   worker0

hosts 파일 내용은 다음과 같아요.

kubectl exec nginx -- cat /etc/hosts
# Kubernetes-managed hosts file.
127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
fe00::0	ip6-mcastprefix
fe00::1	ip6-allnodes
fe00::2	ip6-allrouters
10.200.0.4	nginx

기본적으로 hosts 파일에는 localhost와 자신의 호스트 이름 같은 IPv4 및 IPv6 상용구(boilerplate)만 포함돼요.

hostAliases로 추가 항목 추가하기

기본 상용구 외에도 hosts 파일에 추가 항목을 넣을 수 있어요. 예를 들어 foo.local, bar.local을 127.0.0.1로, foo.remote, bar.remote를 10.1.2.3으로 해석하게 하려면, 파드의 .spec.hostAliases 아래에 HostAliases를 구성할 수 있어요.

apiVersion: v1
kind: Pod
metadata:
  name: hostaliases-pod
spec:
  restartPolicy: Never
  hostAliases:
  - ip: "127.0.0.1"
    hostnames:
    - "foo.local"
    - "bar.local"
  - ip: "10.1.2.3"
    hostnames:
    - "foo.remote"
    - "bar.remote"
  containers:
  - name: cat-hosts
    image: busybox:1.28
    command:
    - cat
    args:
    - "/etc/hosts"

이 구성으로 파드를 시작할 수 있어요.

kubectl apply -f https://k8s.io/examples/service/networking/hostaliases-pod.yaml
pod/hostaliases-pod created

파드의 세부 정보를 확인해 IPv4 주소와 상태를 봐요.

kubectl get pod --output=wide
NAME                           READY     STATUS      RESTARTS   AGE       IP              NODE
hostaliases-pod                0/1       Completed   0          6s        10.200.0.5      worker0

hosts 파일 내용은 다음과 같아요.

kubectl logs hostaliases-pod
# Kubernetes-managed hosts file.
127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
fe00::0	ip6-mcastprefix
fe00::1	ip6-allnodes
fe00::2	ip6-allrouters
10.200.0.5	hostaliases-pod

# Entries added by HostAliases.
127.0.0.1	foo.local	bar.local
10.1.2.3	foo.remote	bar.remote

추가 항목이 맨 아래에 지정되어 있어요.

kubelet이 hosts 파일을 관리하는 이유

kubelet은 컨테이너가 이미 시작된 후 컨테이너 런타임이 hosts 파일을 수정하지 못하게 하기 위해 파드의 각 컨테이너에 대해 hosts 파일을 관리해요. 역사적으로 쿠버네티스는 항상 Docker Engine을 컨테이너 런타임으로 사용했고, Docker Engine은 각 컨테이너가 시작된 후 /etc/hosts 파일을 수정했어요.

현재 쿠버네티스는 다양한 컨테이너 런타임을 사용할 수 있어요. 그럼에도 kubelet은 각 컨테이너 안의 hosts 파일을 관리해, 어떤 컨테이너 런타임을 사용하든 결과가 의도한 대로 나오도록 해요.

주의:

컨테이너 안의 hosts 파일을 수동으로 변경하는 것을 피하세요.

hosts 파일을 수동으로 변경하면 그 변경은 컨테이너가 종료될 때 손실돼요.

더 알아보기 (Learn more)