雲栖号資訊:【 點選檢視更多行業資訊】
在這裡您可以找到不同行業的第一手的上雲資訊,還在等什麼,快來!
作者 | 鄭超 阿裡雲進階開發工程師
随着物聯網技術以及 5G 技術的高速發展,将雲計算的能力延伸至邊緣裝置端,并通過中心進行統一傳遞、管控,已成為雲計算的重要發展趨勢。為服務更多開發者把握這一趨勢,5 月 29 日,阿裡巴巴正式對外開源了基于 ACK@Edge(邊緣叢集托管服務)的雲原生邊緣計算架構 —— OpenYurt。
自 OpenYurt 開源以來受到了開發者的關注,今天這篇文章将帶大家快速上手 OpenYurt ,介紹如何使用 OpenYurt 提供的指令行管理工具 Yurtctl, 高效快速地部署 OpenYurt 叢集。
OpenYurt 介紹
OpenYurt 主打“雲邊一體化”概念,依托 Kubernetes 強大的容器應用編排能力,滿足了雲-邊一體化的應用分發、傳遞、和管控的訴求。相較于其他基于 Kubernetes 的邊緣計算架構,OpenYurt 秉持着“最小修改”原則,通過在邊緣節點安裝 Yurthub 元件,和在雲端部署 Yurt-controller-manager,保證了在對 Kubernetes 零侵入的情況下,提供管理邊緣計算應用所需的相關能力。OpenYurt 能幫使用者解決在海量邊、端資源上完成大規模應用傳遞、運維、管控的問題,并提供中心服務下沉通道,實作和邊緣計算應用的無縫對接。在設計 OpenYurt 之初,我們就非常強調保持使用者體驗的一緻性,不增加使用者運維負擔,讓使用者真正友善地 “Extending your native kubernetes to edge”。
Yurtctl:一鍵讓原生 K8s 叢集具備邊緣計算能力
為了讓原生 K8s 叢集具備邊緣計算能力,OpenYurt 以 addon 為載體,非侵入式給原生 K8s 增強了如下能力:
- 邊緣自治能力(YurtHub: 已開源),保證在弱網或者重新開機節點的情況下,部署在邊緣節點上的應用也能正常運作;
- 雲邊協同能力(待開源),通過雲邊運維通道解決邊緣的運維需求,同時提供雲邊協同能力;
- 單元化管理能力(待開源),為分散的邊緣節點,邊緣應用,應用間流量提供單元化閉環管理能力;
- 其他一些能力。
對于大家比較關心的問題:如何将增強的邊緣計算能力和原生 K8s 無縫融合。基于過往 ACK@Edge 的線上運維經驗,我們開源了 Yurtctl 指令行工具,幫助實作了原生 Kubernetes 和 OpenYurt 之間的無縫轉換以及對 OpenYurt 相關元件的高效運維。
Yurtctl 的工作原理

