作者| 鄭超 阿里雲高級開發工程師

隨着物聯網技術以及 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/ope ... enode

由於 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,具體命令如下:

bash

$ 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 來實現,具體命令如下:

bash

$ 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

成功配置節點之後,我們需要將邊緣節點標記爲自治狀態,具體命令如下:

bash

$ yurtctl markautonomous # 如果用戶只想標記部分邊緣節點,則可以使用 --autonomous-nodes 選項指定

I0602 11:22:05.610222   89160 markautonomous.go:149] mark node2 as autonomous

接着我們就可以測試 node2 在斷網環境下是否能實現節點自治。首先,在 node2 上部署一個測試 pod:

bash

$ 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 參數設置爲一個不可訪問的地址:

bash

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 驅逐。

bash

$ 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 會被重新拉起。

bash

$ 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):

bash

$ 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/ope ... orial

What'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/l ... rless

阿里巴巴雲原生 關注微服務、Serverless、容器、Service Mesh 等技術領域、聚焦雲原生流行技術趨勢、雲原生大規模的落地實踐,做最懂雲原生開發者的公衆號。”

相關文章