<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          云原生邊緣設(shè)備解決方案 Akri on k3s 初體驗(yàn)

          共 11665字,需瀏覽 24分鐘

           ·

          2022-11-24 17:19

          作者:

          涂家英,SUSE 資深架構(gòu)師,專(zhuān)注 Cloud-Native 相關(guān)產(chǎn)品和解決方案設(shè)計(jì),在企業(yè)級(jí)云原生平臺(tái)建設(shè)領(lǐng)域擁有豐富的經(jīng)驗(yàn)。


          寫(xiě)在前面
          k3s 是 SUSE 推出的為物聯(lián)網(wǎng)和邊緣計(jì)算構(gòu)建的經(jīng)過(guò)認(rèn)證的 Kubernetes 發(fā)行版,它可以幫助用戶(hù)在資源受限的場(chǎng)景下使用 kubernetes,并結(jié)合 SUSE Rancher 實(shí)現(xiàn)云邊協(xié)同。


          將 k3s 與微軟開(kāi)源的 kubernetes 邊緣項(xiàng)目 Akri 結(jié)合使用,用戶(hù)就擁有了在邊緣環(huán)境發(fā)現(xiàn)和使用各種 IOT 設(shè)備的能力。



          架構(gòu)
          Akri 目前是 CNCF 的一個(gè)開(kāi)源項(xiàng)目,其功能簡(jiǎn)單地說(shuō)就是可以根據(jù)配置自動(dòng)地尋找到相應(yīng)的 iot 設(shè)備,為其創(chuàng)建關(guān)聯(lián)的工作負(fù)載,并且通過(guò)不斷地檢測(cè)實(shí)現(xiàn)工作負(fù)載的動(dòng)態(tài)變化。引用一句官方的描述為:You name it, Akri finds it, you use it.

          架構(gòu)如下:




          包含了 Controller 服務(wù)、Agent 服務(wù)和 Discovery Handlers 服務(wù)以及兩個(gè) CRD 資源。

          具體的組件解析可以查看官方文檔:https://docs.akri.sh/architecture/architecture-overview

          下面我們通過(guò)一個(gè)示例來(lái)更好地理解 Akri 的工作方式。



          體驗(yàn)
          示例使用了官方提供的一個(gè) OPC UA 溫度計(jì) Demo,OPC UA 是現(xiàn)在使用比較廣泛的工業(yè)自動(dòng)化通信協(xié)議,我們可以通過(guò) Akri 自動(dòng)發(fā)現(xiàn)使用 OPU CA 協(xié)議的溫度計(jì)設(shè)備,并為其創(chuàng)建工作負(fù)載,采集和使用其產(chǎn)生的溫度數(shù)據(jù)。

          示例中體現(xiàn)的大致工作流程如下:




          首先需要模擬出兩臺(tái) OPC UA 的服務(wù)設(shè)備,然后在 k3s 集群上部署 Akri 服務(wù),基礎(chǔ)工作完成后:
          1. 向集群配置用于發(fā)現(xiàn) OPC UA 設(shè)備的 CRD(Configuration)

          2. CRD 下發(fā)后,Akri 的相應(yīng) Discovery 服務(wù)會(huì)按照規(guī)則尋找 OPC UA 設(shè)備

          3. 在找到 OPC UA 設(shè)備后,Agent 服務(wù)會(huì)生成設(shè)備對(duì)應(yīng)的 CRD(Instance),Controller 服務(wù)查看到 Instance CRD 資源后,將創(chuàng)建對(duì)應(yīng)的工作負(fù)載



          OPC UA 設(shè)備模擬
          使用了一個(gè).NET 類(lèi)型的開(kāi)源項(xiàng)目模擬實(shí)現(xiàn) OPU CA 設(shè)備,項(xiàng)目地址為:https://gitee.com/leotuss/opcua-donet

          克隆到本地后,需要修改以下文件:
          # /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.csproj
          運(yùn)行后,可以看到如下提示:
          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...


          至此程序運(yùn)行成功,應(yīng)用可以通過(guò)訂閱opc.tcp://:62541/Quickstarts/ReferenceServer獲得數(shù)據(jù)



          安裝 Akri

          可以通過(guò) 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
          關(guān)于 kubernetesDistro 配置,Akri 依賴(lài) crictl 跟蹤 pod 信息,所以必須知道容器運(yùn)行時(shí) socket 的位置。目前 Akri 支持四種類(lèi)型:
          • 標(biāo)準(zhǔn) kuberentes,對(duì)應(yīng)配置為:--set kubernetesDistro=k8s

          • k3s,對(duì)應(yīng)配置為:--set kubernetesDistro=k3s

          • microk8s,對(duì)應(yīng)配置為:--set kubernetesDistro=microk8s

          • 其它,對(duì)應(yīng)配置為:--set agent.host.containerRuntimeSocket=/container/runtime.sock


          關(guān)于 xxx.discovery.enabled 配置,Akri 目前支持三種設(shè)備發(fā)現(xiàn):
          • onvif:IP Cameras 的主流協(xié)議

          • opc ua:工業(yè)自動(dòng)化通信協(xié)議

          • udev:linux 設(shè)備管理器


          如我們需要 Akri 發(fā)現(xiàn) onvif 設(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
          部署完成后查看集群 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 發(fā)現(xiàn)設(shè)備需要部署類(lèi)型為 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
          需要關(guān)注的配置:
          • spec.brokerProperties: 用于定義需要采集數(shù)據(jù)的 ID 信息,本演示中 opcua 程序中添加了 IDENTIFIER:為T(mén)hermometer_TemperatureNAMESPACE_INDEX: "2"的數(shù)據(jù)輸出,數(shù)據(jù)輸出內(nèi)容為 70-80 的隨機(jī)數(shù),并且在隨機(jī)到 75 時(shí),將 75 替換為 120

          • spec.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:
             -
          將 akri-opcua-monitoring 的 crd 部署到集群后,可以通過(guò) kubectl get akric 查看:
          root@edge-k3s:~/akric-crd# kubectl get akric
          NAME                    CAPACITY   AGE
          akri-opcua-monitoring   1          2m13s
          查看 Discovery 的服務(wù)日志可以看到,兩個(gè) opcua 設(shè)備已經(jīng)被發(fā)現(xiàn):
          [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ù)

          部署數(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 <---
          訪(fǎng)問(wèn) NodePort 端口,查看效果:



          這個(gè)展示服務(wù)原理是通過(guò)連接工作負(fù)載的 SVC 獲取工作負(fù)載采集到的設(shè)備數(shù)據(jù),當(dāng)值為 70-80 中任意數(shù)值時(shí)表示正常,用黑體展示;當(dāng)值為 120 時(shí)表示異常,用紅體展示

          當(dāng)設(shè)備下線(xiàn)時(shí),Akri 會(huì)自動(dòng)刪除設(shè)備對(duì)應(yīng)的工作負(fù)載,刪除的時(shí)間大約為 5 分鐘,以便應(yīng)對(duì)可能出現(xiàn)的臨時(shí)網(wǎng)絡(luò)故障。


          總 結(jié)

          Akri 其實(shí)可以理解為是一種設(shè)備自動(dòng)發(fā)現(xiàn)的框架,它可以通過(guò)云原生的方式幫助我們發(fā)現(xiàn)并使用 IOT 設(shè)備,目前支持 onvif、udev、opcua 三種類(lèi)型。其它包括 Bluetooth、CoAP、IP、LoRaWAN、Zeroconf、acpid、MQTT 也正在開(kāi)發(fā)中。

          使用 k3s 可以幫助用戶(hù)實(shí)現(xiàn)在邊緣側(cè)使用 kubernetes 的能力,通過(guò) Akri 可以解決邊緣場(chǎng)景下發(fā)現(xiàn)和使用設(shè)備的問(wèn)題,這樣用戶(hù)就能將更多的精力專(zhuān)注在數(shù)據(jù)處理的應(yīng)用上。




          About k3s


          k3s 是首個(gè)進(jìn)入 CNCF 沙箱項(xiàng)目的 K8S 發(fā)行版,同時(shí)也是當(dāng)前全球用戶(hù)量最大的 CNCF 認(rèn)證輕量級(jí) K8S 發(fā)行版。自2019年3月發(fā)布以來(lái),備受全球開(kāi)發(fā)者們關(guān)注,至今GitHub Star數(shù)已超過(guò) 17,000,成為了開(kāi)源社區(qū)最受歡迎的邊緣計(jì)算 K8S 解決方案。截至目前,K3s全球下載量超過(guò)100萬(wàn)次,每周平均被安裝超過(guò)2萬(wàn)次,其中30%的下載量來(lái)自中國(guó)。


          k3s 專(zhuān)為在資源有限的環(huán)境中運(yùn)行 Kubernetes 的研發(fā)和運(yùn)維人員設(shè)計(jì),將滿(mǎn)足日益增長(zhǎng)的在邊緣計(jì)算環(huán)境中運(yùn)行在 x86、ARM64 和 ARMv7 處理器上的小型、易于管理的 Kubernetes 集群需求。k3s 的發(fā)布,為開(kāi)發(fā)者們提供了以“Rancher 2.X + k3s”為核心的從數(shù)據(jù)中心到云到邊到端的 K8S 即服務(wù)(Kubernetes-as-a-Service),推動(dòng) Kubernetes Everywhere。

          掃碼添加k3s中文社區(qū)助手

          加入官方中文技術(shù)社區(qū)

          官網(wǎng):https://k3s.io

          瀏覽 1391
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  青草青青青视频 | 六月丁香久久 | 人人澡人人摸人人看 | 欧美日韩一区二区三区四区论理片 | 伊人网大香蕉视频 |