Share via


教學課程:在 Windows 上使用適用於 Linux 的 IoT Edge 建立 IoT Edge 裝置的階層

適用於:IoT Edge 1.4 複選標記 IoT Edge 1.4

重要

支援 IoT Edge 1.5 LTS 和 IoT Edge 1.4 版本。 IoT Edge 1.4 LTS 於 2024 年 11 月 12 日結束生命週期。 如果您是舊版,請參閱更新 IoT Edge

您可以將 Azure IoT Edge 節點部署在階層式階層中組織的網路。 階層中的每個階層都是一個閘道裝置,可處理來自其下方階層中裝置的訊息和要求。 此設定也稱為 巢狀邊緣

您可以建立裝置階層的結構,讓只有最上層能夠連線到雲端,而較低層只能與相鄰的北端和南端層通訊。 此網路分層是大部分產業網路的基礎,遵循 ISA-95 標準

本教學課程將逐步引導您使用 Windows 上的適用於 Linux 的 IoT Edge 建立 IoT Edge 裝置階層、將 IoT Edge 運行時間容器部署到您的裝置,以及設定本機的裝置。 您可以執行下列工作:

  • 在 IoT Edge 裝置的階層中建立和定義關聯性。
  • 在階層中的裝置上設定IoT Edge運行時間。
  • 在裝置階層中安裝一致的憑證。
  • 將工作負載新增至階層中的裝置。
  • 使用IoT Edge API Proxy模組,從較低層裝置透過單一埠安全地路由傳送 HTTP 流量。

提示

本教學課程包含手動和自動化步驟的混合,以提供巢狀 IoT Edge 功能的展示。

如果您想要完全自動化地查看設定 IoT Edge 裝置的階層,您可以根據已編寫腳本 的 Azure IoT Edge for Industrial IoT 範例引導您自己的腳本。 此腳本案例會將 Azure 虛擬機部署為預先設定的裝置,以模擬處理站環境。

如果您想要深入瞭解如何建立和管理 IoT Edge 裝置階層的手動步驟,請參閱 IoT Edge 裝置閘道階層的作法指南。

在本教學課程中,定義了下列網路層:

  • 最上層:此層的IoT Edge裝置可以直接連線到雲端。

  • 較低層:頂層層下方層層的IoT Edge裝置無法直接連線到雲端。 他們需要經過一或多個中繼IoT Edge裝置來傳送和接收數據。

本教學課程使用兩個裝置階層來簡化。 最上層裝置代表階層最上層的裝置,可以直接連線到雲端。 此裝置稱為 父裝置。 較低 層裝置 代表階層較低層的裝置,無法直接連線到雲端。 您可以視需要新增更多裝置來代表生產環境。 較低層的裝置稱為 子裝置

教學課程階層的結構,包含兩個裝置:最上層裝置和下層裝置

注意

子裝置可以是巢狀拓撲中的下游裝置或閘道裝置。

必要條件

若要建立IoT Edge裝置的階層,您需要:

  • 使用 Azure CLI v2.3.1 搭配 Azure IoT 擴充功能 v0.10.6 或更新版本的 Azure Cloud Shell 中的 Bash 殼層。 本教學課程使用 Azure Cloud Shell。 若要查看您目前版本的 Azure CLI 模組和擴充功能,請執行 az version
  • 在 Windows 上執行適用於 Linux 的 Azure IoT Edge 的兩個 Windows 裝置。 這兩個 裝置都應該使用外部虛擬交換器來部署。

提示

如果在 Windows 主機 OS 上設定埠轉送,可以使用 內部預設 虛擬交換器。 不過,為了簡化本教學課程,這兩個 裝置都應該使用外部 虛擬交換器,並連線到相同的外部網路。

如需 netowrking 的詳細資訊,請參閱 適用於 Linux 的 Azure IoT Edge on Windows 網路Windows 上適用於 Linux 的 Azure IoT Edge 網路設定。

