使用 HostAliases 向 Pod /etc/hosts 添加条目
将条目添加到 Pod 的 /etc/hosts 文件中,可以在 DNS 和其他选项不可用时,为 Pod 提供主机名解析的覆盖。您可以使用 PodSpec 中的 HostAliases 字段添加这些自定义条目。
Kubernetes 项目建议使用 hostAliases 字段(Pod 的 .spec 的一部分)修改 DNS 配置,而不是使用 init 容器或其他方式直接编辑 /etc/hosts。以其他方式进行的更改可能会在 Pod 创建或重新启动期间被 kubelet 覆盖。
默认 hosts 文件内容
启动一个分配了 Pod IP 的 Nginx Pod
kubectl run nginx --image nginx
pod/nginx created
检查 Pod 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 文件仅包含 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
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"
您可以通过运行以下命令启动具有该配置的 Pod
kubectl apply -f https://k8s.io/examples/service/networking/hostaliases-pod.yaml
pod/hostaliases-pod created
检查 Pod 的详细信息以查看其 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 管理 Pod 的每个容器的 hosts 文件,以防止容器运行时在容器启动后修改该文件。历史上,Kubernetes 始终使用 Docker Engine 作为其容器运行时,而 Docker Engine 会在每个容器启动后修改 /etc/hosts 文件。
当前的 Kubernetes 可以使用各种容器运行时;即便如此,kubelet 仍然管理每个容器中的 hosts 文件,以确保无论您使用哪个容器运行时,结果都如预期。
注意
避免手动更改容器内的 hosts 文件。
如果您手动更改 hosts 文件,则这些更改在容器退出时会丢失。