1. 程式人生 > 其它 >打破內網壁壘,從雲端一次新增成百上千的邊緣節點

打破內網壁壘,從雲端一次新增成百上千的邊緣節點

作者

李騰飛,騰訊容器技術研發工程師,騰訊雲TKE後臺研發,SuperEdge核心開發成員。

王冬,騰訊雲TKE後臺研發工程師,專注容器雲原生領域,SuperEdge 核心開發人員,現負責騰訊雲邊緣容器TKE Edge私有化相關工作。

背景

在邊緣計算的場景中,邊緣節點分佈在不同的區域,而且大多數邊緣節點是藏在NAT網路背後的,且邊緣節點和雲端之間是單向網路(邊緣節點可以訪問雲端,雲端無法直接訪問邊緣節點)。這種場景下如何批量的將眾多的邊緣節點新增到一個邊緣叢集是一個問題?如果有一種機制,讓使用者可以從雲端批量新增和重灌位於邊緣的節點,是一件解放生產能力的大事。針對這一需求,SuperEdge

專案研發了 Penetrator 元件,實現了從雲端批量的新增和重灌節點的能力。

需求分析

總體來說,具體的需求可以細分為兩種:

雲端控制面能直接 ssh 到邊緣節點

該場景下,雲端管控平面和邊緣節點有可能執行在同一內網內,也有可能公網可通,無論是哪種形式,總之在雲端控制平面能直接 ssh 到邊緣節點。這種場景使用最樸素的方式即可,即直接手動或者通過工具 ssh 到邊緣節點完成節點新增,無需使用複雜的方式。

雲端控制面不能 ssh 到邊緣節點

該場景下,雲端管控平面和邊緣節點不在同一內網,有可能是單向網路,如:邊緣節點位於 NAT 網路。這種情況下,邊緣節點可以訪問管控平面,但是無法從管控平面直接 SSH 到邊緣節點。這種場景是本文重點處理的重點,針對這種場景設計出了一種簡化邊緣節點新增的元件 Penetrator。

Penetrator的架構設計

雲端管控平面無法直接連線邊緣節點,現有的解決方案是搭建跳板機訪問內網節點,邊緣節點可能處於不同的內網中,在每個內網環境都搭建跳板,會帶來額外的機器資源的開銷和運維人員的工作量。在雲端管控平面可以連線使用者叢集的 apiserver 的情況下,可以在管控平面向用戶叢集的 apiserver 下發一個新增節點的 job,job被排程到叢集內的一個節點執行,具體實現如下圖所示:

在雲端管控平面執行k8s,管理使用者的k8s叢集,因此可以在雲端的管控平面執行 Operator 來實現。

Penetrator 通過叢集內節點新增節點

使用者通過 kubectl 向 apiserver 傳送請求,建立一個 nodes-task-crd

CRD,Penetrator 監聽到 task 任務建立之後,Penetrator 就會建立一個job任務,同時會生成 job 執行所需的 configmap 配置檔案,這個 job 任務會被排程到指定的node-1節點上執行新增節點的操作。建立的 job 和 configmap 的 ownerReference 指向 nodes-task-crd CRD,在 CRD 刪除之後 Kubernetes 的 GC 會自動刪除生成的 job 和 configmap。

Penetrator 會週期請求使用者叢集的 apiserver,查詢 job 的執行狀態,如果 job 不存在,則會去請使用者叢集的apiserver,獲取節點的安裝狀態,在節點沒有全部安裝完成,會根據未完成安裝的節點資訊重新下發 job 執行所需的 configmap 配置檔案 add-node-cm,同時也會重新下發 job。為避免多個任務在同一個目標機器上執行新增節點的命令,對於一個新增節點的 task,有且只有一個 job,同時還要保對於一個使用者的 k8s 叢集,只能建立一個task 任務。

Penetrator雲端直連新增節點

與通過叢集內的節點新增節點不同,新增節點的job是執行在管控平面的k8s叢集,具體設計如下圖所示:

如圖所示,使用者通過 kubectl 向 apiserver 傳送請求,建立一個 nodes-task-crd crd,Penetrator 監聽到 task 任務建立之後,會建立 job 執行所需的 configmap 配置檔案 add-node-cm 和登入目標機器節點的 ssh 的密碼(passwd) 或私鑰 (sshkey) 的secret,同時會建立一個 add-node-job job。add-node-job 執行在管控平面的 k8s 叢集內,ssh 登入內網的節點,執行安裝節點的命令。

Penetrators 實現的功能

批量安裝邊緣節點

NodeTask 的 spec.要新增的節點的 ip 列表,Penetrator 會根據節點名字首生成節點名,將節點名和資訊儲存到configmap 中,下發job時掛載該 configmap 做為 job 的啟動配置檔案。

批量重灌邊緣節點

