全部產品
Search
文件中心

Container Service for Kubernetes:服務發現DNS

更新時間:Jun 19, 2024

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的流程如下。

image.png

鏈路

說明

用戶端(Client Pod)訪問上遊服務(TargetService)時,會先從本地DNS網域名稱解析設定檔(/etc/resolv.conf)中擷取DNS伺服器位址,再向DNS伺服器位址發出網域名稱解析請求,查詢TargetService對應的目標IP地址。

在本方案中,DNS伺服器位址為ACK Serverless叢集kube-system命名空間下建立的名為kube-dns叢集IP的IP地址。kube-dns的叢集IP的後端由ACK Serverless叢集負責動態維護更新,您無需關注。

image.png

用戶端(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組件。

    image.png

  • 方式二:對於已建立的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的流程如下。

image.png

鏈路

說明

用戶端(Client Pod)訪問上遊服務(TargetService)時,會先從本地DNS網域名稱解析設定檔(/etc/resolv.conf)中擷取DNS伺服器位址,再向該DNS伺服器位址發出網域名稱解析請求,查詢TargetService對應的目標IP地址。

在本方案中,DNS伺服器位址為ACK Serverless叢集kube-system命名空間的kube-dns叢集IP的IP地址。

image.png

用戶端(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組件。

    image.png

  • 方式二:對於已建立的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的流程如下。

image.png

鏈路

說明

PrivateZone控制器串連至APIServer,監聽叢集中服務的建立和更新事件。

PrivateZone控制器監聽到服務的建立和更新事件後,將其同步至PrivateZone產品中權威Zone解析記錄中。

用戶端(Client Pod)訪問上遊服務(TargetService)時,會先從本地DNS網域名稱解析設定檔(/etc/resolv.conf)中擷取DNS伺服器位址,再向該DNS伺服器位址發出網域名稱解析請求,查詢TargetService對應的目標IP地址。

在本方案中,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組件。

    image.png

  • 方式二:對於已建立的ACK Serverless叢集,您可以在eci-profile配置項中設定enablePrivateZone參數值為true,啟用PrivateZone組件。

常見問題

如何確認當前叢集CoreDNS(託管)、CoreDNS(非託管)、PrivateZone組件已成功開啟?

  • CoreDNS(託管)和CoreDNS(非託管)組件

    登入Container Service管理主控台,在叢集管理頁面,選擇營運管理 > 組件管理,單擊網路頁簽,如果組件右上方有已安裝字樣,說明當前叢集的CoreDNS(託管)或CoreDNS(非託管)組件已開啟成功。

    以CoreDNS(託管)組件為例,如下圖所示。

    image.png

  • 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.136100.100.2.138(此處IP為本文樣本IP,具體指向的IP地址以實際為準),說明Pod正在使用PrivateZone組件。

相關文檔