kubernets使用HostAliases添加记录到Pod /etc/hosts
当DNS和其他选项不适用时,将条目添加到Pod的/ etc / hosts文件中可以在Pod级别覆盖主机名解析。在1.7中,用户可以使用PodSpec中的HostAliases字段添加这些自定义条目。
不建议不使用HostAliases进行修改,因为该文件由Kubelet管理,并且可以在Pod创建/重新启动期间被覆盖。
默认主机文件内容
让我们开始为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通过下加入到HOSTALIASES波德,我们可以 .spec.hostAliases:
service/networking/hostaliases-pod.yaml
apiVersion: v1kind: Podmetadata: name: hostaliases-podspec: 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 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管理主机文件?
Kubelet 管理该 hosts吊舱的每个容器,以防止码头工人从文件 修改该文件的容器已经启动之后。
由于文件的托管性质,因此hosts在容器重新启动或重新安排Pod的情况下,只要Kubelet重新安装文件,任何用户编写的内容都将被覆盖。因此,不建议修改文件的内容。