每次建立的 NodeTask 都會有唯一標籤,NodeTask 在安裝完節點之後會給節點打上該標籤,同時 NodeTask 使用 label 判斷節點是否安裝完成,重灌時節點的標籤和 NodeTask 標籤不一致,就會對節點執行重灌操作。

Penetrator 的在 SuperEdge 的具體使用

功能演示的視訊連結

用 edgeadm 搭建 SuperEdge Kubernetes 邊緣叢集

如何搭建:用edgeadm一鍵安裝邊緣獨立Kubernetes 叢集

部署 Penetrator

在 SuperEdge Kubernetes 邊緣叢集 Master 節點執行如下命令:

kubectl apply -f https://raw.githubusercontent.com/superedge/superedge/main/deployment/penetrator.yaml

具體使用見:使用 penetrator 新增邊緣節點

建立邊緣節點金鑰的 secret

Penetrator 元件是基於 Kubernetes 的 CRD 實現的,要用 Penetrator 進行邊緣節點的批量安裝,需要提供邊緣節點的登入方式,可以通過下面的方式提供:

  • 使用 SSH 的密碼檔案 passwd 建立 sshCredential

    kubectl -n edge-system create secret generic login-secret --from-file=passwd=./passwd
    
  • 或者,使用 SSH 的私鑰檔案 sshkey 建立 sshCredential

    kubectl -n edge-system create secret generic login-secret --from-file=sshkey=./sshkey
    

    其中./passwd 和./sshkey 檔案中分別儲存的是目標節點 root 使用者的登入口令和私鑰(明文)

用 Penetrator 批量新增或批量重灌邊緣節點

下面分別給出批量新增邊緣節點和批量重灌節點的 yaml:

批量新增邊緣節點的例子

apiVersion: nodetask.apps.superedge.io/v1beta1
kind: NodeTask
metadata:
name: nodes
spec:
nodeNamePrefix: "edge"        #節點名字首,節點名的格式: nodeNamePrefix-隨機字串(6位)
targetMachines:                    #待安裝的節點的ip列表
  - 172.21.3.194
  - 172.21.3.195
sshCredential: login-secret     #儲存目標節點root使用者的登入口令(passwd)或者私鑰(sshkey)的Secret
proxyNode: vm-2-117-centos  #叢集內某個節點的節點名,該節點起到跳板機的作用,要求必須可以使用targetMachines中的ip地址ssh到待安裝的節點

效果:

kubectl get nodes –show-labels | grep edge | wc -l
50

批量重灌邊緣節點的例子

apiVersion: nodetask.apps.superedge.io/v1beta1
kind: NodeTask
metadata:
name: nodes
spec:
nodeNamesOverride:            #重灌節點的節點名和IP
  edge-1mokvl: 172.21.3.194 #此處支援更改節點nodename,如:172.21.3.194節點之前的nodename為a,本次重灌更改成edge-1mokvl
sshCredential: login-secret
proxyNode: vm-2-117-centos

效果:
重灌 edge-uvzzijv4 節點之前

kubectl get nodes -o wide –show-labels
NAME               STATUS   LABELS
edge-uvzzijv4    Ready   app.superedge.io/node-label=nodes-lokbfd
...

重灌 edge-uvzzijv4 節點之後

kubectl get nodes -o wide –show-labels
NAME               STATUS    LABELS
edge-uvzzijv4   Ready      app.superedge.io/node-label=nodes-pfu8en

批量任務狀態檢視

在執行完批量操作後,可查詢 task 的具體狀態。

NodeTask 的 Status 中包含任務的執行狀態 (creating和ready) 和未安裝完成節點的節點名和IP,可以使用下面命令檢視:

kubectl get nt NodeTaskName -o custom-columns='STATUS:status.nodetaskStatus'

任務在執行過程的成功和錯誤資訊以事件的形式上報的apiserver,可以使用下面命令檢視:

kubectl -n edge-system get event

小結

針對雲端管控平面和邊緣節點不同的網路情況,選擇不同的批量新增節點的形式,實現在雲端管控平面批量新增節點。同時,新增 kubernetes 叢集節點時需要安裝檔案,通過內網分發,縮短節點安裝的時間,提高了節點安裝的效率。

未來展望

未來我們會支援使用 Penetrator 在多叢集納管的場景下支援新增叢集的節點。

合作和開源

Penetrator 元件已經在 SuperEdge release 0.4.0 開源,歡迎大家體驗。我們也會成持續提升 Penetrator 的能力,簡化邊緣叢集場景下節點的操作,也歡迎對邊緣計算感興趣的公司、組織及個人一起共建 SuperEdge 邊緣容器專案。

>【騰訊雲原生】雲說新品、雲研新術、雲遊新活、雲賞資訊,掃碼關注同名公眾號,及時獲取更多幹貨!! ![](https://img2020.cnblogs.com/other/2041406/202106/2041406-20210630175151708-1873132268.png)