教學課程:建立 IoT Edge 裝置的階層架構

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

重要

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

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

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

本教學課程將逐步引導您建立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裝置的階層,您需要:

  • 具有因特網連線的電腦(Windows 或 Linux)。

  • 具有有效訂用帳戶的 Azure 帳戶。 如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶

  • Azure 中的免費或標準層 IoT 中樞

  • 在 Azure Cloud Shell 中使用 Azure CLI 安裝 Azure IoT 擴充功能的 Bash 殼層。 本教學課程使用 Azure Cloud Shell。 若要查看您目前版本的 Azure CLI 模組和擴充功能,請執行 az version

  • 要設定階層的兩個 Linux 裝置。 如果您沒有可用的裝置,您可以使用IoT Edge Azure Resource Manager 範本,為階層中的每個裝置建立 Azure 虛擬機。 IoT Edge 1.5 版已預安裝此 Resource Manager 範本。 如果您要在自己的裝置上安裝IoT Edge,請參閱 安裝適用於Linux 的 Azure IoT Edge 或 更新IoT Edge

  • 為了簡化裝置之間的網路通訊,虛擬機應該位於相同的虛擬網路上,或使用虛擬網路對等互連。

  • 請確定除了最低層裝置以外的所有裝置,下列埠已開啟輸入:443、5671、8883:

    • 443:在父系和子邊緣中樞之間用於 REST API 呼叫,以及提取 Docker 容器映射。
    • 5671、8883:用於AMQP和 MQTT。

    如需詳細資訊,請參閱如何使用 Azure 入口網站 開啟虛擬機的埠。

    提示

    您可以在後續步驟中使用 SSH 句柄和每個虛擬機的 FQDN 或 IP 位址進行設定,因此請追蹤此資訊。 您可以在 Azure 入口網站 上找到IP位址和 FQDN。 針對IP位址,流覽至您的虛擬機清單,並記下 [公用IP位址] 字段。 針對 FQDN,移至每個虛擬機的概 頁面,並尋找 [DNS 名稱 ] 字段。 針對 SSH 句柄,請移至每個虛擬機的 連線 頁面。

建立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.5" \
       --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.5" \
       --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 執行時間,您必須將組態套件組合套用至您的裝置。 最上層裝置較低層裝置之間的設定不同,因此請注意您要套用至每個裝置的裝置組態檔。

  1. 將每個組態套件組合封存盤案複製到其對應的裝置。 您可以使用 USB 磁碟驅動器、Azure 金鑰保存庫 等服務,或搭配安全檔案複製等函式。 選擇最符合您案例的其中一種方法。

    例如,若要將 parent-1 組態套件組合傳送至父 1 VM 上的主目錄,您可以使用類似下列範例的命令:

    scp ./output/parent-1.tgz admin@parent-1-vm.westus.cloudapp.azure.com:~
    
  2. 在每個裝置上,擷取組態套件組合封存。 例如,使用 tar 命令來擷取 父 1 封存盤案:

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

    chmod +x install.sh
    
  4. 在每個裝置上,使用根許可權將組態組合套用至裝置:

    sudo ./install.sh
    

    安裝組態套件組合會更新裝置上的 config.toml 檔案,並自動重新啟動所有 IoT Edge 服務

    如果您想要進一步瞭解對裝置組態檔所做的修改,請參閱一起 連線 Azure IoT Edge 裝置來建立階層

若要確認您的裝置已正確設定,請在您的裝置上執行設定和連線檢查。

sudo iotedge check
admin@child-1-vm:~$ sudo iotedge check

Configuration checks (aziot-identity-service)
---------------------------------------------
√ keyd configuration is well-formed - OK
√ certd configuration is well-formed - OK
√ tpmd configuration is well-formed - OK
√ identityd configuration is well-formed - OK
√ daemon configurations up-to-date with config.toml - OK
√ identityd config toml file specifies a valid hostname - OK
√ host time is close to reference time - OK
√ preloaded certificates are valid - OK
√ keyd is running - OK
√ certd is running - OK
√ identityd is running - OK
√ read all preloaded certificates from the Certificates Service - OK
√ read all preloaded key pairs from the Keys Service - OK
√ check all EST server URLs utilize HTTPS - OK
√ ensure all preloaded certificates match preloaded private keys with the same ID - OK

Connectivity checks (aziot-identity-service)
--------------------------------------------
√ host can connect to and perform TLS handshake with iothub AMQP port - OK
√ host can connect to and perform TLS handshake with iothub HTTPS / WebSockets port - OK
√ host can connect to and perform TLS handshake with iothub MQTT port - OK

Configuration checks
--------------------
√ aziot-edged configuration is well-formed - OK
√ configuration up-to-date with config.toml - OK
√ container engine is installed and functional - OK
√ configuration has correct parent_hostname - OK
√ configuration has correct URIs for daemon mgmt endpoint - OK
√ container time is close to host time - OK
‼ DNS server - Warning
    Container engine is not configured with DNS server setting, which may impact connectivity to IoT Hub.
    Please see https://aka.ms/iotedge-prod-checklist-dns for best practices.
    You can ignore this warning if you are setting DNS server per module in the Edge deployment.
‼ production readiness: logs policy - Warning
    Container engine is not configured to rotate module logs which may cause it run out of disk space.
    Please see https://aka.ms/iotedge-prod-checklist-logs for best practices.
    You can ignore this warning if you are setting log policy per module in the Edge deployment.
‼ production readiness: Edge Agent's storage directory is persisted on the host filesystem - Warning
    The edgeAgent module is not configured to persist its /tmp/edgeAgent directory on the host filesystem.
    Data might be lost if the module is deleted or updated.
    Please see https://aka.ms/iotedge-storage-host for best practices.
‼ production readiness: Edge Hub's storage directory is persisted on the host filesystem - Warning
    The edgeHub module is not configured to persist its /tmp/edgeHub directory on the host filesystem.
    Data might be lost if the module is deleted or updated.
    Please see https://aka.ms/iotedge-storage-host for best practices.
√ Agent image is valid and can be pulled from upstream - OK
√ proxy settings are consistent in aziot-edged, aziot-identityd, moby daemon and config.toml - OK

Connectivity checks
-------------------
√ container on the default network can connect to upstream AMQP port - OK
√ container on the default network can connect to upstream HTTPS / WebSockets port - OK
√ container on the IoT Edge module network can connect to upstream AMQP port - OK
√ container on the IoT Edge module network can connect to upstream HTTPS / WebSockets port - OK
30 check(s) succeeded.
4 check(s) raised warnings. Re-run with --verbose for more details.
2 check(s) were skipped due to errors from other checks. Re-run with --verbose for more details.

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

裝置模組部署

當您在 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 從父代提取影像。

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.5.0-linux-amd64"

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

清除資源

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

若要刪除資源:

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

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

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

下一步

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

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