如果您需要在 DMZ 上設定 EFLOW 裝置,請參閱 如何在 Windows 工業 IoT 和 DMZ 設定上設定適用於 Linux 的 Azure IoT Edge。

  • 具有有效訂用帳戶的 Azure 帳戶。 如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶
  • Azure 中的免費或標準層 IoT 中樞
  • 請確定除了最低層裝置以外的所有裝置,下列埠已開啟輸入:443、5671、8883:
    • 443:在父系和子邊緣中樞之間用於 REST API 呼叫,以及提取 Docker 容器映射。
    • 5671、8883:用於AMQP和 MQTT。

提示

如需 EFLOW 虛擬機防火牆的詳細資訊,請參閱 Windows 安全性上的適用於 Linux 的 IoT Edge。

建立IoT Edge裝置階層

IoT Edge 裝置會構成階層層。 本教學課程會建立兩個IoT Edge裝置的階層: 最上層裝置較低層裝置。 您可以視需要建立更多下游裝置。

若要建立及設定 IoT Edge 裝置的階層,您可以使用 az iot edge devices create Azure CLI 命令。 命令藉由自動化和壓縮數個步驟來簡化階層的設定:

  • 在您的 IoT 中樞 中建立裝置
  • 設定父子關聯性以授權裝置之間的通訊
  • 將部署指令清單套用至每個裝置
  • 為每個裝置產生憑證鏈結,以建立它們之間的安全通訊
  • 為每個裝置產生組態檔

建立裝置組態

您可以建立一組巢狀邊緣裝置,其中包含具有一個子裝置的父裝置。 在本教學課程中,我們使用基本範例部署指令清單。 如需其他案例範例,請檢閱組 態範例範本

  1. 使用 az iot edge devices create 命令之前,您需要定義最上層和較低層裝置的部署指令清單。 將 deploymentTopLayer.json 範例檔案下載到本機計算機。

    最上層裝置部署指令清單會定義IoT Edge API Proxy模組,並宣告從較低層裝置到 IoT 中樞的路由

  2. deploymentLowerLayer.json 範例檔案下載到本機計算機。

    較低層裝置部署指令清單包含仿真的溫度感測器模組,並宣告 通往最上層裝置的路由 。 您可以在 systemModules 區段中看到運行時間模組設定為從 $upstream:443 提取,而不是 mcr.microsoft.com 下層裝置會在埠 443 上傳送 Docker 映射要求 IoT Edge API Proxy 模組,因為它無法直接從雲端提取映像。 部署到 較低層裝置的另一個模組模擬 溫度感測器 模組也會對其映像要求 $upstream:443

    如需如何建立較低層部署指令清單的詳細資訊,請參閱 連線 Azure IoT Edge 裝置來建立階層

  3. Azure Cloud Shell 中,使用 az iot edge devices create Azure CLI 命令,為階層中的每個裝置建立 IoT 中樞 和組態套件組合中的裝置。 將下列佔位元取代為適當的值:

    預留位置 描述
    <hub-name> IoT 中樞的名稱。
    <config-bundle-output-path> 您要儲存元件組合的資料夾路徑。
    <parent-device-name> 最上層父裝置識別碼名稱。
    <parent-deployment-manifest> 父裝置部署指令清單檔案。
    <parent-fqdn-or-ip> 父裝置完整功能變數名稱 (FQDN) 或 IP 位址。
    <child-device-name> 下層子裝置識別碼名稱。
    <child-deployment-manifest> 子裝置部署指令清單檔案。
    <child-fqdn-or-ip> 子裝置完整功能變數名稱 (FQDN) 或 IP 位址。
    az iot edge devices create \
       --hub-name <hub-name> \
       --output-path <config-bundle-output-path> \
       --default-edge-agent "mcr.microsoft.com/azureiotedge-agent:1.4" \
       --device id=<parent-device-name> \
          deployment=<parent-deployment-manifest> \
          hostname=<parent-fqdn-or-ip> \
       --device id=child-1 \
          parent=parent-1 \
          deployment=<child-deployment-manifest> \
          hostname=<child-fqdn-or-ip>
    

    例如,下列命令會在 IoT 中樞 中建立兩個 IoT Edge 裝置的階層。 名為 parent-1 的頂層裝置和名為 child-1* 的較低層裝置。 命令會將輸出目錄中每個裝置的組態配套儲存在 。 此命令也會產生自我簽署的測試憑證,並將其包含在組態套件組合中。 組態套件組合會使用安裝腳本在每個裝置上安裝。

    az iot edge devices create \
       --hub-name my-iot-hub \
       --output-path ./output \
       --default-edge-agent "mcr.microsoft.com/azureiotedge-agent:1.4" \
       --device id=parent-1 \
          deployment=./deploymentTopLayer.json \
          hostname=10.0.0.4 \
       --device id=child-1 \
          parent=parent-1 \
          deployment=./deploymentLowerLayer.json \
          hostname=10.1.0.4
    

