
作者| 鄭超 阿裡雲進階開發工程師
随着物聯網技術以及 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 裡的容器執行的具體操作請參考:
https://github.com/alibaba/openyurt/blob/master/config/yurtctl-servant/setup_edgenode。
由于 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,具體指令如下:
$ make build WHAT=cmd/yurtctl
hack/make-rules/build.sh cmd/yurtctl
Building cmd/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
成功配置節點之後,我們需要将邊緣節點标記為自治狀态,具體指令如下:
$ yurtctl markautonomous # 如果使用者隻想标記部分邊緣節點,則可以使用 --autonomous-nodes 選項指定
I0602 11:22:05.610222 89160 markautonomous.go:149] mark node2 as autonomous
接着我們就可以測試 node2 在斷網環境下是否能實作節點自治。首先,在 node2 上部署一個測試 pod:
$ kubectl apply -f-<<EOF
apiVersion: v1
kind: Pod
metadata:
name: bbox
spec:
nodeName: node2
containers:
- image: busybox
command:
- top
name: bbox
EOF
pod/bbox created
登陸到 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 驅逐。
$ kubectl get node
NAME STATUS ROLES AGE VERSION
node1 Ready master 14m v1.14.8
node2 NotReady <none> 12m v1.14.8
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
bbox 1/1 Running 0 5m12s
這時如果将 node2 重新開機,我們可以用
docker ps
(假設節點使用 docker 作為 container runtime)指令來驗證 bbox Pod 會被重新拉起。
$ docker ps --format 'table {{.ID}}\t{{.Image}}\t{{.RunningFor}}' | grep busybox
d0c8134fddc1 busybox About a minutes ago
這是因為 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
如果還想了解更多 yurtctl 的使用方法,請參考 OpenYurt github 倉庫下的[ ]()yurtctl的教程:
https://github.com/alibaba/openyurt/tree/master/docs/tutorialWhat's Next
Yurtctl 目标是成為運維人員管理 OpenYurt 叢集的有力工具。是以我們會持續演進 Yurtctl 以支援 OpenYurt 的新功能和新增的運維流程或場景。例如,不久之後 OpenYurt 還将開源 Yurttunnel,Yurtunit 等元件,Yurtctl 也将對這些元件提供支援。我們同時歡迎大家提出對 Yurtctl 的需求,一起努力使其更加完善。
社群建設
OpenYurt 社群歡迎新使用者加入和參與共建。使用者可以通過
Github issue擷取技術支援、報告 bug、提出需求意見等,或者通過 OpenYurt 使用者釘釘群直接和core開發人員取得聯系。(歡迎釘釘搜尋群号加入交流群:31993519)
歡迎參與共建:OpenYurt 項目位址 -
https://github.com/alibaba/openyurt課程推薦
為了更多開發者能夠享受到 Serverless 帶來的紅利,這一次,我們集結了 10+ 位阿裡巴巴 Serverless 領域技術專家,打造出最适合開發者入門的 Serverless 公開課,讓你即學即用,輕松擁抱雲計算的新範式——Serverless。
點選即可免費觀看課程:
https://developer.aliyun.com/learning/roadmap/serverless“ 阿裡巴巴雲原生 關注微服務、Serverless、容器、Service Mesh 等技術領域、聚焦雲原生流行技術趨勢、雲原生大規模的落地實踐,做最懂雲原生開發者的公衆号。”