使用 HostAliases 向 Pod etc/hosts 文件添加条目
建议通过使用 HostAliases 来进行修改,因为该文件由 Kubelet 管理,并且可以在 Pod 创建/重启过程中被重写。
默认 hosts 文件内容
让我们从一个 Nginx Pod 开始,给该 Pod 分配一个 IP:
kubectl run nginx --image nginx --generator=run-pod/v1pod/nginx created
检查Pod IP:
kubectl get pods --output=wideNAME READY STATUS RESTARTS AGE IP NODEnginx 1/1 Running 0 13s 10.200.0.4 worker0
主机文件的内容如下所示:
kubectl exec nginx -- cat etc/hosts# Kubernetes-managed hosts file.127.0.0.1 localhost::1 localhost ip6-localhost ip6-loopbackfe00::0 ip6-localnetfe00::0 ip6-mcastprefixfe00::1 ip6-allnodesfe00::2 ip6-allrouters10.200.0.4 nginx
默认,hosts 文件只包含 ipv4 和 ipv6 的样板内容,像 localhost 和主机名称。
通过 HostAliases 增加额外的条目
除了默认的样板内容,我们可以向 hosts 文件添加额外的条目,将 foo.local、 bar.local 解析为127.0.0.1, 将 foo.remote、 bar.remote 解析为 10.1.2.3,我们可以在 .spec.hostAliases 下为 Pod 添加 HostAliases。
service/networking/hostaliases-pod.yamlapiVersion: v1kind: Podmetadata:name: hostaliases-podspec:restartPolicy: NeverhostAliases:- ip: "127.0.0.1"hostnames:- "foo.local"- "bar.local"- ip: "10.1.2.3"hostnames:- "foo.remote"- "bar.remote"containers:- name: cat-hostsimage: busyboxcommand:- catargs:- "/etc/hosts"
可以使用以下命令启动此Pod:
kubectl apply -f hostaliases-pod.yamlpod/hostaliases-pod created
检查Pod IP 和状态:
kubectl get pod --output=wideNAME READY STATUS RESTARTS AGE IP NODEhostaliases-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-loopbackfe00::0 ip6-localnetfe00::0 ip6-mcastprefixfe00::1 ip6-allnodesfe00::2 ip6-allrouters10.200.0.5 hostaliases-pod# Entries added by HostAliases.127.0.0.1 foo.local bar.local10.1.2.3 foo.remote bar.remote
为什么 Kubelet 管理 hosts文件
kubelet 管理 Pod 中每个容器的 hosts 文件,避免 Docker 在容器已经启动之后去 修改 该文件。
因为该文件是托管性质的文件,无论容器重启或 Pod 重新调度,用户修改该 hosts 文件的任何内容,都会在 Kubelet 重新安装后被覆盖。因此,不建议修改该文件的内容。
文章转载自潍鲸,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