執行命令之後,您可以在輸出目錄中找到裝置組態配套。 例如:

PS C:\nested-edge\output> dir

   Directory: C:\nested-edge\output

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a---           4/10/2023  4:12 PM           7192 child-1.tgz
-a---           4/10/2023  4:12 PM           6851 parent-1.tgz

您可以使用以自變數形式傳遞至命令的憑證和金鑰,或建立更複雜的裝置階層。 如需使用 az 命令建立巢狀裝置的詳細資訊,請參閱 az iot edge devices create。 如果您不熟悉網關案例中的憑證使用方式,請參閱 操作指南的憑證一節

在本教學課程中,您會使用內嵌自變數來建立裝置和組態套件組合。 您也可以使用 YAML 或 JSON 格式的組態檔。 如需範例組態檔,請參閱 範例 sample_devices_config.yaml

設定 IoT Edge 執行時間

除了布建裝置之外,組態步驟也會使用您稍早建立的憑證,在階層中的裝置之間建立信任的通訊。 這些步驟也會開始建立階層的網路結構。 最上層裝置會維護因特網連線能力,讓它從雲端提取其運行時間的映像,而較低層裝置則會透過最上層裝置路由存取這些映像。

若要設定 IoT Edge 執行時間,您必須將組態套件組合套用至您的裝置。 最上層裝置較低層裝置之間的設定不同,因此請注意您要套用至每個裝置的裝置組態檔。

每個裝置都需要其對應的組態配套。 您可以使用 USB 磁碟驅動器或 安全的檔案復本 ,將組態套件組合移至每個裝置。 您必須將組態套件組合複製到每個 EFLOW 裝置的 Windows 主機 OS,然後將它複製到 EFLOW VM。

警告

請務必將正確的組態套件組合傳送至每個裝置。

最上層裝置組態

  1. 連線 至最上層 Windows 主機裝置,並將 parent-1.tzg 檔案複製到裝置。

  2. 使用執行身分 管理員 istrator 啟動提升許可權的 PowerShell 會話。

  3. 將 parent-1.tzg 複製到 EFLOW VM。

    Copy-EflowVmFile -fromFile parent-1.tzg -toFile ~/ -pushFile
    
  4. 連線 至 EFLOW 虛擬機

    Connect-EflowVm
    
  5. 擷取組態套件組合封存。 例如,使用 tar 命令來擷取 父 1 封存盤案:

    tar -xzf ./parent-1.tgz
    
  6. 設定安裝文稿的執行許可權。

    chmod +x install.sh
    
  7. 執行 install.sh 指令碼。

    sudo sh ./install.sh
    
  8. 套用正確的憑證許可權,並重新啟動IoT Edge運行時間。

    sudo chmod -R 755 /etc/aziot/certificates/
    sudo iotedge system restart
    
  9. 檢查所有 IoT Edge 服務是否都正常執行。

    sudo iotedge system status
    
  10. 最後,新增適當的防火牆規則,以啟用較低層裝置與最上層裝置之間的連線。

    sudo iptables -A INPUT -p tcp --dport 5671 -j ACCEPT
    sudo iptables -A INPUT -p tcp --dport 8883 -j ACCEPT
    sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
    sudo iptables -A INPUT -p icmp --icmp-type 8 -s 0/0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
    sudo iptables-save | sudo tee /etc/systemd/scripts/ip4save
    
  11. 在您的裝置上執行設定和連線檢查。

    sudo iotedge check
    

