2.4.1节介绍了Pod中的DNS配置,本节将介绍OpenShift Node节点上的DNS配置,包括resolv.conf文件的配置和dnsmasq的配置两个部分。
1.Pod所在宿主机中的resolv.conf文件
上一节的示例中,Pod mywebapp-2-5wj2t所在宿主机中的/etc/resolv.conf文件内容如下。
# nameserver updated by /etc/NetworkManager/dispatcher.d/99-origin-dns.sh # Generated by NetworkManager search cluster.local nameserver 10.70.209.64
在使用Ansible部署OpenShift容器云环境时,Ansible会在每个节点上部署/etc/NetworkManager/dispatcher.d/99-origin-dns.sh文件。每当节点上的NetworkManager服务启动时,该文件就会被运行。它的主要任务包括以下几点。
·修改/etc/resolv.conf,设置搜索域。
·修改/etc/resolv.conf,将宿主机的默认路由网卡IP作为nameserver。本例中,Pod mywebapp-2-5wj2t所在宿主机的IP地址正是10.70.209.64。
·创建dnsmasq配置文件origin-dns.conf和origin-upstream-dns.conf。
·启动dnsmasq服务,并设置宿主机的默认路由网卡的IP为dnsmasq的监听IP。
·创建/etc/origin/node/resolv.conf。
因此,宿主机上的DNS请求也会转到本机上的53端口。
每当NetworkManager服务重启或宿主机重启时,宿主机的/etc/resolv.conf文件内容都会被覆盖,因此,请不要手动修改此文件。
2.Dnsmasq及其配置
从下面netstat -lntp | grep 53命令的输出中可以看出,有一个Dnsmasq进程(进程ID为90456)在Pod网段的网关(10.129.0.1)、Service网段的网关(172.17.0.1)、宿主机IP地址(10.70.209.64)这些IP的53端口上做TCP和UDP监听。
[root@node1 ~]# netstat -tulntp | grep 53 tcp 0 0 10.70.209.64:53 0.0.0.0:* LISTEN 90456/dnsmasq tcp 0 0 172.17.0.1:53 0.0.0.0:* LISTEN 90456/dnsmasq tcp 0 0 10.129.0.1:53 0.0.0.0:* LISTEN 90456/dnsmasq tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 11243/openshift udp 0 0 10.70.209.64:53 0.0.0.0:* 90456/dnsmasq udp 0 0 172.17.0.1:53 0.0.0.0:* 90456/dnsmasq udp 0 0 10.129.0.1:53 0.0.0.0:* 90456/dnsmasq udp 0 0 127.0.0.1:53 0.0.0.0:* 11243/openshift
而在127.0.0.1:53上做TCP和UDP监听的PID为11243的进程如下。
[root@node1 ~]# ps -ef | grep 11243 root 11243 11194 0 Oct01 ? 00:45:25 openshift start \ network --confi g=/etc/origin/node/node-confi g.yaml \ --kubeconfi g=/tmp/kubeconfi g --loglevel=2
OpenShift进程内封装了SkyDNS,它是一个开源的构建在etcd之上的分布式服务宣告(announcement)和发现(discovery)服务。利用它可通过DNS查询来发现可用的服务。关于SkyDNS的更多信息,请访问其开源社区
。开源社区版本的SkyDNS将记录保存在etcd中,在做查询时从etcd中获取数据并封装成DNS结果格式给客户端。在Node节点上运行的OpenShift进程利用了SkyDNS Server库,但它并没有采用默认的etcd后端,而是基于OpenShift API服务实现了新的后端,具体请查阅其代码
。SkyDNS调用OpenShift API服务来获取主机名、IP地址等信息,然后封装成标准DNS记录并返回给查询客户端。
Dnsmasq服务的配置目录为/etc/dnsmasq.d。origin-upstream-dns.conf文件中定义了上游DNS名字服务器。
server=10.72.8.10 server=10.2.1.175
这些上游服务器的地址是从DHCP服务器或所在主机的网卡配置文件中获取的。从下面Dnsmasq的启动日志中可看出,Dnsmasq将in-addr.arpa和cluster.local这两个域内的DNS请求都转到了127.0.0.1:53的SkyDNS上,而对其他请求则直接转到了上游DNS域名服务器上。因此,OpenShift中的Dnsmasq扮演的角色更多的是DNS查询的转发器和DNS信息的缓存器。
Oct 7 19:49:56 dnsmasq[90456]: using nameserver 10.2.1.175#53 Oct 7 19:49:56 dnsmasq[90456]: using nameserver 10.72.8.10#53 Oct 7 19:49:56 dnsmasq[90456]: using nameserver 127.0.0.1#53 for domain in- \ addr.arpa Oct 7 19:49:56 dnsmasq[90456]: using nameserver 127.0.0.1#53 for domain cluster. \ local
in-addr.arpa是DNS标准中的一个特殊域,称为逆向解析域,其目的是完成从IP地址到域名的逆向解析。假设待进行逆向解析的IP地址为218.30.103.170,其逆向解析域名则为170.103.30.218.in-addr.arpa。而30.172.in-addr.arpa则表示172.30.0.0/16网段的逆向解析域。