如何利用雲原生快速實現多地部署

作者張珊,騰訊雲容器前端開發工程師,日常負責騰訊雲邊緣容器 TKE@edge 相關控制檯前端開發,同時也開發前端工程化相關工具。

問題背景

在邊緣計算場景中,往往會出現一個集羣管理多個邊緣站點(包括一個或者多個計算節點)的情況。每個站點都可以爲用戶提供一套完整業務功能。由於受到網絡限制,有業務聯繫的服務之間不希望或者不能跨站點訪問。爲了每個邊緣節點都能提供一套完成功能,一個邊緣站點都會去部署一組有業務邏輯聯繫的服務,如果使用原生 K8s 進行管理, 無法直接控制 Deployment 的 Pod 創建的具體節點位置,需要通過統籌規劃節點的親和性來間接完成;當邊緣站點數量以及需要部署的服務數量過多時,管理和部署都將極爲複雜,乃至僅存在理論上的可能性。

解決方案

騰訊雲邊緣容器服務 (Tencent Kubernetes Engine for Edge,簡稱 TKE@edge)是騰訊雲容器服務推出的用於從中心雲管理邊緣雲資源的容器系統,它開拓性地提出 ServiceGroup 的解決方案。ServiceGroup 可以便捷地在同集羣的不同機房或區域各自部署一組服務,並且使得各個服務間的請求在本機房或本地域內部即可完成,避免服務跨地域訪問。

要理解 ServiceGroup,可能需要先了解以下幾個概念:

  1. NodeUnit: 位於同一個邊緣站點的節點集合,其中節點有相同的某個 label,比如 zone:zone1,能夠把服務之間的調用限制在同一個 NodeUnit 內;
  2. NodeGroup: 包含多個 NodeUnit,每個 NodeUnit 中的節點 label 包含某個相同的 key,可以部署 DeploymentGrid 中聲明的服務;
  3. DeploymentGrid: TKE@edge 自行實現的 CRD (CustomResourceDefinition),指定每個 NodeUnit 中部署的服務組;
  4. ServiceGrid: TKE@edge 自行實現的 CRD,可以限制通過 service-name 訪問只會將請求發向同一個 NodeUnit 的節點。具體關聯見下圖:
    img

可以看到 ServiceGroup 方案的核心點是實現 DeploymentGrid 和 ServiceGrid 兩個 CRD:

  • 首先定義了資源字段,基本字段和 Deployment 和 Service 一致,並額外添加了 gridUniqKey 字段;
  • 其次實現相應的controller:DeploymentGrid controller和 ServiceGrid controller,不斷將創建的 DeploymentGrid 和 ServiceGrid 資源調和到期望的 Deployment 和 Service,並且聯合 ServiceGrid,DeploymentGrid 上的gridUniqKey字段和節點的標籤, 將 Deployment 部署在每個 NodeUnit 內。

那麼如何保證流量限制在節點組的範圍內呢?application-grid-wrapper 組件可以幫助實現。該組件代理 kube-proxy 的請求,同時監聽 apiserver 的 node、service 和 endpoint 資源。根據 pod 信息中所屬 Node 是否與當前節點共屬相同的 NodeUnit 做不同的處理:

  1. 如果 pod 所屬的 Node 與當前節點屬於相同的 NodeUnit,則將該資源信息轉發給下游的 kube-proxy,kube-proxy 會按照原先的流程創建對應的路由表;

  2. 如果 pod 所屬的 Node 與當前節點不屬於相同的 NodeUnit,則 application-grid-wrapper 會攔截該信息,同時不轉發給 kube-proxy;

這樣一來,雖然用戶查看 endpoint 的時候能看到整個集羣內該 service 所含的所有 endpoint,但是實際上節點的 service 的路由表項只含有相同 NodeUnit 內的節點的相關表項;這樣就保證了 NodeUnit 內的服務的互相訪問一定會限制在當前 NodeUnit 範圍內,從而避免跨節點組或者跨機房跨地域訪問的問題。

使用指南

TKE@edge 團隊已經實現 ServiceGroup 功能並且將其產品化,具體操作如下:

假設已在騰訊雲控制檯創建邊緣集羣,並且該集羣下已有節點;如果不清楚如何創建,可以參考 邊緣集羣文檔

步驟1:創建DeploymentGrid

img

步驟2:創建ServiceGrid

img

步驟3:創建NodeUnit

img

通過上述操作,我們就劃分了兩個 NodeUnit,並且每個 NodeUnit 都部署 wordpress 服務;在節點內通過 service-name 訪問也只會將請求發向本組的節點。

小結

本文從問題產生、方案設計和實際演示介紹 ServiceGroup 相關原理, 以及如何使用 ServiceGroup 簡單快捷實現多地部署。

參考文獻

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章