1. 程式人生 > 實用技巧 >深度解讀 OpenYurt:從邊緣自治看 YurtHub 的擴充套件能力

深度解讀 OpenYurt:從邊緣自治看 YurtHub 的擴充套件能力

作者 | 新勝 阿里雲技術專家

導讀:OpenYurt 開源兩週以來,以非侵入式的架構設計融合雲原生和邊緣計算兩大領域,引起了不少行業內同學的關注。阿里雲推出開源專案 OpenYurt,一方面是把阿里雲在雲原生邊緣計算領域的經驗回饋給開源社群,另一方面也希望加速雲端計算向邊緣延伸的程序,並和社群共同探討未來雲原生邊緣計算架構的統一標準。為了更好地向社群和使用者介紹 OpenYurt,我們特地推出【深度解讀OpenYurt】系列文章,本文為系列文章的第三篇,一一介紹了 OpenYurt 中元件YurtHub的擴充套件能力。

系列文章推薦:

OpenYurt 介紹

阿里雲邊緣容器服務上線 1 年後,正式開源了雲原生邊緣計算解決方案OpenYurt,跟其他開源的容器化邊緣計算方案的區別在於:OpenYurt 秉持 Extending your native Kubernetes to edge 的理念,對 Kubernetes 系統零修改,並提供一鍵式轉換原生 Kubernetes 為 openyurt,讓原生 K8s 叢集具備邊緣叢集能力。

同時隨著 OpenYurt 的持續演進,也一定會繼續保持如下發展理念:

  • 非侵入式增強 K8s
  • 保持和雲原生社群主流技術同步演進

YurtHub 架構說明

在上篇文章中,我們介紹了OpenYurt 的邊緣自治能力,重點解讀了其中的元件 YurtHub。其架構圖如下:

同時在介紹 YurtHub 的優勢中我們提到與 Kubernetes 設計理念契合,YurtHub 非常容易擴展出更多的能力。具體在 YurtHub 擴展出了什麼能力呢?接下來我們將一一展開介紹。

YurtHub 的擴充套件能力

1. 邊緣網路自治

首先介紹一下何謂邊緣網路自治:即在邊緣和雲端網路斷連時,不管時業務容器重啟,或是邊緣節點重啟等,邊緣業務的跨節點通訊可以持續工作或是自動恢復。

在 OpenYurt 中,實現邊緣網路自治需要解決如下的問題(以 flannel vxlan overlay 網路為例):

  • 問題 1: 節點上的網路配置可以自治,kube-proxy 的 iptables/ipvs 規則,flannel 的 fdb/arp/route 配置,coredns 的域名解析等網路配置,在節點重啟後可以自動恢復,否則邊緣跨節點通訊將無法持續;
  • 問題 2: 業務容器 IP 保持不變,因為和雲端網路斷連狀態下容器 IP 變化將無法通知到其他節點;
  • 問題 3: vtep(vxlan tunnel endpoint) 的 mac 地址保持不變,原因和容器 IP 保持不變類似。

從問題 1 可以看出,必須解決 kube-proxy/flannel/coredns 等元件的自治,才能實現網路配置的自治。如果之前邊緣自治是採用重構 kubelet 來實現的話,要實現邊緣網路自治就會碰到很大的麻煩,如果強行把重構的 kubelet 自治能力移植到各個網路元件 (kube-proxy/flannel/coredns),也對整個架構將是噩夢。

在 OpenYurt 中因為 YurtHub 的獨立性,kube-proxy/flannel/coredns 等網路元件輕鬆使用 YurtHub 來實現網路配置的自治能力。因為 YurtHub 快取了 service 等網路配置資源在 local storage,即使斷網並且節點重啟,網路元件仍然可以獲得斷網前的 object 狀態以及相應的配置資訊。如下圖所示:

問題 2,3 和 Kubernetes core 無關,主要涉及到 cni 外掛和 flanneld 的增強,後續文章中再詳細介紹。

2. 多雲端地址支援

