KubeEdge架構
KubeEdge這個架構主要是分了雲、邊、端三部分,雲上就是KubeEdge的控制面,邊就是KubeEdge的邊緣節點,端就是跑了一些端側裝置,雲上是一個Kubernetes的master,是沒有做過改動的原生的Kubernetes控制面,後邊我們加了一個元件叫CloudCore,它雲上的元件主要是會拿一些Kubernetes控制面上的東西,透過EdgeController和DeviceController做一些處理,然後透過下邊的CloudHub,CloudHub主要是跟邊端通訊的,邊端有個EdgeHub和Cloud Hub通訊,然後把資料拿下來。KubeEdge架構圖如下圖1:
圖1 kubeedge架構圖
邊端是主要做了一個應用管理和裝置管理的能力,應用管理左邊會有一個Edged,右邊有DeviceTwin、EventBus,分別是應用管理和裝置管理,DataStore就是我們說的本地自治的能力,比如說有個應用或者裝置的元素從雲上分發下來,先把它存到一個數據庫裡,然後再到它的Edged或者裝置裡邊,這樣就能保證雲邊網路斷開或者邊緣節點重啟了以後我應用的Edged它可以從資料庫裡把應用源資料拿出來,這樣就能保證在故障的情況下業務可以正常恢復。
元件介紹
CloudHub
CloudHub是cloudcore 的一個模組,是Controller(EdgeController和DeviceController)和Edge端之間的中介。它同時支援基於web-socket 的連線以及QUIC協議訪問。EdgeHub可以選擇其中一種協議來訪問CloudHub。CloudHub 的功能是實現邊緣和控制器之間的通訊。
邊緣的連線(透過EdgeHub模組)是透過websocket連線上的 HTTP 完成的。對於內部通訊,它直接與控制器通訊。傳送到CloudHub的所有請求都是context物件的請求,該物件與標記為其nodeID的事件物件的對映通道一起儲存。
CloudHub執行的主要功能
- 獲取訊息context併為事件建立ChannelQ
- 透過websocket建立http連線
- 服務websocket連線
- 從邊緣節點讀取訊息
- 將訊息寫入邊緣節點
- 向Controller釋出訊息
DeviceController(裝置控制器)
DeviceController是 KubeEdge 的雲元件,負責裝置管理。KubeEdge 中的裝置管理是透過使用 Kubernetes 自定義資源定義 (CRD)來描述裝置元資料/狀態和裝置控制器來在邊緣和雲之間同步這些裝置更新來實現的。DeviceController啟動兩個獨立的 goroutines,稱為upstream controller和downstream controller。
DeviceController利用裝置模型和裝置例項來實現裝置管理:裝置模型:Device model描述裝置和屬性訪問者公開的裝置屬性以訪問這些屬性。裝置模型就像一個可重複使用的模板,使用它可以建立和管理許多裝置。可以在此處找到有關裝置模型定義的詳細資訊。裝置例項:一個Device instance代表一個實際的裝置物件。它就像一個例項化Device model並引用模型中定義的屬性。裝置規範是靜態的,而裝置狀態包含動態變化的資料,例如裝置屬性的所需狀態和裝置報告的狀態。
Device model 案例
apiVersion: devices.kubeedge.io/v1alpha1
kind: DeviceModel
metadata:
labels:
description: 'TI Simplelink SensorTag Device Model'
manufacturer: 'Texas Instruments'
model: CC2650
name: sensor-tag-model
spec:
properties:
- name: temperature
description: temperature in degree celsius
type:
int:
accessMode: ReadOnly
maximum: 100
unit: Degree Celsius
- name: temperature-enable
description: enable data collection of temperature sensor
type:
string:
accessMode: ReadWrite
defaultValue: OFF
- name: pressure
description: barometric pressure sensor in hectopascal
type:
int:
accessMode: ReadOnly
unit: hectopascal
- name: pressure-enable
description: enable data collection of barometric pressure sensor
type:
string:
accessMode: ReadWrite
defaultValue: OFF
propertyVisitors:
- propertyName: temperature
modbus:
register: CoilRegister
offset: 2
limit: 1
scale: 1.0
isSwap: true
isRegisterSwap: true
- propertyName: temperature-enable
modbus:
register: DiscreteInputRegister
offset: 3
limit: 1
scale: 1.0
isSwap: true
isRegisterSwap: true
- propertyName: pressure-enable
bluetooth:
characteristicUUID: f000aa4204514000b000000000000000
dataWrite:
ON: [1]
OFF: [0]
- propertyName: pressure
bluetooth:
characteristicUUID: f000aa4104514000b000000000000000
dataConverter:
startIndex: 3
endIndex: 5
orderOfOperations:
- operationType: Divide
operationValue: 100
Device instance 案例
apiVersion: devices.kubeedge.io/v1alpha1
kind: Device
metadata:
name: sensor-tag01
labels:
description: 'TI Simplelink SensorTag 2.0 with Bluetooth 4.0'
manufacturer: 'Texas Instruments'
model: CC2650
spec:
deviceModelRef:
name: sensor-tag-model #對Device model 進行引用
protocol:
modbus:
rtu:
serialPort: '1'
baudRate: 115200
dataBits: 8
parity: even
stopBits: 1
slaveID: 1
nodeSelector:
nodeSelectorTerms:
- matchExpressions:
- key: ''
operator: In
values:
- node1
status:
twins:
- propertyName: temperature-enable
reported: #裝置上報的資料
metadata:
timestamp: '1550049403598'
type: string
value: OFF #裝置實際的狀態
desired: #透過雲端修改裝置的資料
metadata:
timestamp: '1550049403598'
type: string
value: ON #裝置需要改成對應的狀態
DeviceController主要功能
upstream controller
透過device twin將裝置更新從邊緣節點同步到雲端。Mapper監聽裝置的更新並透過 MQTT 報告給EventBus。EventBus將裝置狀態傳送到device twin,後者將其儲存在本地,然後將更新同步到雲。DeviceControlle從邊緣(透過 CloudHub)監聽裝置更新並更新雲中報告的狀態,過程如下圖2。
圖2 upstream controller工作過程
downstream controller
透過在 K8S API 從雲端更新邊緣節點上的裝置屬性。DeviceControlle在雲中監視裝置更新並將裝置更新的內容傳送到邊緣節點。這些裝置更的內容在device twin本地儲存。Mapper透過 MQTT 獲取這些更新,並根據更新到執行的裝置上,過程如下圖3。
圖3 downstream controller工作過程
EdgeHub
EdgeHub負責與雲中端的CloudHub元件進行互動。它使用 websocket 連線或使用QUIC協議連線到CloudHub。支援同步雲端資源更新、報告邊緣端主機和裝置狀態變化等功能。
EdgeHub 執行的主要功能
- Keep Alive
- 釋出客戶資訊
- 邊端路由到雲端
- 雲端路由到邊緣
DeviceTwin (裝置孿生)
DeviceTwin 模組負責儲存裝置狀態、處理裝置屬性、處理DeviceTwin操作、在邊緣裝置和邊緣節點之間建立成員、將裝置狀態同步到雲端以及在邊端節點和雲之間同步DeviceTwin資訊。它還為應用程式提供查詢介面。DeviceTwin由四個子模組(即成員模組、通訊模組、裝置模組和裝置孿生模組)組成。
以下是裝置雙控制器執行的功能:
- 將元資料同步到db(Sqlite )和從db(Sqlite )中獲取資料
- 註冊和啟動子模組
- 向子模組分發訊息
- 健康檢查
將元資料同步到db(Sqlite )和從db(Sqlite )中獲取資料
對於邊緣節點管理的所有裝置,裝置孿生執行以下操作:
- 它檢查裝置孿生上下文中的裝置(裝置列表儲存在裝置孿生上下文中),如果不是,則向上下文新增互斥鎖
- 從資料庫查詢裝置
- 從資料庫查詢裝置屬性
- 從資料庫查詢裝置孿生
- 將裝置、裝置屬性和裝置孿生資料組合到一個單一的結構中,並將其儲存在裝置孿生上下文中
註冊和啟動子模組
註冊四個裝置孿生模組並將它們作為單獨的goroutines
向子模組分發訊息
- 持續監聽beehive中的任何裝置孿生訊息。
- 將接收到的訊息傳送到裝置孿生的通訊模組
- 根據訊息來源對訊息進行分類,即訊息是來自EventBus、edgeManager還是EdgeHub,並填充模組的動作模組對映(ActionModuleMap是動作到模組的對映)
- 將訊息傳送到所需的裝置孿生模組
健康檢查
裝置孿生控制器定期(每 60 秒)向子模組傳送ping訊息。一旦收到 ping,每個子模組都會為自己更新對映中的時間。控制器檢查模組的時間是否超過兩分鐘,如果超時則重新啟動子模組。
DeviceTwin 四個模組
- 成員模組
- 孿生模組
- 通訊模組
- 裝置模組
成員模組
成員模組的主要職責是,為雲端新增的設備註冊到邊緣端。該模組將新新增的裝置繫結到邊緣節點,並在邊緣節點和邊緣裝置之間建立關聯。
該模組執行的主要功能是:
- 初始化動作回撥對映
- 接收發送到會員模組的訊息
- 對於每條訊息,讀取操作訊息並呼叫相應的函式
- 從心跳通道接收心跳並向控制器傳送心跳
獲取邊緣節點上的裝置的資訊
EventBus首先收到一條關於它訂閱的主題(membership-get topic)的訊息。此訊息到達 DeviceTwin 控制器,它進一步將訊息傳送到成員模組。成員模組從context中獲取與邊緣節點關聯的裝置,並將資訊傳送到通訊模組。它還處理在執行上述過程時可能出現的錯誤,並將錯誤傳送到通訊模組而不是裝置詳細資訊。通訊模組將資訊傳送到Evenbus元件,事件匯流排元件進一步釋出指定 MQTT 主題(membership-get topic)上的結果。過程如下圖4。
圖4 獲取節點裝置資訊過程
更新邊端節點的裝置資訊
將新增的裝置新增到邊緣節點,並從邊緣節點中刪除已移除的裝置,並更新裝置詳細資訊(如果它們已被更改或更新)。EdgeHub 模組接收來自雲端的成員更新訊息,並將該訊息轉發給 DeviceTwin 控制器,該控制器進一步將其轉發給成員模組。成員模組新增新新增的裝置,刪除最近刪除的裝置,並更新資料庫和快取中已經存在的裝置。更新裝置的詳細資訊後,將向裝置孿生的通訊模組傳送一條訊息。過程如下圖5。
圖5 更新邊端節點的裝置資訊過程
邊緣節點的裝置詳細資訊
提供有關與邊緣節點關聯的裝置的詳細資訊檢視。EventBus模組接收到達訂閱主題的訊息,然後將訊息轉發到 DeviceTwin 控制器,該控制器進一步將其轉發到成員模組。成員模組新增訊息中提到的裝置,刪除快取中不存在的裝置。更新裝置的詳細資訊後,將向裝置孿生的通訊模組傳送一條訊息。過程如下圖6。
圖6 邊緣節點裝置詳細資訊獲取過程
孿生模組
孿生模組的主要職責是處理所有與裝置孿生相關的操作。它可以執行裝置孿生更新、裝置孿生獲取和裝置孿生同步到雲等操作。
該模組執行的主要功能是:
- 初始化動作回撥對映
- 接收發送給孿生模組的訊息
- 對於每條訊息,讀取操作訊息並呼叫相應的函式
- 從心跳通道接收心跳並向控制器傳送心跳
更新裝置的裝置孿生資訊
裝置孿生更新訊息可以由 EdgeHub 模組從雲端接收,也可以透過EventBus元件從MQTT接收。然後將訊息傳送到裝置孿生控制器,從那裡它被髮送到裝置孿生模組。孿生模組更新資料庫中的孿生值,並將更新結果訊息傳送到通訊模組。通訊模組將依次透過事件匯流排將釋出訊息傳送到 MQTT。
獲取裝置的裝置孿生資訊
EventBus元件接收到達訂閱的Topic的訊息,並將訊息轉發到孿生控制器,該控制器進一步將訊息傳送到孿生模組。孿生模組獲取特定裝置的裝置孿生相關資訊並將其傳送到通訊模組。通訊模組將資訊傳送到 EventBus元件,該元件釋出有關指定主題的結果。
裝置孿生資訊同步到雲端
EventBus模組訂閱的雲端主題為裝置孿生同步的訊息。然後將此訊息傳送到 DeviceTwin 控制器,從那裡它被髮送到孿生模組。然後雙胞胎模組同步資料庫中存在的裝置孿生資訊,並將同步的裝置孿生結果傳送到通訊模組。通訊模組進一步將資訊傳送到 EdgeHub 元件,該元件將透過 websocket 連線將更新發送到雲端。該模組還透過通訊模組將更新後的孿生詳細資訊文件、裝置孿生的增量以及更新結果(如果有錯誤)釋出到指定的主題,由通訊模組將資料傳送到EdgeHub。
通訊模組
通訊模組的主要職責是確保裝置孿生與其他元件之間的通訊功能。
該模組執行的主要功能是:
- 初始化動作回撥對映
- 接收發送到通訊模組的訊息
- 對於每條訊息,讀取操作訊息並呼叫相應的函式
- 確認訊息中指定的動作是否完成,如果動作未完成則重做動作
- 從心跳通道接收心跳並向控制器傳送心跳
向 CloudHub 元件傳送資料
首先確保雲端已連線,然後將訊息傳送到EdgeHub模組(透過beehive框架),後者將訊息轉發到雲端(透過websocket連線)。
將資料傳送到存在於邊緣的其他模組
使用beehive 框架將接收到的訊息傳送到EdgeHub模組。EdgeHub模組收到訊息後將其傳送給所需的接收者。
裝置模組
裝置模組的主要職責是執行與裝置相關的操作,例如處理裝置狀態更新和裝置屬性更新。
該模組執行的主要功能是:
- 初始化動作回撥對映
- 接收發送到裝置模組的訊息
- 對於每條訊息,讀取操作訊息
- 從心跳通道接收心跳並向控制器傳送心跳
裝置更新
這個功能主要是對裝置屬性的更改,例如新增屬性、更新屬性和刪除資料庫中的屬性。將裝置屬性更新的結果傳送到事件匯流排元件。-裝置屬性更新從雲端發起,雲端將更新發送到EdgeHub。EdgeHub將訊息傳送到裝置孿生控制器,該控制器將訊息轉發到裝置模組。裝置模組將裝置屬性詳細資訊更新到資料庫中,裝置模組透過DeviceTwin的通訊模組將要釋出的裝置屬性更新結果傳送給EventBus。EventBus進一步釋出結果到指定主題。
裝置狀態更新
這個功能主要是更新裝置的狀態以及資料庫中裝置的最後線上時間。它還透過通訊模組將更新狀態結果透過EdgeHub 模組傳送到雲端,併發送到EventBus模組,然後將結果釋出到 MQTT指定主題上。透過在EventBus元件訂閱的指定主題上釋出訊息來啟動裝置狀態更新。EventBus元件將訊息傳送到裝置孿生控制器,該控制器將訊息轉發到裝置模組。裝置模組更新裝置的狀態以及資料庫中裝置的最後線上時間。裝置模組然後透過DeviceTwin的通訊模組將裝置狀態更新的結果傳送給EventBus元件和EdgeHub元件。EventBus元件進一步釋出指定主題的結果,而EdgeHub 元件將裝置狀態更新發送到雲端。
EventBus
EventBus 充當一個介面,用於傳送/接收關於 mqtt 主題的訊息。
它支援 3 種模式:- internalMqttMode - externalMqttMode - bothMqttMode
EventBus 訂閱主題
|
Topic |
釋出者(publisher) |
訂閱者(subscribe) |
用途簡介 |
|
$hw/events/node/+/membership/updated |
edgecore |
mapper |
訂閱裝置列表的變化 |
|
$hw/events/node/+/membership/get |
mapper |
edgecore |
查詢裝置列表 |
|
$hw/events/node/+/membership/get/result |
edgecore |
mapper |
獲取查詢裝置列表的結果 |
|
$hw/events/device/+/updated |
edgecore |
mapper |
訂閱裝置屬性描述的變化 |
|
$hw/events/device/+/twin/update/result |
edgecore |
mapper |
獲取裝置屬性更新是否成功 |
|
$hw/events/device/+/twin/update/delta |
edgecore |
mapper |
獲取裝置屬性更新的值 |
|
$hw/events/device/+/twin/update/document |
edgecore |
mapper |
獲取裝置屬性更新的操作記錄 |
|
$hw/events/device/+/twin/get/result |
edgecore |
mapper |
返回獲取裝置屬性的值 |
|
$hw/events/device/+/twin/update |
edgecore |
mapper |
通知裝置屬性的值更新 |
|
$hw/events/device/+/twin/get |
mapper |
edgecore |
獲取裝置屬性的值 |
|
$hw/events/device/+/state/update |
mapper |
edgecore |
通知裝置狀態更新 |
|
$hw/events/device/+/state/update/result |
edgecore |
mapper |
獲取裝置狀態更新結果 |
|
$hw/events/upload/# |
無 |
edgecore |
發向雲端 |
|
SYS/dis/upload_records+ |
無 |
edgecore |
傳送雲端 |
EventBus 從外部客戶端傳送訊息
圖7 EvenBus從外部客戶端傳送訊息
EventBus 向外部客戶端傳送響應訊息
圖8 EvenBus向外部客戶端傳送訊息
