配置Pod的 /etc/hosts


某些情況下,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.localbar.local127.0.0.1 和 foo.remotebar.remote10.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 文件,而不是手工修改。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM