某些情況下,DNS 或者其他的域名解析方法可能不太適用,您需要配置 /etc/hosts 文件,在Linux下是比較容易做到的,在 Kubernetes 中,可以通過 Pod 定義中的 hostAliases
字段向 Pod 的 /etc/hosts 添加條目。
適用其他方法修改 Pod 的 /etc/hosts 文件是不被推薦的,因為 kubelet 可能在重新創建 Pod 時,就會覆蓋這些修改。
默認hosts文件內容
通過創建一個 Nginx Pod,我們可以查看Pod創建后,/etc/hosts 文件的默認內容,執行命令:
kubectl run nginx --image nginx --generator=run-pod/v1
執行命令查看 Pod 的IP:
kubectl get pods -o 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
文件只包含 IPv4 和 IPv6 的基本配置,例如 localhost
和該 Pod 自己的 hostname。
使用hostAliases添加額外的條目
通過 Pod 定義中的 .spec.hostAliases
字段,我們可以向 Pod 的 /etc/hosts
文件中添加額外的條目,用來解析 foo.local
、bar.local
到 127.0.0.1 和
foo.remote
、bar.remote
到 10.1.2.3
,如下所示:
host-aliases-pod.yaml文件內容
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
command:
- cat
args:
- "/etc/hosts"
執行一下命令可創建該 Pod:
kubectl apply -f host-aliases-pod.yaml
執行命令查看 Pod 的 IP 和狀態:
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
從結果中,我們可以看到,配置的條目被添加在 /etc/hosts
文件的末尾。
為什么kubelet要管理hosts文件
Kubelet 管理
hosts
修改
該文件。
細節情況請參考兩個 github issue:
https://github.com/kubernetes/kubernetes/issues/14633
https://github.com/moby/moby/issues/17190
由於該文件已經被 Kubelet 管理起來,任何對該文件手工修改的內容,都將在 Kubelet 重啟容器或者 Pod 重新調度時被覆蓋。因此,最好是通過 修改 Pod 的 /etc/hosts 文件,而不是手工修改。