共用方式為


教學課程:建立 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 裝置的階層,請遵循已編寫指令碼的適用於工業 IoT 的 Azure IoT Edge 範例 (英文)。 此指令碼案例會將 Azure 虛擬機器部署為預先設定的裝置,以模擬工廠環境。

如果您想要深入了解用來建立和管理 IoT Edge 裝置階層的手動步驟,請參閱關於 IoT Edge 裝置閘道階層的操作指南 (部分機器翻譯)。

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

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

  • 較低層:位於最上層以下層級的 IoT Edge 裝置無法直接連線到雲端。 這些裝置需要經過一或多個中繼 IoT Edge 裝置,才能傳送和接收資料。

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

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

注意

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

必要條件

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

  • 具有網際網路連線能力的電腦 (Windows 或 Linux)。

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

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

  • 使用 Azure CLI (部分機器翻譯) 並已安裝 Azure IoT 延伸模組 (英文) 的 Azure Cloud Shell 中的 Bash 殼層。 本教學課程會使用 Azure Cloud Shell。 若要查看 Azure CLI 模組和延伸模組的目前版本,請執行 az version (部分機器翻譯)。

  • 兩個用來設定階層的 Linux 裝置。 如果沒有可用的裝置,則可以使用 IoT Edge Azure Resource Manager 範本 (英文),為階層中的每個裝置建立 Azure 虛擬機器。 此 Resource Manager 範本已預先安裝 IoT Edge 1.5 版。 如果您要在自己的裝置上安裝 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 Key Vault 之類的服務,或使用安全檔案複製等功能。 選擇最符合您案例的其中一種方法。

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

    scp ./output/parent-1.tgz admin@parent-1-vm.westus.cloudapp.azure.com:~
    
  2. 在每個裝置上,將設定套件組合封存解壓縮。 例如,使用 tar 命令來解壓縮「parent-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 上的模組 AzureBlobStorageonIoTEdge。 如需 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、模擬溫度感應器和診斷)。

如果下游裝置與父裝置有不同的處理器架構,便需要適當的架構映像。 您可以使用已連線登錄 ,也可以在下游裝置的 config.toml 檔案中為 edgeAgent 和 edgeHub 模組指定正確的映像。 例如,如果父裝置在 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 裝置的階層式層級,請參閱下列文章。