李騰飛,騰訊容器技術研發工程師,騰訊雲TKE後臺研發,SuperEdge核心開發成員。node
王冬,騰訊雲TKE後臺研發工程師,專一容器雲原生領域,SuperEdge 核心開發人員,現負責騰訊雲邊緣容器TKE Edge私有化相關工做。git
在邊緣計算的場景中,邊緣節點分佈在不一樣的區域,並且大多數邊緣節點是藏在NAT網絡背後的,且邊緣節點和雲端之間是單向網絡(邊緣節點能夠訪問雲端,雲端沒法直接訪問邊緣節點)。這種場景下如何批量的將衆多的邊緣節點添加到一個邊緣集羣是一個問題?若是有一種機制,讓用戶能夠從雲端批量添加和重裝位於邊緣的節點,是一件解放生產能力的大事。針對這一需求,SuperEdge 項目研發了 Penetrator 組件,實現了從雲端批量的添加和重裝節點的能力。github
整體來講,具體的需求能夠細分爲兩種:centos
該場景下,雲端管控平面和邊緣節點有可能運行在同一內網內,也有可能公網可通,不管是哪一種形式,總之在雲端控制平面能直接 ssh 到邊緣節點。這種場景使用最樸素的方式便可,即直接手動或者經過工具 ssh 到邊緣節點完成節點添加,無需使用複雜的方式。api
該場景下,雲端管控平面和邊緣節點不在同一內網,有多是單向網絡,如:邊緣節點位於 NAT 網絡。這種狀況下,邊緣節點能夠訪問管控平面,可是沒法從管控平面直接 SSH 到邊緣節點。這種場景是本文重點處理的重點,針對這種場景設計出了一種簡化邊緣節點添加的組件 Penetrator。markdown
雲端管控平面沒法直接鏈接邊緣節點,現有的解決方案是搭建跳板機訪問內網節點,邊緣節點可能處於不一樣的內網中,在每一個內網環境都搭建跳板,會帶來額外的機器資源的開銷和運維人員的工做量。在雲端管控平面能夠鏈接用戶集羣的 apiserver 的狀況下,能夠在管控平面向用戶集羣的 apiserver 下發一個添加節點的 job,job被調度到集羣內的一個節點執行,具體實現以下圖所示:網絡
在雲端管控平面運行k8s,管理用戶的k8s集羣,所以能夠在雲端的管控平面運行 Operator 來實現。架構
用戶經過 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。app
Penetrator 會週期請求用戶集羣的 apiserver,查詢 job 的運行狀態,若是 job 不存在,則會去請用戶集羣的apiserver,獲取節點的安裝狀態,在節點沒有所有安裝完成,會根據未完成安裝的節點信息從新下發 job 運行所需的 configmap 配置文件 add-node-cm,同時也會從新下發 job。爲避免多個任務在同一個目標機器上執行添加節點的命令,對於一個添加節點的 task,有且只有一個 job,同時還要保對於一個用戶的 k8s 集羣,只能建立一個task 任務。運維
與經過集羣內的節點添加節點不一樣,添加節點的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 登陸內網的節點,執行安裝節點的命令。
NodeTask 的 spec.要添加的節點的 ip 列表,Penetrator 會根據節點名前綴生成節點名,將節點名和信息保存到configmap 中,下發job時掛載該 configmap 作爲 job 的啓動配置文件。
每次建立的 NodeTask 都會有惟一標籤,NodeTask 在安裝完節點以後會給節點打上該標籤,同時 NodeTask 使用 label 判斷節點是否安裝完成,重裝時節點的標籤和 NodeTask 標籤不一致,就會對節點執行重裝操做。
如何搭建:用edgeadm一鍵安裝邊緣獨立Kubernetes 集羣
在 SuperEdge Kubernetes 邊緣集羣 Master 節點執行以下命令:
kubectl apply -f https://raw.githubusercontent.com/superedge/superedge/main/deployment/penetrator.yaml
複製代碼
具體使用見:使用 penetrator 添加邊緣節點
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 用戶的登陸口令和私鑰(明文)
下面分別給出批量添加邊緣節點和批量重裝節點的 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 邊緣容器項目。