DNS網域名稱解析是ACK Serverless叢集內實現服務發現的方式之一。本文主要介紹ACK Serverless叢集中DNS網域名稱解析原理和DNS服務發現方案。
索引
注意事項
如果在建立ACK Serverless叢集時,未開啟任意DNS服務發現組件,容器Pod將預設使用VPC提供的DNS伺服器進行網域名稱解析。該模式下不支援Kubernetes內Service服務名的網域名稱解析。
對於已建立的ACK Serverless叢集,啟用DNS服務發現方案僅對建立的容器Pod生效,即啟用前建立的容器Pod並不會隨著方案的啟用而切換其DNS設定檔,需重新建立容器Pod來使其接入新的DNS服務發現方案。
CoreDNS(託管)組件會逐步替換CoreDNS(非託管),直至CoreDNS(非託管)下線,後續您可能無法在控制台看到CoreDNS(非託管)。如需使用CoreDNS(非託管)組件,請提交工單諮詢。
ACK Serverless叢集中DNS網域名稱解析原理
在ACK Serverless叢集建立容器Pod時,預設情況下,/etc/resolv.conf
檔案的內容如下。該檔案指定了DNS伺服器、搜尋域和一些其他參數。
# nameserver表示本容器Pod使用的DNS伺服器IP地址。
nameserver 172.xx.x.xx
# search表示請求服務時需要拼接的網域名稱尾碼,當Pod處於kube-system命名空間時如下。
search kube-system.svc.cluster.local svc.cluster.local cluster.local
# 其他參數
options ndots:5
關於DNS網域名稱解析設定檔和Pod DNSPolicy的欄位含義,請參見DNS原理和配置說明。
ACK Serverless叢集支援的DNS服務發現方案
DNS服務發現方案 | 說明 |
CoreDNS(託管) | 推薦使用。容器Pod使用CoreDNS(託管)組件進行網域名稱解析,由ACK Serverless來建立並保證CoreDNS的正常運行。您無需關心CoreDNS的運行狀態,免除手動營運。此外,該方案不佔用叢集中的ECI執行個體。 |
CoreDNS(非託管) | 容器Pod使用CoreDNS(非託管)組件進行網域名稱解析,您必須確保正確配置CoreDNS,並時刻關注CoreDNS副本的運行狀態。 |
PrivateZone | 容器Pod使用PrivateZone組件進行網域名稱解析,ACK Serverless會自動建立、更新PrivateZone中的網域名稱解析記錄。 |
CoreDNS(託管)
託管版CoreDNS組件通過kube-system命名空間下的kube-dns服務的叢集IP暴露DNS服務。業務Pod使用託管CoreDNS的流程如下。
鏈路 | 說明 |
① | 用戶端(Client Pod)訪問上遊服務(TargetService)時,會先從本地DNS網域名稱解析設定檔( 在本方案中,DNS伺服器位址為ACK Serverless叢集的kube-system命名空間下建立的名為kube-dns的叢集IP的IP地址。kube-dns的叢集IP的後端由ACK Serverless叢集負責動態維護更新,您無需關注。 |
② | 用戶端(Client Pod)請求叢集外部網域名稱時,託管CoreDNS會將網域名稱請求轉寄至VPC提供的DNS伺服器(100.100.2.136、100.100.2.138)進行解析。 |
③ | 用戶端(Client Pod)通過DNS伺服器擷取到上遊服務(TargetService)的IP地址後,向該IP發出請求。 |
開啟CoreDNS(託管)組件
開啟CoreDNS(託管)組件後,ACK Serverless叢集會自動在kube-system命名空間下建立名為kube-dns的叢集IP服務。請勿手動修改。
CoreDNS(託管)組件逐步開放中,如在控制台無法看到CoreDNS(託管)組件,表明當前地區尚未開放支援CoreDNS(託管)組件。CoreDNS(託管)組件的自訂配置功能逐步開放中,如有使用需求,請提交工單諮詢。
方式一:對於建立的ACK Serverless叢集,您可以在建立叢集時,指定CoreDNS(託管)作為DNS服務發現,啟用託管版CoreDNS組件。
方式二:對於已建立的ACK Serverless叢集,您可以在叢集管理頁面,選擇營運管理 > 組件管理,單擊網路頁簽,然後單擊CoreDNS(託管)組件的安裝,啟用託管版CoreDNS組件。具體操作,請參見管理組件。
CoreDNS(非託管)
CoreDNS(非託管)是Kubernetes叢集中負責DNS解析的組件,能夠支援解析叢集內部自訂服務網域名稱和叢集外部網域名稱。CoreDNS(非託管)具備豐富的外掛程式集,在叢集層面支援自建DNS、自訂Hosts、CNAME、Rewrite等需求。與Kubernetes一樣,CoreDNS專案由CNCF託管,關於CNCF的更多資訊,請參見CNCF。關於CoreDNS的更多資訊,請參見CoreDNS: DNS and Service Discovery。
非託管版CoreDNS組件通過kube-system命名空間下的kube-dns的叢集IP暴露DNS服務,業務Pod使用非託管CoreDNS的流程如下。
鏈路 | 說明 |
① | 用戶端(Client Pod)訪問上遊服務(TargetService)時,會先從本地DNS網域名稱解析設定檔( 在本方案中,DNS伺服器位址為ACK Serverless叢集kube-system命名空間的kube-dns的叢集IP的IP地址。 |
② | 用戶端(Client Pod)請求叢集外部網域名稱時,CoreDNS會將網域名稱請求轉寄至VPC提供的DNS伺服器(100.100.2.136、100.100.2.138)進行解析。 |
③ | 用戶端(Client Pod)通過DNS伺服器擷取到上遊服務(TargetService)的IP地址後,向該IP發出請求。 |
開啟CoreDNS(非託管)組件
方式一:對於建立的ACK Serverless叢集,您可以在建立叢集時,指定CoreDNS作為DNS服務發現,啟用非託管版CoreDNS組件。
方式二:對於已建立的ACK Serverless叢集,您可以在叢集管理頁面,選擇營運管理 > 組件管理,單擊網路頁簽,然後單擊CoreDNS組件的安裝,啟用非託管版CoreDNS組件。具體操作,請參見管理組件。
PrivateZone
PrivateZone是一項基於阿里雲VPC環境提供的私人網域名稱解析服務。通過使用PrivateZone控制器,就可以實現對ACK Serverless叢集內各命名空間的Service和Endpoint資源的即時監控。該控制器與APIServer互動,自動將資源的網域名稱同步到PrivateZone中。ACK Serverless中的容器Pod通過PrivateZone DNS解析服務就可完成Kubernetes的服務發現。關於如何使用PrivateZone方案,請參見ACK Serverless叢集雲端式解析PrivateZone的服務發現。
PrivateZone通過VPC提供的DNS伺服器(100.100.2.136、100.100.2.138)暴露DNS服務,業務Pod使用PrivateZone的流程如下。
鏈路 | 說明 |
① | PrivateZone控制器串連至APIServer,監聽叢集中服務的建立和更新事件。 |
② | PrivateZone控制器監聽到服務的建立和更新事件後,將其同步至PrivateZone產品中權威Zone解析記錄中。 |
③ | 用戶端(Client Pod)訪問上遊服務(TargetService)時,會先從本地DNS網域名稱解析設定檔( 在本方案中,DNS伺服器位址為DNS網域名稱解析設定檔中配置VPC提供的DNS伺服器IP地址(100.100.2.136、100.100.2.138)。DNS伺服器會從PrivateZone擷取正確的解析記錄,返回給用戶端。 |
④ | 用戶端(Client Pod)通過DNS伺服器拿擷取到上遊服務(TargetService)的IP地址後,向該IP發出請求。 |
開啟PrivateZone組件
方式一:對於建立的ACK Serverless叢集,您可以在建立叢集時,指定PrivateZone作為DNS服務發現,啟用PrivateZone組件。
方式二:對於已建立的ACK Serverless叢集,您可以在
eci-profile
配置項中設定enablePrivateZone
參數值為true
,啟用PrivateZone組件。
常見問題
如何確認當前叢集CoreDNS(託管)、CoreDNS(非託管)、PrivateZone組件已成功開啟?
CoreDNS(託管)和CoreDNS(非託管)組件
登入Container Service管理主控台,在叢集管理頁面,選擇營運管理 > 組件管理,單擊網路頁簽,如果組件右上方有已安裝字樣,說明當前叢集的CoreDNS(託管)或CoreDNS(非託管)組件已開啟成功。
以CoreDNS(託管)組件為例,如下圖所示。
PrivateZone組件
登入PrivateZone控制台,通過ACK Serverless的VPC ID搜尋權威Zone,如果能夠搜到名稱以叢集ID結尾的Zone,則說明PrivateZone已開啟成功。
如何確認業務Pod正在使用CoreDNS(託管)、CoreDNS(非託管)、PrivateZone組件?
CoreDNS(託管)和CoreDNS(非託管)組件
通過執行命令
kubectl exec
進入容器Pod中,執行命令cat /etc/resolv.conf
,如果nameserver
欄位被指向到kube-system命名空間下的kube-dns服務的叢集IP地址,說明該Pod正在使用CoreDNS(託管)或CoreDNS(非託管)組件。PrivateZone組件
通過執行命令
kubectl exec
進入容器Pod中,執行命令cat /etc/resolv.conf
,如果nameserver
欄位被指向到100.100.2.136
和100.100.2.138
(此處IP為本文樣本IP,具體指向的IP地址以實際為準),說明Pod正在使用PrivateZone組件。