# 配置Pod的 /etc/hosts

参考文档:Adding entries to Pod /etc/hosts with HostAliases (opens new window)

某些情况下,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
1

执行命令查看 Pod 的IP:

kubectl get pods -o wide
1

输出结果如下所示:

NAME     READY     STATUS    RESTARTS   AGE    IP           NODE
nginx    1/1       Running   0          13s    10.200.0.4   worker0
1
2

执行命令查看hosts文件的内容

kubectl exec nginx -- cat /etc/hosts
1

输出结果如下所示:

# 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
1
2
3
4
5
6
7
8

默认情况下, 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,如下所示:

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"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

执行一下命令可创建该 Pod:

kubectl apply -f https://kuboard.cn/statics/learning/svc/host-aliases-pod.yaml
1

执行命令查看 Pod 的 IP 和状态:

kubectl get pod --output=wide
1

输出结果如下所示:

NAME                           READY     STATUS      RESTARTS   AGE       IP              NODE
hostaliases-pod                0/1       Completed   0          6s        10.200.0.5      worker0
1
2

执行命令查看 hosts 文件内容:

kubectl logs hostaliases-pod
1

输出结果如下所示:

# 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
1
2
3
4
5
6
7
8
9
10
11
12

从结果中,我们可以看到,配置的条目被添加在 /etc/hosts 文件的末尾。

# 为什么kubelet要管理hosts文件

Kubelet 管理 (opens new window) hosts Pod 中每个容器的 hosts 文件,以便可以阻止 Docker 在容器启动以后 修改 (opens new window) 该文件。

细节情况请参考两个 github issue:

https://github.com/kubernetes/kubernetes/issues/14633 (opens new window)

https://github.com/moby/moby/issues/17190 (opens new window)

由于该文件已经被 Kubelet 管理起来,任何对该文件手工修改的内容,都将在 Kubelet 重启容器或者 Pod 重新调度时被覆盖。因此,最好是通过 hostAliases 修改 Pod 的 /etc/hosts 文件,而不是手工修改。

更新时间: 2019-10-28 20:51:59