雲計算

OpenYurt 開箱測評 | 一鍵讓原生 K8s 集群具備邊緣計算能力

image.png

隨著物聯網技術以及 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 的工作原理

image.png
圖 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-<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 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/tutorial

What's Next

Yurtctl 目標是成為運維人員管理 OpenYurt 集群的有力工具。因此我們會持續演進 Yurtctl 以支持 OpenYurt 的新功能和新增的運維流程或場景。例如,不久之後 OpenYurt 還將開源 Yurttunnel,Yurtunit 等組件,Yurtctl 也將對這些組件提供支持。我們同時歡迎大家提出對 Yurtctl 的需求,一起努力使其更加完善。

社區建設

OpenYurt 社區歡迎新用戶加入和參與共建。用戶可以通過 Github issue 獲取技術支持、報告 bug、提出需求意見。

本文轉自<阿里巴巴雲原生技術圈>——阿里巴巴雲原生小助手

Leave a Reply

Your email address will not be published. Required fields are marked *