共计 8539 个字符,预计需要花费 22 分钟才能阅读完成。
作者:
涂家英,SUSE 资深架构师,专一 Cloud-Native 相干产品和解决方案设计,在企业级云原生平台建设畛域领有丰盛的教训。
写在后面
k3s 是 SUSE 推出的为物联网和边缘计算构建的通过认证的 Kubernetes 发行版,它能够帮忙用户在资源受限的场景下应用 kubernetes,并联合 SUSE Rancher 实现云边协同。
将 k3s 与微软开源的 kubernetes 边缘我的项目 Akri 联合应用,用户就领有了在边缘环境发现和应用各种 IOT 设施的能力。
架构
Akri 目前是 CNCF 的一个开源我的项目,其性能简略地说就是能够依据配置主动地寻找到相应的 iot 设施,为其创立关联的工作负载,并且通过一直地检测实现工作负载的动态变化。援用一句官网的形容为:You name it, Akri finds it, you use it.
架构如下:
蕴含了 Controller 服务、Agent 服务和 Discovery Handlers 服务以及两个 CRD 资源。
具体的组件解析能够查看官网文档:https://docs.akri.sh/architec…
上面咱们通过一个示例来更好地了解 Akri 的工作形式。
体验
示例应用了官网提供的一个 OPC UA 温度计 Demo,OPC UA 是当初应用比拟宽泛的工业自动化通信协议,咱们能够通过 Akri 主动发现应用 OPU CA 协定的温度计设施,并为其创立工作负载,采集和应用其产生的温度数据。
示例中体现的大抵工作流程如下:
首先须要模拟出两台 OPC UA 的服务设施,而后在 k3s 集群上部署 Akri 服务,根底工作实现后:
- 向集群配置用于发现 OPC UA 设施的 CRD(Configuration)
- CRD 下发后,Akri 的相应 Discovery 服务会依照规定寻找 OPC UA 设施
- 在找到 OPC UA 设施后,Agent 服务会生成设施对应的 CRD(Instance),Controller 服务查看到 Instance CRD 资源后,将创立对应的工作负载
OPC UA 设施模仿
应用了一个.NET 类型的开源我的项目模仿实现 OPU CA 设施,我的项目地址为:https://gitee.com/leotuss/opc…
克隆到本地后,须要批改以下文件:
# /opcua-dotnet/Applications/ConsoleReferenceServer/Quickstarts.ReferenceServer.Config.xml 文件第 76、77 行
将 <node-ip style="margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> 替换为节点地址
#/opcua-dotnet/Applications/ReferenceServer/Quickstarts.ReferenceServer.Config.xml 文件第 77、78 行
将 <node-ip style="margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> 替换为节点地址 </node-ip></node-ip>`
Linux 要运行这个程序,须要装置.NET core 的 SDK 和 runtime
能够应用以下命令运行此程序:
dotnet run --project /opcua-dotnet/Applications/ConsoleReferenceServer/NetCoreReferenceServer.csproj
运行后,能够看到如下提醒:
root@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
取得数据
装置 Akri
能够通过 Helm 装置 Akri:
# 增加 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
对于 kubernetesDistro 配置,Akri 依赖 crictl 跟踪 pod 信息,所以必须晓得容器运行时 socket 的地位。目前 Akri 反对四种类型:
- 规范 kuberentes,对应配置为:
--set kubernetesDistro=k8s
- k3s,对应配置为:
--set kubernetesDistro=k3s
- microk8s,对应配置为:
--set kubernetesDistro=microk8s
- 其它,对应配置为:
--set agent.host.containerRuntimeSocket=/container/runtime.sock
对于 xxx.discovery.enabled 配置,Akri 目前反对三种设施发现:
- onvif:IP Cameras 的支流协定
- opc ua:工业自动化通信协议
- udev:linux 设施管理器
如咱们须要 Akri 发现 onvif 设施,就能够配置 --set onvif.discovery.enabled=true
, 配置后 Akri 会在集群中部署相应的 Discovery 服务,以 Daemonset 的形式运行,反对叠加部署,如须要发现上述三种类型设施,部署命令能够批改为:
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
部署实现后查看集群 Pods 能够看到:
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
部署 CRD
应用 Akri 发现设施须要部署类型为 Configuration 的 CRD:
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: 用于定义须要采集数据的 ID 信息,本演示中 opcua 程序中增加了
IDENTIFIER: 为 Thermometer_Temperature
和NAMESPACE_INDEX: "2"
的数据输入,数据输入内容为 70-80 的随机数,并且在随机到 75 时,将 75 替换为 120 - spec.brokerSpec.brokerPodSpec.containers.image: 设施对应工作负载的镜像,演示应用的是官网提供的镜像,作用是订阅 opcua 所产生的相应数据,此镜像是能够自定义的,实现更多可能
- spec.capacity:针对设施的工作负载正本数量,用于实现工作负载高可用
- spec.discoveryHandler: 这部分次要定义了发现 opuca 设施的规定,反对一些过滤规定
- spec.configurationServiceSpec:Akri Controller 服务会为所有设施的工作负载创立一个总 svc,这段用于定义相应的 svc 的配置
- spec.instanceServiceSpec: Akri Controller 服务会为每一个工作负载创立 svc,这段用于定义相应 svc 的配置
示例中能够看到 opuca 的发现规定是具体的服务地址,如果要反对批量的 opuca 设施发现,能够应用 Local discovery server(LDS),将 opcua 的设施注册到 LDS 中,而后在 discoveryUrls 配置中应用 LDS 的地址。采纳 LDS 形式的话,能够实现过滤能力,如排除掉哪些 opcua 服务或者蕴含哪些 opcua 服务,示例如下:
# 发现 LDS 中的所有 opcua 设施,除了 <someserver style="margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;"> 以外 </someserver>
discoveryDetails: |+
opcuaDiscoveryMethod:
standard:
discoveryUrls:
- opc.tcp://<lds 服务器地址 style="margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;">:4840</lds 服务器地址 >
applicationNames:
action: Exclude
items:
-
将 akri-opcua-monitoring 的 crd 部署到集群后,能够通过 kubectl get akric
查看:
root@edge-k3s:~/akric-crd# kubectl get akric
NAME CAPACITY AGE
akri-opcua-monitoring 1 2m13s
查看 Discovery 的服务日志能够看到,两个 opcua 设施曾经被发现:
[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
能够通过 kubectl get akrii
查看由 Agent 主动生成的 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`
于此同时,应用 kubectl get pods
能够查看到为设施主动创立的工作负载:
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 <---
部署数据展现服务
部署数据展现服务查看成果:
kubectl apply -f https://raw.githubusercontent.com/project-akri/akri/main/deployment/samples/akri-anomaly-detection-app.yaml
部署实现后,查看一下展现服务 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 <---
拜访 NodePort 端口,查看成果:
这个展现服务原理是通过连贯工作负载的 SVC 获取工作负载采集到的设施数据,当值为 70-80 中任意数值时示意失常,用黑体展现;当值为 120 时示意异样,用红体展现
当设施下线时,Akri 会主动删除设施对应的工作负载,删除的工夫大概为 5 分钟,以便应答可能呈现的长期网络故障。
总 结
Akri 其实能够了解为是一种设施主动发现的框架,它能够通过云原生的形式帮忙咱们发现并应用 IOT 设施,目前反对 onvif、udev、opcua 三种类型。其它包含 Bluetooth、CoAP、IP、LoRaWAN、Zeroconf、acpid、MQTT 也正在开发中。
应用 k3s 能够帮忙用户实现在边缘侧应用 kubernetes 的能力,通过 Akri 能够解决边缘场景下发现和应用设施的问题,这样用户就能将更多的精力专一在数据处理的利用上。