最上層裝置上,預期會看到具有數個通過評估的輸出。 您可能會看到有關記錄原則的一些警告,並視您的網路、DNS 原則而定。

如果您想要進一步瞭解對裝置組態檔所做的修改,請參閱 操作指南的<在裝置上設定 IoT Edge>一節。

較低層裝置組態

  1. 連線 至較低層級的 Windows 主機裝置,並將 child-1.tzg 檔案複製到裝置。

  2. 使用執行身分 管理員 istrator 啟動提升許可權的 PowerShell 會話。

  3. 將 child-1.tzg 複製到 EFLOW VM。

    Copy-EflowVmFile -fromFile child-1.tzg -toFile ~/ -pushFile
    
  4. 連線 至您的 EFLOW 虛擬機

    Connect-EflowVm
    
  5. 擷取組態套件組合封存。 例如,使用 tar 命令來擷取 子 1 封存盤案:

    tar -xzf ./child-1.tgz
    
  6. 設定安裝文稿的執行許可權。

    chmod +x install.sh
    
  7. 執行 install.sh 指令碼。

    sudo sh ./install.sh
    
  8. 套用正確的憑證許可權,並重新啟動IoT Edge運行時間。

    sudo chmod -R 755 /etc/aziot/certificates/
    sudo iotedge system restart
    
  9. 檢查所有 IoT Edge 服務是否都正常執行。

    sudo iotedge system status
    
  10. 在您的裝置上執行設定和連線檢查。 針對較低層裝置,必須在命令中手動傳遞診斷映像:

    sudo iotedge check --diagnostics-image-name <parent_device_fqdn_or_ip>:443/azureiotedge-diagnostics:1.2
    

如果您已正確完成先前的步驟,您可以確認您的裝置已正確設定。 一旦您滿意設定在每個裝置上都正確無誤,您就可以繼續。

裝置模組部署

當您在 IoT 中樞 中建立裝置時,會套用裝置的模組部署。 az iot edge devices create 命令會針對最上層和較低層裝置套用部署 JSON 檔案。 這些部署完成後, 較低層裝置 會使用 IoT Edge API Proxy 模組來提取其必要的映像。

此外,運行時間模組 IoT Edge 代理程式和 IoT Edge 中樞最上層裝置接收 Docker 登錄模組和 IoT Edge API Proxy 模組。

Docker 登錄模組會指向現有的 Azure Container Registry。 在此情況下, REGISTRY_PROXY_REMOTEURL 指向 Microsoft Container Registry。 根據預設, Docker 登錄 會接聽埠 5000。

IoT Edge API Proxy 模組會將 HTTP 要求路由傳送至其他模組,讓較低層的裝置提取容器映像或將 Blob 推送至記憶體。 在本教學課程中,它會在埠 443 上通訊,並設定為將 Docker 容器映射提取要求路由傳送至 埠 5000 上的 Docker 登錄 模組。 此外,任何 Blob 記憶體上傳要求路由傳送至埠 11002 上的模組 AzureBlob 儲存體 onIoTEdge。 如需 IoT Edge API Proxy 模組以及如何設定的詳細資訊,請參閱模組的 作法指南

如果您想要瞭解如何透過 Azure 入口網站 或 Azure Cloud Shell 建立這類部署,請參閱操作指南的頂層裝置一節。

您可以使用 命令來檢視模組的狀態:

