邊緣計算
- 1. KubeEdge簡介
- 2. 功能說明
- 3. 架構說明
- 3.1 架構圖
- 3.2. 云端
- 3.3. 邊緣端
- 4. 部署
- 4.1環境準備
- 4.2 云端部署
- 4.2.1 配置 golang 環境
- 4.2.2 配置 cloudcore
- 4.2.3 創建cloud節點
- 4.2 Edge 端部署
- 4.2.1 環境初始化
- 4.2.2 安裝部署docker
- 4.2.3 安裝keadm
- 4.2.4 從云端獲取令牌 token
- 4.2.5 加入邊緣節點
- 4.3 驗證
- 5. 邊緣計算應用Demo
- 5.1 準備作業 (云端操作)
- 5.2 部署云端應用
- 5.3 部署邊緣端應用
- 5.4 體驗 demo
- 5.5 原始碼分析
- 5.5.1 代碼結構
- 5.5.2 代碼說明
- 5.5.2.1 云端應用:web-controller-app
- 5.5.2.2 邊緣端應用:counter-mapper
1. KubeEdge簡介
KubeEdge是華為開源出來的邊緣計算組件,它是基于kubernetes之上將容器化應用的編排能力拓展到邊緣主機或邊緣設備,在云端和邊緣端提供網路通信,應用部署、元資料同步等功能,同時支持MQTT協議,允許開發者在邊緣端自定義接入邊緣設備,
為什么要用KubeEdge而不直接使用K8s?
KubeEdge是為硬體性能低下的遠程設備以及網路狀況糟糕的情況下而設計的,
2. 功能說明
- 邊緣計算:提供邊緣節點自治能力,邊緣節點資料處理能力,
- 便捷部署:開發者可以開發http或mqtt協議的應用,運行在云端和邊緣端,
- k8s原生支持:可以通過k8s管理和監控邊緣設備和邊緣節點,
- 豐富的應用型別:可以在邊緣端部署機器學習、圖片識別、事件處理等應用,
3. 架構說明
3.1 架構圖
kubeedge分為兩個可執行程式,cloudcore和edgecore,

