1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

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

        共 11665字,需瀏覽 24分鐘

         ·

        2022-11-24 17:19

        作者:

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


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


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



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

        架構(gòu)如下:




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

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

        下面我們通過一個示例來更好地理解 Akri 的工作方式。



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

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




        首先需要模擬出兩臺 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ù)會按照規(guī)則尋找 OPC UA 設(shè)備

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



        OPC UA 設(shè)備模擬
        使用了一個.NET 類型的開源項(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)行這個程序,需要安裝.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)用可以通過訂閱opc.tcp://:62541/Quickstarts/ReferenceServer獲得數(shù)據(jù)



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

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

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

        • 其它,對應(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è)自動化通信協(xié)議

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


        如我們需要 Akri 發(fā)現(xiàn) onvif 設(shè)備,就可以配置 --set onvif.discovery.enabled=true,配置后 Akri 會在集群中部署相應(yīng)的 Discovery 服務(wù),以 Daemonset 的方式運(yùn)行,支持疊加部署,如需要發(fā)現(xiàn)上述三種類型設(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è)備需要部署類型為 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:為Thermometer_TemperatureNAMESPACE_INDEX: "2"的數(shù)據(jù)輸出,數(shù)據(jù)輸出內(nèi)容為 70-80 的隨機(jī)數(shù),并且在隨機(jī)到 75 時,將 75 替換為 120

        • spec.brokerSpec.brokerPodSpec.containers.image: 設(shè)備對應(yīng)工作負(fù)載的鏡像,演示使用的是官方提供的鏡像,作用是訂閱 opcua 所產(chǎn)生的相應(yīng)數(shù)據(jù),此鏡像是可以自定義的,實(shí)現(xiàn)更多可能

        • spec.capacity:針對設(shè)備的工作負(fù)載副本數(shù)量,用于實(shí)現(xiàn)工作負(fù)載高可用

        • spec.discoveryHandler: 這部分主要定義了發(fā)現(xiàn) opuca 設(shè)備的規(guī)則,支持一些過濾規(guī)則

        • spec.configurationServiceSpec:Akri Controller 服務(wù)會為所有設(shè)備的工作負(fù)載創(chuàng)建一個總 svc,這段用于定義相應(yīng)的 svc 的配置

        • spec.instanceServiceSpec: Akri Controller 服務(wù)會為每一個工作負(fù)載創(chuàng)建 svc,這段用于定義相應(yīng) svc 的配置


        示例中可以看到 opuca 的發(fā)現(xiàn)規(guī)則是具體的服務(wù)地址,如果要支持批量的 opuca 設(shè)備發(fā)現(xiàn),可以使用 Local discovery server(LDS),將 opcua 的設(shè)備注冊到 LDS 中,然后在 discoveryUrls 配置中使用 LDS 的地址。采用 LDS 方式的話,可以實(shí)現(xiàn)過濾能力,如排除掉哪些 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 部署到集群后,可以通過 kubectl get akric 查看:
        root@edge-k3s:~/akric-crd# kubectl get akric
        NAME                    CAPACITY   AGE
        akri-opcua-monitoring   1          2m13s
        查看 Discovery 的服務(wù)日志可以看到,兩個 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

        可以通過 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 可以查看到為設(shè)備自動創(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 <---
        訪問 NodePort 端口,查看效果:



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

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


        總 結(jié)

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

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




        About k3s


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


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

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

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

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

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

        手機(jī)掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            手机看片日韩簧片 | 亚洲va欧美va国产va影院 | 全黄一级裸片视频在线观看 | 无码精品人妻一区二区三区e网站 | 国产福利不卡 | 善良的女儿中字头特别篇剧情解析 | 俺也去www00271免费 | 免费成人网站视频 | 新97超碰 | 性荷兰videos艳星极品 |