在初次接觸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等技術認證