做者| 鄭超 阿里雲高級開發工程師node
隨着物聯網技術以及 5G 技術的高速發展,將雲計算的能力延伸至邊緣設備端,並經過中心進行統一交付、管控,已成爲雲計算的重要發展趨勢。爲服務更多開發者把握這一趨勢,5 月 29 日,阿里巴巴正式對外開源了基於 ACK@Edge(邊緣集羣託管服務)的雲原生邊緣計算框架 —— OpenYurt。git
自 OpenYurt 開源以來受到了開發者的關注,今天這篇文章將帶你們快速上手 OpenYurt ,介紹如何使用 OpenYurt 提供的命令行管理工具 Yurtctl, 高效快速地部署 OpenYurt 集羣。github
OpenYurt 主打「雲邊一體化」概念,依託 Kubernetes 強大的容器應用編排能力,知足了雲-邊一體化的應用分發、交付、和管控的訴求。相較於其餘基於 Kubernetes 的邊緣計算框架,OpenYurt 秉持着「最小修改」原則,經過在邊緣節點安裝 Yurthub 組件,和在雲端部署 Yurt-controller-manager,保證了在對 Kubernetes 零侵入的狀況下,提供管理邊緣計算應用所需的相關能力。OpenYurt 能幫用戶解決在海量邊、端資源上完成大規模應用交付、運維、管控的問題,並提供中心服務下沉通道,實現和邊緣計算應用的無縫對接。在設計 OpenYurt 之初,咱們就很是強調保持用戶體驗的一致性,不增長用戶運維負擔,讓用戶真正方便地 「Extending your native kubernetes to edge」。docker
爲了讓原生 K8s 集羣具有邊緣計算能力,OpenYurt 以 addon 爲載體,非侵入式給原生 K8s 加強了以下能力:api
對於你們比較關心的問題:如何將加強的邊緣計算能力和原生 K8s 無縫融合。基於過往 ACK@Edge 的線上運維經驗,咱們開源了 Yurtctl 命令行工具,幫助實現了原生 Kubernetes 和 OpenYurt 之間的無縫轉換以及對 OpenYurt 相關組件的高效運維。緩存
圖 1 - Yurtctl convert 流程bash
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 進行更新或者刪除。app
注:在 ACK 上作 demo 實驗框架
OpenYurt github 倉庫包括了 yurtctl 的源碼,下載 OpenYurt 倉庫以後,便可經過編譯得到 yurtctl,具體命令以下:
$ make build WHAT=cmd/yurtctl hack/make-rules/build.sh cmd/yurtctl Building cmd/yurtctl
編譯成功以後,yurtctl 可執行文件就能夠在 _output/bin/
目錄下找到。
若是咱們想將一個雙節點(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狀態。這部分技術細節咱們會在後續的文章裏詳細介紹。
相對的,經過運行 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/tutorial。
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 等技術領域、聚焦雲原生流行技術趨勢、雲原生大規模的落地實踐,作最懂雲原生開發者的公衆號。」