云原生邊緣設(shè)備解決方案 Akri on k3s 初體驗(yàn)
作者:
涂家英,SUSE 資深架構(gòu)師,專(zhuān)注 Cloud-Native 相關(guān)產(chǎn)品和解決方案設(shè)計(jì),在企業(yè)級(jí)云原生平臺(tái)建設(shè)領(lǐng)域擁有豐富的經(jīng)驗(yàn)。
將 k3s 與微軟開(kāi)源的 kubernetes 邊緣項(xiàng)目 Akri 結(jié)合使用,用戶(hù)就擁有了在邊緣環(huán)境發(fā)現(xiàn)和使用各種 IOT 設(shè)備的能力。


向集群配置用于發(fā)現(xiàn) OPC UA 設(shè)備的 CRD(Configuration)
CRD 下發(fā)后,Akri 的相應(yīng) Discovery 服務(wù)會(huì)按照規(guī)則尋找 OPC UA 設(shè)備
在找到 OPC UA 設(shè)備后,Agent 服務(wù)會(huì)生成設(shè)備對(duì)應(yīng)的 CRD(Instance),Controller 服務(wù)查看到 Instance CRD 資源后,將創(chuàng)建對(duì)應(yīng)的工作負(fù)載
克隆到本地后,需要修改以下文件:
# /opcua-dotnet/Applications/ConsoleReferenceServer/Quickstarts.ReferenceServer.Config.xml文件第76、77行
將替換為節(jié)點(diǎn)地址
#/opcua-dotnet/Applications/ReferenceServer/Quickstarts.ReferenceServer.Config.xml文件第77、78行
將替換為節(jié)點(diǎn)地址
Linux 要運(yùn)行這個(gè)程序,需要安裝.NET core 的 SDK 和 runtime
可以使用以下命令運(yùn)行此程序:
dotnet run --project /opcua-dotnet/Applications/ConsoleReferenceServer/NetCoreReferenceServer.csprojroot@edge-iot1:~/opcua-dotnet/Applications/ConsoleReferenceServer# dotnet run --project NetCoreReferenceServer.csproj
.Net Core OPC UA Reference Server
opc.tcp://192.168.6.151:62541/Quickstarts/ReferenceServer
https://192.168.6.151:62540/Quickstarts/ReferenceServer/
Server started. Press Ctrl-C to exit...
opc.tcp://:62541/Quickstarts/ReferenceServer 獲得數(shù)據(jù)# 添加Akri repo
helm repo add akri-helm-charts https://project-akri.github.io/akri/
# 部署Akri
helm install akri akri-helm-charts/akri\
--set kubernetesDistro=k3s \
--set opcua.discovery.enabled=true
標(biāo)準(zhǔn) kuberentes,對(duì)應(yīng)配置為:
--set kubernetesDistro=k8sk3s,對(duì)應(yīng)配置為:
--set kubernetesDistro=k3smicrok8s,對(duì)應(yīng)配置為:
--set kubernetesDistro=microk8s其它,對(duì)應(yīng)配置為:
--set agent.host.containerRuntimeSocket=/container/runtime.sock
onvif:IP Cameras 的主流協(xié)議
opc ua:工業(yè)自動(dòng)化通信協(xié)議
udev:linux 設(shè)備管理器
--set onvif.discovery.enabled=true,配置后 Akri 會(huì)在集群中部署相應(yīng)的 Discovery 服務(wù),以 Daemonset 的方式運(yùn)行,支持疊加部署,如需要發(fā)現(xiàn)上述三種類(lèi)型設(shè)備,部署命令可以修改為:helm install akri akri-helm-charts/akri\
--set kubernetesDistro=k3s \
--set opcua.discovery.enabled=true \
--set onvif.discovery.enabled=true \
--set udev.discovery.enabled=true root@edge-k3s:~# kubectl get pods
NAME READY STATUS RESTARTS AGE
akri-controller-deployment-d4f7847b6-rlgrr 1/1 Running 11 (25h ago) 4d2h
akri-agent-daemonset-9s9m9 1/1 Running 10 (25h ago) 3d23h
akri-opcua-discovery-daemonset-tv84d 1/1 Running 8 (25h ago) 3d17h
apiVersion: akri.sh/v0
kind: Configuration
metadata:
name: akri-opcua-monitoring
namespace: default
spec:
brokerProperties:
IDENTIFIER: Thermometer_Temperature
NAMESPACE_INDEX: "2"
brokerSpec:
brokerPodSpec:
containers:
- image: ghcr.io/project-akri/akri/opcua-monitoring-broker:latest
name: akri-opcua-monitoring-broker
resources:
limits:
'{{PLACEHOLDER}}': "1"
cpu: 30m
memory: 200Mi
requests:
'{{PLACEHOLDER}}': "1"
cpu: 9m
memory: 76Mi
capacity: 1
configurationServiceSpec:
ports:
- name: grpc
port: 80
protocol: TCP
targetPort: 8083
type: ClusterIP
discoveryHandler:
name: opcua
discoveryDetails: |+
opcuaDiscoveryMethod:
standard:
discoveryUrls:
- opc.tcp://192.168.6.151:62541/Quickstarts/ReferenceServer/
- opc.tcp://192.168.6.152:62541/Quickstarts/ReferenceServer/
applicationNames:
action: Exclude
items: []
name: opcua
instanceServiceSpec:
ports:
- name: grpc
port: 80
protocol: TCP
targetPort: 8083
type: ClusterIP
spec.brokerProperties: 用于定義需要采集數(shù)據(jù)的 ID 信息,本演示中 opcua 程序中添加了
IDENTIFIER:為T(mén)hermometer_Temperature和NAMESPACE_INDEX: "2"的數(shù)據(jù)輸出,數(shù)據(jù)輸出內(nèi)容為 70-80 的隨機(jī)數(shù),并且在隨機(jī)到 75 時(shí),將 75 替換為 120spec.brokerSpec.brokerPodSpec.containers.image: 設(shè)備對(duì)應(yīng)工作負(fù)載的鏡像,演示使用的是官方提供的鏡像,作用是訂閱 opcua 所產(chǎn)生的相應(yīng)數(shù)據(jù),此鏡像是可以自定義的,實(shí)現(xiàn)更多可能
spec.capacity:針對(duì)設(shè)備的工作負(fù)載副本數(shù)量,用于實(shí)現(xiàn)工作負(fù)載高可用
spec.discoveryHandler: 這部分主要定義了發(fā)現(xiàn) opuca 設(shè)備的規(guī)則,支持一些過(guò)濾規(guī)則
spec.configurationServiceSpec:Akri Controller 服務(wù)會(huì)為所有設(shè)備的工作負(fù)載創(chuàng)建一個(gè)總 svc,這段用于定義相應(yīng)的 svc 的配置
spec.instanceServiceSpec: Akri Controller 服務(wù)會(huì)為每一個(gè)工作負(fù)載創(chuàng)建 svc,這段用于定義相應(yīng) svc 的配置
示例中可以看到 opuca 的發(fā)現(xiàn)規(guī)則是具體的服務(wù)地址,如果要支持批量的 opuca 設(shè)備發(fā)現(xiàn),可以使用 Local discovery server(LDS),將 opcua 的設(shè)備注冊(cè)到 LDS 中,然后在 discoveryUrls 配置中使用 LDS 的地址。采用 LDS 方式的話(huà),可以實(shí)現(xiàn)過(guò)濾能力,如排除掉哪些 opcua 服務(wù)或者包含哪些 opcua 服務(wù),示例如下:
# 發(fā)現(xiàn)LDS中的所有opcua設(shè)備,除了以外
discoveryDetails: |+
opcuaDiscoveryMethod:
standard:
discoveryUrls:
- opc.tcp://:4840
applicationNames:
action: Exclude
items:
-
kubectl get akric 查看:root@edge-k3s:~/akric-crd# kubectl get akric
NAME CAPACITY AGE
akri-opcua-monitoring 1 2m13s
[2022-11-10T08:26:26Z TRACE akri_opcua::discovery_impl] get_discovery_url_from_application - found server : Quickstart Reference Server
[2022-11-10T08:26:26Z TRACE akri_opcua::discovery_impl] get_discovery_url_from_application - server has [UAString { value: Some("https://192.168.6.151:62540/Quickstarts/ReferenceServer/discovery") }, UAString { value: Some("opc.tcp://192.168.6.151:62541/Quickstarts/ReferenceServer") }] DiscoveryUrls
[2022-11-10T08:26:26Z TRACE akri_opcua::discovery_impl] get_discovery_urls - Server at opc.tcp://192.168.6.152:62541/Quickstarts/ReferenceServer/ responded with 1 Applications
[2022-11-10T08:26:26Z TRACE akri_opcua::discovery_impl] get_discovery_url_from_application - found server : Quickstart Reference Server
[2022-11-10T08:26:26Z TRACE akri_opcua::discovery_impl] get_discovery_url_from_application - server has [UAString { value: Some("https://192.168.6.152:62540/Quickstarts/ReferenceServer/discovery") }, UAString { value: Some("opc.tcp://192.168.6.152:62541/Quickstarts/ReferenceServer") }] DiscoveryUrls
[2022-11-10T08:26:26Z TRACE akri_opcua::discovery_handler] discover - found OPC UA server at DiscoveryURL opc.tcp://192.168.6.151:62541/Quickstarts/ReferenceServer
[2022-11-10T08:26:26Z TRACE akri_opcua::discovery_handler] discover - found OPC UA server at DiscoveryURL opc.tcp://192.168.6.152:62541/Quickstarts/ReferenceServer
可以通過(guò) kubectl get akrii 查看由 Agent 自動(dòng)生成的 opcua 的 instance crd 資源:
root@edge-k3s:~/akric-crd# kubectl get akrii
NAME CONFIG SHARED NODES AGE
akri-opcua-monitoring-7aa6fb akri-opcua-monitoring true ["edge-k3s"] 5m10s
akri-opcua-monitoring-20f7e0 akri-opcua-monitoring true ["edge-k3s"] 5m9s
于此同時(shí),使用 kubectl get pods 可以查看到為設(shè)備自動(dòng)創(chuàng)建的工作負(fù)載:
NAME READY STATUS RESTARTS AGE
akri-controller-deployment-d4f7847b6-rlgrr 1/1 Running 11 (27h ago) 4d4h
akri-agent-daemonset-9s9m9 1/1 Running 10 (27h ago) 4d1h
akri-opcua-discovery-daemonset-tv84d 1/1 Running 8 (27h ago) 3d19h
edge-k3s-akri-opcua-monitoring-7aa6fb-pod 1/1 Running 0 6m44s <---
edge-k3s-akri-opcua-monitoring-20f7e0-pod 1/1 Running 0 6m43s <---
部署數(shù)據(jù)展示服務(wù)查看效果:
kubectl apply -f https://raw.githubusercontent.com/project-akri/akri/main/deployment/samples/akri-anomaly-detection-app.yaml
部署完成后,查看一下展示服務(wù) SVC 的 NodePort 端口:
root@edge-k3s:~# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.43.0.1 <none> 443/TCP 5d6h
akri-opcua-monitoring-7aa6fb-svc ClusterIP 10.43.152.214 <none> 80/TCP 13m
akri-opcua-monitoring-svc ClusterIP 10.43.242.118 <none> 80/TCP 13m
akri-opcua-monitoring-20f7e0-svc ClusterIP 10.43.22.196 <none> 80/TCP 13m
akri-anomaly-detection-app NodePort 10.43.248.164 <none> 80:32007/TCP 7s <---

這個(gè)展示服務(wù)原理是通過(guò)連接工作負(fù)載的 SVC 獲取工作負(fù)載采集到的設(shè)備數(shù)據(jù),當(dāng)值為 70-80 中任意數(shù)值時(shí)表示正常,用黑體展示;當(dāng)值為 120 時(shí)表示異常,用紅體展示
掃碼添加k3s中文社區(qū)助手
加入官方中文技術(shù)社區(qū)
官網(wǎng):https://k3s.io