圖 1 - Yurtctl convert 流程
Yurtctl 是一個中心化的管控工具。在 OpenYurt 雲-邊一體的架構裡,Yurtctl 将直接與 APIServer 進行互動。它借助原生 Kubernetes 的 Job workload 對每個 node 進行運維操作。如圖1所示,在執行轉換(convert)操作時,Yurtctl 會通過 Job 将一個 servant Pod 部署到使用者指定的邊緣節點上,servant Pod 裡的容器執行的具體操作請參考:github.com/alibaba/ope…。
由于 servant Pod 需要直接操作節點 root 使用者的檔案系統(例如将 yurthub 配置檔案放置于 /etc/kubernetes/manifests 目錄下),并且需要重置系統管理程式(kubelet.service), servant Pod 中的 container 将被賦予 privileged 權限,允許其與節點共享 pid namespace,并将借由 nsenter 指令進入節點主命名空間完成相關操作。當 servant Job 成功執行後,Job 會自動删除。如果失敗,Job 則會被保留,友善運維人員排查錯誤原因。借由該機制,Yurtctl 還可對 Yurthub 進行更新或者删除。
案例:一鍵轉換 OpenYurt 叢集
注:在 ACK 上做 demo 實驗
1. 擷取 yurtctl
OpenYurt github 倉庫包括了 yurtctl 的源碼,下載下傳 OpenYurt 倉庫之後,即可通過編譯獲得 yurtctl,具體指令如下:
編譯成功之後,yurtctl 可執行檔案就可以在 _output/bin/ 目錄下找到。
2. 将 Kubernetes 轉換為 OpenYurt
如果我們想将一個雙節點(node1 和 node2)的 Kubernetes 叢集轉換成 OpenYurt 叢集,并且隻想讓 node2 成為自治邊緣節點,那麼可以通過執行 yurtctl convert 來實作,具體指令如下:
$ yurtctl convert --cloud-nodes node1 --provider ack
I0603 14:34:33.714304 40825 convert.go:164] mark node1 as the cloud-node
I0603 14:34:33.719816 40825 convert.go:172] mark node2 as the edge-node
I0603 14:34:33.736609 40825 convert.go:198] deploy the yurt controller manager
I0603 14:34:33.742272 40825 convert.go:210] deploying the yurt-hub and resetting the kubelet service...
I0603 14:34:53.810165 40825 util.go:168] servant job(yurtctl-servant-convert-node2) has succeeded
成功配置節點之後,我們需要将邊緣節點标記為自治狀态,具體指令如下:
接着我們就可以測試 node2 在斷網環境下是否能實作節點自治。首先,在 node2 上部署一個測試 pod:
登陸到 node2 上,将 Yurthub 的 --server-addr 參數設定為一個不可通路的位址:
sudo sed -i 's|--server-addr=.*|--server-addr=
https://1.1.1.1:1111|' /etc/kubernetes/manifests/yurt-hub.yaml
耐心等待 40 秒,我們将觀察到,即使 node2 已經處于 NotReady 狀态,pod1 仍然處于 Running 狀态。這說明當邊緣節點處于自治狀态時,即使 node 不線上,Pod 也不會被雲端 node controller 驅逐。
這時如果将 node2 重新開機,我們可以用 docker ps (假設節點使用 docker 作為 container runtime)指令來驗證 bbox Pod 會被重新拉起。
這是因為 Kubelet 會從 Yurthub 讀取緩存的資料,恢複重新開機前的Pod狀态。這部分技術細節我們會在後續的文章裡詳細介紹。
3. 将 OpenYurt 轉換回 Kubernetes
相對的,通過運作 yurtctl revert 指令,使用者可以将一個 OpenYurt 叢集轉換回 Kubernetes 叢集。假設我們想将上述雙節點 Kubernetes 叢集轉換回 Kubernetes 模式,那麼隻需運作以下指令即可(運作該指令前,請先将 node2 上的 yurthub 重新連上 apiserver):
$ yurtctl revert
I0603 14:38:55.522376 41016 revert.go:106] label alibabacloud.com/is-edge-worker is removed
I0603 14:38:55.527998 41016 revert.go:116] yurt controller manager is removed
I0603 14:38:55.548354 41016 revert.go:130] ServiceAccount node-controller is created
I0603 14:39:05.572686 41016 util.go:168] servant job(yurtctl-servant-revert-node2) has succeeded
I0603 14:39:05.572718 41016 revert.go:142] yurt-hub is removed, kubelet service is reset
What's Next
Yurtctl 目标是成為運維人員管理 OpenYurt 叢集的有力工具。是以我們會持續演進 Yurtctl 以支援 OpenYurt 的新功能和新增的運維流程或場景。例如,不久之後 OpenYurt 還将開源 Yurttunnel,Yurtunit 等元件,Yurtctl 也将對這些元件提供支援。我們同時歡迎大家提出對 Yurtctl 的需求,一起努力使其更加完善。
【雲栖号線上課堂】每天都有産品技術專家分享!
課程位址:
https://yqh.aliyun.com/live立即加入社群,與專家面對面,及時了解課程最新動态!
【雲栖号線上課堂 社群】
https://c.tb.cn/F3.Z8gvnK
原文釋出時間:2020-06-09
本文作者:阿裡巴巴雲原生
本文來自:“
掘金”,了解相關資訊可以關注“掘金”