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 파일을 수동으로 변경하면 그 변경은 컨테이너가 종료될 때 손실돼요.