公有云上的 Kubernetes 高可用部署時,多例項 kube-apiserver 前面一般都掛了一個 SLB,但是在專有云場景下或者邊緣計算場景下,節點需要通過多個雲端地址來訪問。比如:

  • 專有云場景:因為沒有 SLB 服務,使用者需要需要在雲端通過 VIP 方式來自行實現 kube-apiserver 的負載均衡,或者像 kubespray 那樣在每個節點上部署一個 nginx 來實現多雲端地址的訪問;
  • 邊緣計算場景: 考慮到邊緣和雲端之間網路的穩定性和安全性要求,某些場景下使用者也通過專線和公網兩種方式和雲端通訊,比如優先採用專線,當專線故障時能自動切換到公網通訊。

YurtHub 正式考慮到了上述的需求,支援多雲端地址訪問。雲端地址的負載均衡模式可以選擇:

  • rr(round-robin): 輪轉模式,預設選擇該模式;
  • priority: 優先順序模式,高優先順序地址故障後才使用低優先順序地址。

具體可以參照 YurtHub 的 LB 模組,如下圖所示:

3. 節點維度的雲端流控

對於一個分散式系統來說,流控都是一個無法迴避的問題。原生 Kubernetes 從叢集視角在 kube-apiserver 中以及從訪問者視角在 client-go 庫中封裝了流量管控,在邊緣計算場景下,client-go 的流量管控既分散又對業務有一定侵入,顯然不能很好的解決流控問題。

YurtHub 在邊緣可以接管不論是系統元件還是業務容器對雲端訪問的流量,可以很好的解決節點維度的雲端流控問題。目前 YurtHub 的流控配置是:單節點上對雲端的併發請求數超過 250 個時,將拒絕新的請求。

4. 節點證書輪換管理

Kubernetes 已經支援節點證書自動輪換,即當節點證書快過期前,kubelet 會自動向雲端申請新的節點證書。但是在邊緣計算場景下,很有可能因為邊緣和雲端網路的斷連,造成 kubelet 將無法完成證書的輪換。證書過期後即使和雲端網路連線恢復,節點證書也可能無法自動輪換,並造成 kubelet 的頻繁重啟。

YurtHub 在接管節點和雲端通訊流量時,同時也可以接管節點的證書管理。這樣既解決了各類安裝工具對節點證書的管理的不一致,也解決了證書過期後網路再恢復時的證書輪換問題。另外目前 YurtHub 還是 kubelet 共享節點證書,YurtHub 的獨立節點證書管理功能將在近期開源。

5. 其他

YurtHub 除了前面介紹的擴充套件能力,還有很多有價值的能力,在此也簡單介紹:

  • 節點多租隔離管理:在具備多租隔離能力的 Kubernetes 叢集中,假定節點歸屬於某個租戶,那麼 YurtHub 將可以確保節點上所有云端請求都只返回節點所屬租戶的資源。比如說 list service 將只返回該租戶的 service。而這種多租隔離能力不需要其他元件做任何修改。當然如果要實現叢集內的多租隔離,需要配合相應的多組 CRD 等,詳細可以參照專案kubernetes-sigs/multi-tenancy
  • 叢集間節點遷移:某些場景下,邊緣節點需要從叢集 A 遷移到叢集 B,常規操作是先從叢集 A 下線,然後再次接入叢集 B,最後在叢集 B 部署節點上的應用。因為 YurtHub 對節點流量以及節點證書的接管,可以直接對 YurtHub 注入叢集B的資訊,讓節點無損遷移到叢集 B;
  • 通過域名訪問雲端 kube-apiserver 等等一些其他功能。

總結

  • 通過上述的擴充套件能力可以看出,YurtHub 不僅僅是邊緣節點上的帶有資料快取能力的反向代理。而是對 Kubernetes 節點應用生命週期管理加了一層新的封裝,提供邊緣計算所需要的核心管控能力;
  • YurtHub 不僅僅適用於邊緣計算場景,其實可以作為節點側的一個常備元件,適用於使用 Kubernetes 的任意場景。相信這也會驅動 YurtHub 向更高效能,更高穩定性發展。