在初次接触OpenShift的时候,必定会被DNS搞得晕头转向,本文将对OpenShift中DNS的原理及配置作详细的解析。
DNS在OpenShift中经历了屡次改变,但原理是相通的,下面对这些改变作一个简单的说明:
3.2版本之前:OpenShift内部的Skydns监听在master 53端口,负责解析k8s service等域名,须要手动配置dnsmasq完成skydns和外部dns的整合,pod内部DNS直接使用node节点的DNS配置。
3.2版本到3.6版本以前:OpenShift内部的Skydns监听在master 8053端口,自动配置dnsmasq实现skydns和外部dns整合,而且node节点所有使用本机的dnsmasq做为pod内部的DNS。
3.7版本以后:在3.6版本的基础上,将skydns的配置增长到了openshift-node的启动文件中。
本文将对OCP 3.7以上版本进行详细说明。node
为了后文便于描述,须要明确OpenShift中涉及到的DNS。
1)Skydns:运行在OpenShift进程内部,主要用于解析Service域名的DNS服务器,只是实现了DNS协议,并不是真实保存DNS A记录。Service域名格式为..svc.cluster.local。Skydns运行在全部Master节点,监听8053端口。
2)其余上游DNS: 不管是用于解析企业内部自定义域名的内网DNS或者是公网DNS,都归于这一类。linux
本文会涉及到linux dnsmasq服务,若是对该服务不了解,建议先自行搜索学习,本文再也不赘述。
OpenShift在安装完成后,master会自动运行skydns的server。每一个Node节点都会使用本身的IP地址做为DNS server,pod中也一样使用容器所在节点的IP做为DNS server。OpenShift在安装的时候依赖于NetworkManager服务完成dnsmasq自动配置,请确保该服务保护启动状态,并保证在网卡配置文件中不要添加 NM_CONTROLLED=no参数。
OpenShift节点与DNS相关的重要文件以下:
1) /etc/resolv.conf
2) /etc/sysconfig/network-scripts/ifcfg-eth0(以eth0为例)
3) /etc/dnsmasq.d/node-dnsmasq.conf
4) /etc/dnsmasq.d/origin-dns.conf
5) /etc/dnsmasq.d/origin-upstream-dns.conf
6) /etc/origin/node/node-config.yaml
7) /etc/origin/node/node-dnsmasq.conf
8) /etc/origin/node/resolv.conf
9) /etc/systemd/system/atomic-openshift-node.service
10) /etc/hosts
下面将以OCP计算节点192.168.182.190分别解析上述文件的做用及来源。服务器
1)/etc/resolv.conf
在Linux操做系统中使用/etc/resolv.conf设置本机使用的DNS server。架构
1 |
# cat /etc/resolv.conf |
该文件由NetworkManager服务自动生成,在重启network或NetworkManager服务的时候都会执行/etc/NetworkManager/dispatcher.d/99-origin-dns.sh从新生成该文件,因此不要手动修改这个文件。能够看到将宿主机的nameserver设置为本机ip地址(该地址为宿主机默认网关的网卡IP地址),也就是宿主机全部DNS解析均经过192.168.182.190的53端口实现。而宿主机的53端口由dnsmasq服务监听。
文件做用:配置宿主机节点的nameserver为本机IP,使得宿主机可使用本机的dnsmasq服务解析。且该文件在生成后会自动复制到/etc/origin/node/resolv.conf,该文件在pod启动时会被添加为pod中的/etc/resolv.conf。由node节点配置文件/etc/origin/node/node-config.yaml中配置,以下图所示:app
2)/etc/dnsmasq.d/*
由resolv.conf配置可知,全部节点使用dnsmasq做DNS server,咱们能够查看dnsmasq的配置文件。
Dnsmasq服务做为轻量级DNS server,能够做为DNS的反向代理。在Openshift中dnsmasq代理以下几类DNS(配置文件在目录/etc/dnsmasq.d/下):
第一类:节点上的/etc/hosts记录,dnsmasq默认行为。
第二类:skydns,解析OCP集群内部的service域名。由/etc/dnsmasq.d/node-dnsmasq.conf文件配置,文件内容以下:负载均衡
1 |
server=/in-addr.arpa/127.0.0.1 |
该文件由/etc/systemd/system/atomic-openshift-node.service维护,当atomic-openshift-node服务启动时由ExecStartPre将/etc/origin/node/node-dnsmasq.conf拷贝到/etc/dnsmasq.d/下,并经过dnsmasq dbus开启cluster.local两个域名的解析。/etc/origin/node/node-dnsmasq.conf在ansible安装OCP时候生成,绝对不要删除。当atomic-openshift-node服务中止时由ExecStopPost删除/etc/dnsmasq.d/node-dnsmasq.conf,并经过dnsmasq dbus关闭cluster.local两个域名的解析。运维
该文件将in-addr.arpa和cluster.local两个域的解析转发到127.0.0.1的53端口。而宿主机的127.0.0.1的53端口由atomic-openshift-node服务监听,由node节点配置文件/etc/origin/node/node-config.yaml中配置,以下图所示:dom
注:node服务监听127.0.0.1:53,dnsmasq监听192.168.182.190:53,并不冲突,若是dnsmasq配置错误,将127.0.0.1的53端口占用,则会致使node服务启动失败。
在节点或者POD内部解析cluster.local和in-addr.arpa两个域的域名,则会经过dnsmasq将解析请求转发到atomic-openshift-node进程,atomic-openshift-node进程与master节点8053端口通讯获取解析结果。注意,此时node与master的8053通讯会直接链接master ip地址,若是是多个master,默认会轮询,不会通过多个master前面的负载均衡,在开启防火墙规则时须要注意。
ide
第三类:其余上游DNS,上游DNS能够添加多个内部DNS server和外部DNS server。
由文件/etc/dnsmasq.d/origin-upstream-dns.conf配置。该文件由NetworkManager服务自动生成,不要手动修改。
在NetworkManager启动时,会获取/etc/sysconfig/network-scripts/ifcfg-eth0中配置的DNS一、DNS2…DNSn,将这些server配置在/etc/dnsmasq.d/origin-upstream-dns.conf中,这样dnsmasq就能够解析任意的上游DNS server。这些DNS server能够是内网DNS server也能够是外部DNS server。以下图:学习
另外,还有一个dnsmasq的配置文件/etc/dnsmasq.d/origin-dns.conf,文件内容以下:
1 2 3 4 5 6 7 8 9 10 |
no-resolv domain-needed no-negcache max-cache-ttl=1 enable-dbus dns-forward-max=5000 cache-size=5000 bind-dynamic except-interface=lo # End of config |
该文件中定义了dnsmasq的一些属性,如开启dbus(node服务须要使用),定义cache行为,设置监听地址排除lo等等。
注意:该文件由ansible安装建立,虽然NetworkManager服务也会自动生成该文件,可是因为一个bug(见《五. 目前存在的问题》一章),二者建立的文件内容并不一致!最好不要随便删除该文件,除非你知道该如何配置。
在了解了运行机制以后,用户能够灵活配置,若是特殊需求,不排除能够修改默认运行机制。下面描述一般的配置方式。
OCP中须要配置的DNS解析包含:
1)master节点须要解析全部的node节点域名
2)node节点须要可以解析master节点域名,多个master节点须要能解析public hostname
3)全部node节点须要解析registry域名
4)其余任意的上游DNS
实现1和2,3三种域名解析能够最简单的方式是配置本地hosts文件,可是若是服务器数量巨大或者考虑后期扩容带来复杂性,最好能有DNS提供节点域名及registry域名的解析。在安装的时候将这个DNS server配置到网卡配置文件中。
第四种域名解析一样经过网卡配置文件配置。
一般状况下,默认的route域名.apps.example.com不须要在集群内部解析,该域名须要配置在访问OCP应用客户端的DNS server中。但也不排除,若是在OCP内部应用经过域名访问应用,则须要在pod中解析.apps.example.com,此时一样将用于解析*.apps.example.com的DNS server配置到网卡配置文件中。
综上所述,在OCP全部的dns设置都是自动完成的。安装时只须要保证节点域名能够解析(简单的可使用hosts实现),其余全部的dns server所有经过网卡配置文件传入到dnsmasq,不要手动修改任何的其余文件。
1) /etc/dnsmasq.d/origin-dns.conf在使用ansible安装OCP的时候建立,内容以下:
1 |
no-resolv |
若是误删除该文件,则重启network,dnsmasq,NetworkManager都会从新生成该文件,可是自动生成文件的内容与上述不一致,致使dnsmasq或node服务启动失败。下面为自动生成的文件内容:
1 |
no-resolv |
自动生成的文件缺乏了最重要的bind-dynamic,except-interface=lo参数,致使dnsmasq启动的话,会监听0.0.0.0:53,致使node服务在启动时候报127.0.0.0:53端口被占用。
解决办法:手动建立文件,并保证文件内容正确。
2) /etc/origin/node/node-dnsmasq.conf在使用ansible安装OCP的时候建立,若是安装完成以后手动删除,没法自动生成,会致使atomic-openshift-node服务启动失败。
解决方法:手动建立/etc/origin/node/node-dnsmasq.conf,保证文件中的内容为
server=/in-addr.arpa/127.0.0.1
server=/cluster.local/127.0.0.1
3) NetworkManager服务必须启动,且网卡配置文件中不能包含NM_CONTROLLED=no参数。
魏新宇
"大魏分享"运营者、红帽资深解决方案架构师
专一开源云计算、容器及自动化运维在金融行业的推广
拥有MBA、ITIL V三、Cobit五、C-STAR、TOGAF9.1(鉴定级)等管理认证。
拥有红帽RHCE/RHCA、VMware VCP-DCV、VCP-DT、VCP-Network、VCP-Cloud、AIX、HPUX等技术认证