k8s-HostAliases-Pod域名解析

k8s上不同服务之间可以通过service的域名来互相访问。域名的解析是一般是通过在集群中的kube-dns来完成有时候,我们希望给运行在k8s上的Pod增加一些域名的解析(例如宿主机的主机名),但操作dns模块也不太方便,那么k8s上有没有想linux主机那样可以直接在host文件设置域名解析呢,容易想到的是,将域名记录到容器镜像的/etc/hosts文件,这样容器运行时就可以正确解析了。然而这样是不行的。k8s会管理这个文件,打到镜像里的文件实际并不会起作用。举个例子。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
[root@master]# cat Dockerfile 
FROM nginx:1.0
RUN echo "8.8.8.8 google.com" >> /etc/hosts
EXPOSE 80
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]
[root@master]# docker run -it testnginx /bin/bash
[root@8153d35a37e9 /]# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix

## 显然在打镜像的时候配置hosts是不满足要求的,不过幸运的是k8s从1.7版本开始支持了 HostAliases 特性

[root@master test]# vim hostalias.yaml
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"

[root@mastertest]# kubectl apply -f hostalias.yaml
Warning: kubectl apply should be used on resource created by either kubectl create –save-config or kubectl apply
pod "hostaliases-pod" configured
[root@master-168-32 test]# 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.244.1.162 hostaliases-pod

# Entries added by HostAliases.

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配置文件中增加的几条记录都出现在 /etc/hosts 文件中了。