az iot hub module-twin show --device-id <edge-device-id> --module-id '$edgeAgent' --hub-name <iot-hub-name> --query "properties.reported.[systemModules, modules]"

此命令會輸出所有edgeAgent報告屬性。 以下是監視裝置狀態的一些實用方法:運行時間狀態運行時間開始時間、運行時間上次結束時間運行時間重新啟動計數

您也可以在 Azure 入口網站查看模組的狀態。 流覽至 IoT 中樞 的 [裝置] 區段,以查看您的裝置和模組。

檢視產生的資料

您推送的模擬溫度感測器模組會產生範例環境數據。 它會傳送訊息,包括環境溫度和濕度、機器溫度和壓力,以及時間戳。

您也可以透過 Azure Cloud Shell 檢視這些訊息:

az iot hub monitor-events -n <iot-hub-name> -d <lower-layer-device-name>

例如:

az iot hub monitor-events -n my-iot-hub -d child-1
{
    "event": {
        "origin": "child-1",
        "module": "simulatedTemperatureSensor",
        "interface": "",
        "component": "",
        "payload": "{\"machine\":{\"temperature\":104.29281270901808,\"pressure\":10.48905461241978},\"ambient\":{\"temperature\":21.086561171611102,\"humidity\":24},\"timeCreated\":\"2023-04-17T21:50:30.1082487Z\"}"
    }
}

疑難排解

iotedge check執行 命令來驗證組態,並針對錯誤進行疑難解答。

即使下游裝置沒有直接因特網存取,您也可以在巢狀階層中執行 iotedge check

當您從較低層執行 iotedge check 時,程式會嘗試透過埠 443 從父代提取影像。

sudo iotedge check --diagnostics-image-name $upstream:443/azureiotedge-diagnostics:1.2

azureiotedge-diagnostics 是從與登錄模組連結的容器登錄提取。 本教學課程預設會將 它設定為 https://mcr.microsoft.com

名稱
REGISTRY_PROXY_REMOTEURL https://mcr.microsoft.com

如果您使用私人容器登錄,請確定容器登錄中存在所有映像 (IoTEdgeAPIProxy、edgeAgent、edgeHub、Simulated Temperature Sensor 和 diagnostics)。

如果下游裝置與父裝置有不同的處理器架構,您需要適當的架構映像。 您可以使用連線的登錄,也可以為下游裝置 config.toml 檔案中的 edgeAgentedgeHub 模組指定正確的映像。 例如,如果父裝置是在 ARM32v7 架構上執行,而下游裝置是在 AMD64 架構上執行,則必須在下游裝置 config.toml 檔案中指定相符的版本和架構映射標記。

[agent.config]
image = "$upstream:443/azureiotedge-agent:1.4.10-linux-amd64"

"systemModules": {
   "edgeAgent": {
      "settings": {
            "image": "$upstream:443/azureiotedge-agent:1.4.10-linux-amd64"
      },
   },
   "edgeHub": {
      "settings": {
            "image": "$upstream:443/azureiotedge-hub:1.4.10-linux-amd64",
      }
   }
}

清除資源

您可以刪除本文中建立的本機設定和 Azure 資源,以避免產生費用。

若要刪除資源:

  1. 登入 Azure 入口網站,然後選取 [資源群組]

  2. 選取包含IoT Edge測試資源的資源群組名稱。

  3. 檢閱資源群組中包含的資源清單。 如果您想要刪除所有資源群組,您可以選取 [ 刪除資源群組]。 如果您想要只刪除其中一些資源,您可以選取每個資源來個別刪除它們。

下一步

在本教學課程中,您已將兩個 IoT Edge 裝置設定為閘道,並將其中一個設定為另一個裝置的父裝置。 然後,您已示範如何使用IoT Edge API Proxy模組,透過閘道將容器映像提取到子裝置。 如果您想要深入瞭解,請參閱 Proxy 模組的使用 作法指南。

若要深入瞭解如何使用閘道來建立IoT Edge裝置的階層式層,請參閱下列文章。