Polaris-Sidecar:更低成本的內網 DNS 實現

導語

PolarisMesh 是騰訊開源的百萬級服務發現和治理中心,積累了騰訊從虛擬機到容器時代的分佈式服務治理經驗。作爲分佈式和微服務架構中的核心組件,PolarisMesh 提供服務尋址、流量調度、故障容錯和訪問控制等一系列能力,在 K8s 和虛擬機環境中可以無差別使用,支持主流的開發模式,兼容 grpc、spring cloud 和 servicemesh 等開源生態,幫助用戶快速構建擴展性強、可用性高的業務架構,實現從傳統架構到雲原生架構的轉型。

內網尋址存在的問題

當某個服務下部署了多個應用程序副本時,一個請求如何發送給某一副本上進行處理呢?當應用部署於 kubernetes 時,請求流量先經過 Service,再由 Service 將流量轉發至某一個 Pod 進行處理;而應用部署在 VM 或者物理機時,會額外部署一個用於流量轉發的組件,請求將先經過該組件,再由該組件將流量轉發至某一臺機器進行請求處理。

圖片

上述請求調用的方式,都是將所有的流量通過 LVS 等四層負載均衡組件進行轉發,即某個服務下的所有服務實例都掛載到一個 VIP(Virtual IP)下,所有的請求都先經過此 VIP,再由 VIP 轉發,但是這種方式使用起來會遇到以下幾個明顯的問題:

如果要解決 VIP 所帶來的問題,那麼通用的解決方式,就是去除負載均衡組件到業務進程這一跳的網絡請求鏈路,直接將主調方的請求流量發送至對應業務進程進行處理。這種思路存在兩種解決方案。

  1. 侵入式方案:主動獲取被調方地址。主調方發起請求前先通過 SDK 的形式,發起請求前需調用 SDK 的獲取服務地址的方法,在獲取某服務下業務進程的的 IP 地址信息後向被調方發起請求。該方案需要將服務發現 SDK 與業務框架進行集成。

  2. 無侵入式方案:被動獲取被調方地址。該方案最典型的就是 DNS 協議。主調方僅需要記錄被調方的域名信息,通過 DNS 的形式,獲取域名下的所有服務地址信息,隨機選取一個向被調方發起請求。該方案無需將服務發現 SDK 與業務框架進行集成。

在上文提到的 filebeat 上報 ES、組件 Proxy 統一接入地址、數據庫主備節點統一接入地址等幾個場景中,由於涉及到開源及第三方組件,這些組件無法通過改造的方式集成註冊中心 SDK,因此無法實施侵入式方案,只能通過無侵入式的方案來解決,下面我們看看如何實現無侵入的內網 DNS 方案。

如何實現無侵入的內網 DNS

上述所提到的內網 DNS 方案,主要有集中式分佈式兩種實現方式,北極星對這兩種方式均提供支持。下面向大家分享在前期北極星對於這兩種方案的設計思考。

集中式 DNS

圖片

集中式 DNS 模式,需要北極星服務端實現 DNS 協議,然後需要修改業務進程所在環境的 / etc/resolv.conf 配置,將北極星服務端所在 IP 作爲第一個 nameserver 地址即可,這樣業務進程所有的 DNS 請求都將發往北極星服務端,北極星服務端會根據域名解析出對應的服務以及命名空間,將相關實例地址信息數據進行 DNS 回包。

可見,在時間驅動型場景中,相比執行內容而言,業務更關注的任務是定時執行還是週期執行、執行具體時間點準確性、週期頻率的長短等時間因素。

分佈式 DNS

圖片

分佈式 DNS 模式,則是通過在業務進程所在環境運行 polaris-sidecar 進程,然後需要修改業務進程所在環境的 / etc/resolv.conf 配置,將 127.0.0.1 所在 IP 作爲第一個 nameserver 地址,這樣業務的 DNS 請求將全部由 polaris-sidecar 進程代爲處理,polaris-sidecar 在將自身緩存的服務地址列表進行 DNS 回包。polaris-sidecar 自身的服務地址信息緩存會定時和北極星服務端進行同步,從而拉取服務的最新實例地址列表。

北極星的選擇:分佈式 DNS

這裏再給出一個北極星對於集中式 DNS 與分佈式 DNS,在能力支持上的對比表格:

集中式 DNS:DNS 請求只能攜帶域名名稱信息,提供的數據信息非常有限,北極星在此基礎上只能做到服務發現,無法滿足用戶就近路由、分區路由等服務治理的需求。

分佈式 DNS:由於 polaris-sidecar 與業務進程在同一部署環境下,因此可以將一些靜態信息注入爲環境變量,polaris-sidecar 會將這些環境變量信息作爲服務治理所需要的數據,每次處理 DNS 請求時可以通過這些靜態標籤執行相應的服務治理流程;因此相比集中式 DNS 服務發現,分佈式 DNS 方案可以享受到更多的北極星服務治理能力。

選型依據:北極星服務端插件化的設計,要支持集中式 DNS 的方案十分便捷,僅需要在北極星服務端接入層中添加一個 DNS 協議的接入插件即可。但是北極星定位是一個服務治理中心,因此北極星在支持 DNS 協議的服務發現基礎之上,同時還希望能將治理能力帶入到 DNS 協議中,因此,最終北極星採用分佈式 DNS 方案實現內網 DNS 尋址的能力。

後續規劃

如何使用 Polaris

參考文檔

https://github.com/polarismesh/polaris-sidecar/blob/main/README.md

項目鏈接

爲了方便大家更好的學習北極星(PolarisMesh)開源項目,我們特別推出了《北極星 PolarisMesh 訓練營系列學習課程,幫助大家更好地瞭解和使用北極星,您可以通過以下鏈接瞭解課程信息(視頻課程每週更新 1~2 個),歡迎大家關注、點贊、轉發:

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/QWBfiQbphPFDWkYugDcqPg