k8s的不同微服务之间可以通过service-name域名来相互访问,通过集群中的coreDNS来完成service-name域名解析。当我们想在Pod上增加一些域名解析时(例如宿主机的主机名),操作DNS模块也不太方便。那么k8s上有没有像linux主机那样,可以直接在/etc/hosts文件中设置域名解析呢?
1. 在容器镜像中添加/etc/hosts解析(不行)
很容易想到的是,我们把域名记录到容器镜像的/etc/hosts文件,这样容器运行时就可以正确解析了。然而这样是不行的,docker会管理/etc/hosts文件,打到镜像里的域名解析实际并不会起作用。
FROM nginx:latest
RUN echo "8.8.8.8 google.com" >> /etc/hosts
EXPOSE 80
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]
# docker run -it nginx /bin/bash
Container# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.5 8153d35a37e
显然在打镜像的时候配置/etc/hosts是不满足要求的。
2. 在Pod控制器yaml中添加hostAliases解析(行)
我们可以在Pod控制器yaml中通过.spec.hostAliases字段添加主机别名,这个功能是在1.7.x以及以上版本提供的。
apiVersion: v1
kind: Pod
metadata:
name: hostaliases-pod
spec:
restartPolicy: Never
hostAliases:
– ip: "10.1.2.2"
hostnames:
– "mc.local"
– "rabbitmq.local"
– ip: "10.1.2.3"
hostnames:
– "redis.local"
– "mq.local"
containers:
– name: cathosts
image: busybox
command:
– cat
args:
– "/etc/hosts"
# kubectl apply -f hostalias.yaml
# kubectl exec hostaliases-pod -- 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
127.0.0.1 foo.local
127.0.0.1 bar.local
10.1.2.2 mc.local
10.1.2.2 rabbitmq.local
10.1.2.3 redis.local
10.1.2.3. mq.local
在yaml配置文件中,增加的几条记录都出现在Pod容器的/etc/hosts文件中了。
3. 参考文章
https://www.centosdoc.com/docker/163.html
本文转自 https://blog.csdn.net/yjk13703623757/article/details/108071067,如有侵权,请联系删除。