3.2. 云端
- CloudHub:一個web socket服務器,負責監聽云端的更新、快取及向
EdgeHub發送訊息, - EdgeController:一個擴展的k8s控制器,負責管理邊緣節點和pod元資料,同步邊緣節點的資料,是
k8s-apiserver與EdgeCore的通信橋梁, - DeviceController:一個擴展的k8s控制器,負責管理節點設備,同步云端和邊緣端的設備元資料和狀態,
3.3. 邊緣端
-
EdgeHub:一個web socket客戶端,負責云端與邊緣端的資訊互動,其中包括將云端的資源變更同步到邊緣端及邊緣端的狀態變化同步到云端,它充當邊緣與云之間的通信鏈接,
-
Edged:運行在邊緣節點,管理節點生命周期,可以幫助用戶在邊緣節點上部署容器化的作業負載或應用程式, 這些作業負載可以執行任何操作,從簡單的遙測資料操作到分析或ML推理等,使用kubectl云端的命令列界面,用戶可以發出命令來啟動作業負載,
-
EventBus:一個MQTT客戶端,充當用于發送/接收有關mqtt主題的訊息的介面,與MQTT服務端互動,提供發布/訂閱的能力,
-
ServiceBus:一個HTTP客戶端,與HTTP服務端互動,為云組件提供HTTP客戶端功能,以訪問在邊緣運行的HTTP服務器,
-
DeviceTwin:負責存盤設備狀態并同步設備狀態到云端,同時提供應用的介面查詢,
-
MetaManager:
edged和edgehub之間的訊息處理器,負責向輕量資料庫(SQLite)存盤或查詢元資料,
4. 部署
4.1環境準備
我們在上篇文章中安裝好的k8s基礎上再增加1臺邊緣端節點,
從零開始學習部署K8S:https://blog.csdn.net/shyflea/article/details/119758389
注意:往下操作前要先安裝好K8S!!!
主機資訊如下,系統均采用Centos7.x,
| 型別 | IP地址 | 主機名 | 記憶體 | CPU | 部署服務 |
|---|---|---|---|---|---|
| 云端 | 192.168.159.101 | master1 | 4G | 2 | k8s、docker、cloudcore |
| 云端 | 192.168.159.102 | node1 | 2G | 1 | docker |
| 云端 | 192.168.159.103 | node2 | 2G | 1 | docker |
| 邊緣端 | 192.168.159.201 | edge1 | 1G | 1 | docker、edgecore |
4.2 云端部署
云端主要是負責編譯 kubeEdge 的相關組件與運行 cloudcore,所以需要準備 golang 環境,以及需要去官方 github 上拉取原始碼,進行編譯,
4.2.1 配置 golang 環境
$ cd /home
$ wget https://golang.google.cn/dl/go1.14.4.linux-amd64.tar.gz
$ tar -zxvf go1.14.4.linux-amd64.tar.gz -C /usr/local
配置 golang 環境變數
$ vim /etc/profile
檔案末尾追加
# golang env
export GOROOT=/usr/local/go
export GOPATH=/data/gopath
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
$ source /etc/profile
# 創建作業目錄:
$ mkdir -p /data/gopath && cd /data/gopath
$ mkdir -p src pkg bin
4.2.2 配置 cloudcore
下載 kubeEdge 原始碼
# 由于從github上下載比較慢,這里使用加速地址
$ cd /home
$ git clone https://hub.fastgit.org/dogfei/kubeedge.git $GOPATH/src/github.com/kubeedge/kubeedge
編譯 keadm
$ cd $GOPATH/src/github.com/kubeedge/kubeedge
$ make all WHAT=keadm
$ make all WHAT=cloudcore
$ yum -y install gcc
$ make all WHAT=edgecore
將編譯好的二進制檔案 copy 到/usr/local/bin 中
$ cp _output/local/bin/* /usr/local/bin/
4.2.3 創建cloud節點
創建 cloudcore 節點
$ keadm init --advertise-address="192.168.159.101" #IP替換為本機IP
問題1: 連接不上raw.githubusercontent.com
解決方法:編輯vi /etc/hosts,增加
151.101.108.133 raw.githubusercontent.com
問題2: 如果添加完host以后,還是
> Error: failed to run 'sh -c cd /etc/kubeedge/crds/devices && wget -k
> --no-check-certificate --progress=bar:force https://raw.githubusercontent.com/kubeedge/kubeedge/master/build/crds/devices/devices_v1alpha2_device.yaml'
> because of error : exit status 4
解決方法:手動下載后上傳到相應目錄
# 上傳devices_v1alpha2_devicemodel.yaml 和devices_v1alpha2_device.yaml
$ cd /etc/kubeedge/crds/devices
# 下載地址:https://github.com/kubeedge/kubeedge/edit/master/build/crds/devices/
# 上傳 cluster_objectsync_v1alpha1.yaml objectsync_v1alpha1.yaml
$ cd /etc/kubeedge/crds/reliablesyncs
# 下載地址:https://github.com/kubeedge/kubeedge/edit/master/build/crds/reliablesyncs
# 手動下載kubeedge-v1.7.2-linux-amd64.tar.gz安裝包
$ cd /etc/kubeedge/
$ wget -k --no-check-certificate --progress=bar:force https://ghproxy.com/https://github.com/kubeedge/kubeedge/releases/download/v1.7.2/kubeedge-v1.7.2-linux-amd64.tar.gz
# 重新啟動
$ keadm init --advertise-address="192.168.159.101"
# 注意安裝程序中提示是否洗掉kubeedge-v1.7.2-linux-amd64.tar.gz重新下載,要選N

4.2 Edge 端部署
4.2.1 環境初始化
首先對邊緣端edge1進行初始化操作:
關閉防火墻和SELinux
$ systemctl stop firewalld && systemctl disable firewalld
$ setenforce 0
$ vi /etc/selinux/config
SELINUX=disabled
設定/etc/host決議到互通的主機
云端控制節點master1:
$ vi /etc/hosts
192.168.159.201 edge1
邊緣端節點edge1:
$ vi /etc/hosts
192.168.159.201 edge1
192.168.159.101 master1
配置時間同步定時任務
# 使用公共NTP網路時間服務器地址:阿里云
* * * * * /sbin/ntpdate time1.aliyun.com > /dev/null 2>&1
臨時關閉swap磁區
$ swapoff -a
# 永久關閉
$ sed -ri 's/.*swap.*/#&/' /etc/fstab
4.2.2 安裝部署docker
在邊緣節點安裝docker
# 1.設定國內YUM源
$ cd /etc/yum.repos.d/
$ yum install wget
$ wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 2.安裝指定的docker版本
$ yum -y install docker-ce-18.09.7-3.el7 docker-ce-cli-18.09.7
# 3.設定docker使用阿里云加速
$ mkdir /etc/docker
$ cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://ig2l319y.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=cgroupfs"]
}
EOF
# 4.啟動后臺行程
$ systemctl enable docker && systemctl start docker
# 5.查看docker版本
$ docker -v
4.2.3 安裝keadm
Edge 端也通過 keadm 進行配置,可以將 cloud 端編譯生成的二進制檔案 scp 到 Edge 端,
在云端執行如下命令:
$ cd $GOPATH/src/github.com/kubeedge/kubeedge
$ scp -r _output/local/bin/* root@192.168.159.201:/usr/local/bin/
$ scp /etc/kubeedge/kubeedge-v1.7.2-linux-amd64.tar.gz root@192.168.159.201:/etc/kubeedge/
4.2.4 從云端獲取令牌 token
獲取的令牌用于邊緣節點加入時使用,類似于 k8s 的節點加入集群中
$ keadm gettoken
# 輸出結果
576713eff1f92ea4a48fda83538354b25d1e42190d17bbbc7b36e07980dfae2c.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2Mjk2MDI3OTJ9.DH78U1CoFiW_v-Qlnscf40b7De7dAy1-Y2bc7FMkxxg
4.2.5 加入邊緣節點
在邊緣端執行以下命令
$ keadm join --cloudcore-ipport=192.168.159.101:10000 --token=576713eff1f92ea4a48fda83538354b25d1e42190d17bbbc7b36e07980dfae2c.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2Mjk2MDI3OTJ9.DH78U1CoFiW_v-Qlnscf40b7De7dAy1-Y2bc7FMkxxg
# 出現以下輸出表示安裝成功
KubeEdge edgecore is running, For logs visit: journalctl -u edgecore.service -b
4.3 驗證
邊緣端 edgecore 啟動成功后,會與云端的 cloudcore 進行通信,并且邊緣端會加入到 k8s 集群中,所以可以使用 kubectl 命令進行驗證
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
edge1 Ready agent,edge 15m v1.18.6-kubeedge-v1.4.0-beta.0.242+8280082f9da41b
master1 Ready master 4d8h v1.16.2
node1 Ready node 4d5h v1.16.2
node2 Ready node 4d5h v1.16.2
在控制臺也能夠看到新加入的邊緣節點,

5. 邊緣計算應用Demo
這里拿官方的一個例子,進行測驗,
KubeEdge Counter Demo 計數器是一個偽設備,用戶無需任何額外的物理設備即可運行此演示,計數器在邊緣側運行,用戶可以從云側在 Web 中對其進行控制,也可以從云側在 Web 中獲得計數器值,原理圖如下:
5.1 準備作業 (云端操作)
下載示例代碼:
# 使用官方的示例倉庫會比較慢,這里使用加速倉庫
$ git clone https://hub.fastgit.org/kubeedge/examples.git $GOPATH/src/github.com/kubeedge/examples
創建 device model
$ cd $GOPATH/src/github.com/kubeedge/examples/kubeedge-counter-demo/crds
$ kubectl create -f kubeedge-counter-model.yaml
創建 model
#需要根據實際情況修改yaml檔案,修改matchExpressions
$ cd $GOPATH/src/github.com/kubeedge/examples/kubeedge-counter-demo/crds
$ vim kubeedge-counter-instance.yaml
apiVersion: devices.kubeedge.io/v1alpha2
kind: Device
metadata:
name: counter
labels:
description: 'counter'
spec:
deviceModelRef:
name: counter-model
nodeSelector:
nodeSelectorTerms:
- matchExpressions:
- key: 'kubernetes.io/hostname'
operator: In
values:
- edge1
status:
twins:
- propertyName: status
desired:
metadata:
type: string
value: 'OFF'
reported:
metadata:
type: string
value: '0'
# 運行yaml
$ kubectl create -f kubeedge-counter-instance.yaml
5.2 部署云端應用
云端應用 web-controller-app 用來控制邊緣端的 pi-counter-app 應用,該程式默認監聽的埠號為 80,此處修改為 8089,如下所示:
$ cd $GOPATH/src/github.com/kubeedge/examples/kubeedge-counter-demo/web-controller-app
$ vim main.go
package main
import (
"github.com/astaxie/beego"
"github.com/kubeedge/examples/kubeedge-counter-demo/web-controller-app/controller"
)
func main() {
beego.Router("/", new(controllers.TrackController), "get:Index")
beego.Router("/track/control/:trackId", new(controllers.TrackController), "get,post:ControlTrack")
beego.Run(":8089")
}
構建鏡像
#注意:構建鏡像時,如果原始碼不在GOPATH對應的路徑下,請將原始碼拷貝到GOPATH對應的路徑下,如果開啟了go mod請關閉,
$ make all
$ make docker
#這里會進行構建鏡像操作
部署 web-controller-app
$ cd $GOPATH/src/github.com/kubeedge/examples/kubeedge-counter-demo/crds
$ kubectl apply -f kubeedge-web-controller-app.yaml
5.3 部署邊緣端應用
修改代碼并構建鏡像
需要將 Makefile 中的 GOARCH 修改為 amd64 才能運行該容器,
$ cd $GOPATH/src/github.com/kubeedge/examples/kubeedge-counter-demo/counter-mapper
$ vim Makefile
.PHONY: all pi-execute-app docker clean
all: pi-execute-app
pi-execute-app:
GOARCH=amd64 go build -o pi-counter-app main.go
docker:
docker build . -t kubeedge/kubeedge-pi-counter:v1.0.0
clean:
rm -f pi-counter-app
$ make all
$ make docker
部署 Pi Counter App
$ cd $GOPATH/src/github.com/kubeedge/examples/kubeedge-counter-demo/crds
$ kubectl apply -f kubeedge-pi-counter-app.yaml
# 說明:為了防止Pod的部署卡在`ContainerCreating`,這里直接通過docker save、scp和docker load命令將鏡像發布到邊緣端
$ docker save -o kubeedge-pi-counter.tar kubeedge/kubeedge-pi-counter:v1.0.0
$ scp kubeedge-pi-counter.tar root@192.168.159.201:/home
# 以下在邊緣端執行
$ cd /
$ docker load -i kubeedge-pi-counter.tar
5.4 體驗 demo
現在,KubeEdge Demo 的云端部分和邊緣端的部分都已經部署完畢,如下:
$ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kube-7fcbcfdf95-84tjw 1/1 Running 0 4d5h 10.2.1.6 node1 <none> <none>
kube-7fcbcfdf95-g4dzs 1/1 Running 0 4d5h 10.2.2.6 node2 <none> <none>
kubeedge-counter-app-758b9b4ffd-28xq4 1/1 Running 0 4m34s 192.168.159.101 master1 <none> <none>
kubeedge-pi-counter-c69698d6-l7dmt 1/1 Running 0 107s 192.168.159.201 edge1 <none> <none>
訪問測驗
因為使用的 hostNetwork 模式,所以直接訪問即可 ,

選擇ON點擊Execute
在邊緣節點查看執行情況:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8ced25dc67e4 0c040c9b34a0 "/pi-counter-app pi-…" 5 minutes ago Up 5 minutes k8s_kubeedge-pi-counter_kubeedge-pi-counter-c69698d6-l7dmt_default_c01ecd79-daa6-4b6b-a600-f6c71f228167_0
88f4400bda21 kubeedge/pause:3.1 "/pause" 6 minutes ago Up 6 minutes k8s_POD_kubeedge-pi-counter-c69698d6-l7dmt_default_c01ecd79-daa6-4b6b-a600-f6c71f228167_0
$ docker logs -f 8ced25dc67e4

5.5 原始碼分析
5.5.1 代碼結構
代碼主要包含3部分:
1、 web-contoller-app:云端應用,用以控制邊緣端
2 、counter-mapper:邊緣端應用,用以計數
3 、crds:資源檔案,用以部署應用
(1)kubeedge-web-controller-app.yaml:用以部署云端web應用
(2)kubeedge-pi-counter-app.yaml:用以部署邊緣端應用
(3)kubeedge-counter-model.yaml:Device Model,描述設備的元資訊,包括序列號、資產識別符號、Mac地址等描述設備的詳細資訊,也可以稱為設備的靜態屬性或設備屬性,
(4)kubeedge-counter-instance.yaml:Device,描述設備的動態資料,包括特定背景下的設備專有實時資料,例如燈的開、關狀態,也可以稱為設備的孿生屬性,設備孿生同時記錄設備的Actual State(真實狀態)和Expected State(期望狀態),這種方式也使設備在離線狀況下再次上線時,設備的狀態也能得到同步,
status:
twins:
- propertyName: status
desired: # 期望狀態
metadata:
type: string
value: 'OFF'
reported: # 真實狀態
metadata:
type: string
value: '0'
5.5.2 代碼說明
5.5.2.1 云端應用:web-controller-app
1、部署檔案:kubeedge-web-controller-app.yaml
2、web開發采用Beego框架,
主要頁面為views\content.html,主要JS為static\js\track.js,頁面控制類為controller\trackController.go,
3、應用提供3個功能:開、關邊緣端的計數功能,以及獲取當前計數,
4、通過呼叫k8s API,逐層往下呼叫(遠端、邊緣端、MQTT), 最終實作與邊緣端互動的目的,
5.5.2.2 邊緣端應用:counter-mapper
1、主程式入口為main.go的main方法
2、通過訂閱訊息$hw/events/device/counter/twin/update獲取來自云端的指令
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/300545.html
標籤:其他
上一篇:記一次PLC和脈沖型伺服電機的接線方法_20210915
下一篇:DDD領域驅動開發

