適用於:
Azure IoT Edge 1.5
重要事項
IoT Edge 1.5 LTS 是支援的版本。 自 2024 年 11 月 12 日起,IoT Edge 1.4 LTS 已結束生命週期。 如果您採用舊版,請參閱更新 IoT Edge。
跨階層式層組織的網路部署 Azure IoT Edge 節點。 階層中的每一層都是一個閘道裝置,可處理來自其下層中裝置的訊息和要求。 此設定也稱為「巢狀邊緣」。
建構裝置階層,以便只有頂層可以連線到雲端,而下層只能與相鄰的北層和南層通訊。 此網路分層是大部分產業網路的基礎,遵循 ISA-95 標準。
本教學課程示範如何使用 Windows 上的 IoT Edge for Linux 建立 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 裝置的階層,您需要:
- Azure Cloud Shell 中的 Bash 殼層,使用 Azure CLI v2.3.1 並已安裝 Azure IoT 延伸模組 v0.10.6 或更高版本。 本教學課程使用 Azure Cloud Shell。 若要檢查目前版本的 Azure CLI 模組和延伸模組,請執行 az version。
- 兩部執行 Azure IoT Edge for Linux on Windows 的 Windows 裝置。 使用 外部虛擬交換器部署這兩個裝置。
秘訣
如果在 Windows 主機作業系統上設定連接埠轉送,您可以使用 內部 或 預設 虛擬交換器。 但為了使本教程簡單,請為兩個設備使用 外部 虛擬交換機並將它們連接到同一外部網絡。
如需網路設定的詳細資訊,請參閱 Azure IoT Edge for Linux on Windows 網路和適用於 Azure IoT Edge for Linux on Windows 的網路設定。
如果您需要在 DMZ 上設定 EFLOW 裝置,請參閱如何設定 Azure IoT Edge for Linux on Windows 工業 IoT 和 DMZ 設定。
- 具有有效訂用帳戶的 Azure 帳戶。 如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶。
- 在 Azure 中擁有免費或標準層的 IoT 中樞。
- 請確定下列連接埠已針對最低層裝置以外的所有裝置開啟輸入:443、5671 和 8883:
- 443:在父代和子系邊緣中樞之間用於 REST API 呼叫,以及用來提取 Docker 容器映像。
- 5671、8883:用於 AMQP 和 MQTT。
秘訣
如需 EFLOW 虛擬機器防火牆的詳細資訊,請參閱 IoT Edge for Linux on Windows 安全性。
建立您的 IoT Edge 裝置階層
IoT Edge 裝置會構成階層的層級。 本教學課程會建立有兩個 IoT Edge 裝置的階層:「最上層裝置」和「較低層裝置」。 您可以視需要建立更多下游裝置。
為了建立及設定 IoT Edge 裝置的階層,您會使用 az iot edge devices create (部分機器翻譯) Azure CLI 命令。 此命令會自動執行並濃縮數個步驟來簡化階層的設定:
- 在 IoT 中樞內建立裝置
- 設定父子關聯性以授權裝置之間的通訊
- 將部署資訊清單套用至每個裝置
- 為每個裝置產生憑證鏈結,以在裝置之間建立安全的通訊
- 為每個裝置產生設定檔
建立裝置設定
您會建立一組巢狀邊緣裝置,其中包含具有一個子裝置的父裝置。 在本教學課程中,我們會使用基本的部署資訊清單範例。 如需其他案例的範例,請檢閱設定範例範本 (英文)。
在使用 az iot edge devices create (部分機器翻譯) 命令之前,您需要定義最上層和較低層裝置的部署資訊清單。 將 deploymentTopLayer.json (英文) 範例檔案下載到本機電腦。
最上層裝置的部署資訊清單會定義 IoT Edge API Proxy 模組 (部分機器翻譯),並宣告從較低層裝置到 IoT 中樞的路由 (部分機器翻譯)。
將 deploymentLowerLayer.json (英文) 範例檔案下載到本機電腦。
較低層裝置的部署資訊清單包含模擬的溫度感應器模組,並宣告通往最上層裝置的路由 (部分機器翻譯)。 您可以在 systemModules 區段內看到執行階段模組設定為從 $upstream:443 提取,而不是從 mcr.microsoft.com 提取。 「較低層裝置」會在連接埠 443 上傳送 Docker 映像要求給 IoT Edge API Proxy 模組,因為其無法直接從雲端提取映像。 部署到「較低層裝置」的另一個模組「模擬溫度感應器」模組也會對
$upstream:443提出其映像要求。如需如何建立較低層部署資訊清單的詳細資訊,請參閱將 Azure IoT Edge 裝置連線以建立階層 (部分機器翻譯)。
在 Azure Cloud Shell 中,使用 az iot edge devices create (部分機器翻譯) Azure CLI 命令,在 IoT 中樞內建立裝置,並為階層中的每個裝置建立設定套件組合。 將下列預留位置取代為適當值:
預留位置 描述 <集線器名稱> IoT 中樞的名稱。 <config-bundle-output-path> 您要用來儲存設定套件組合的資料夾路徑。 <父裝置名稱> 「最上層」父裝置識別碼名稱。 <父部署資訊清單> 父裝置的部署資訊清單檔。 <parent-fqdn-or-ip> 父裝置的完整網域名稱 (FQDN) 或 IP 位址。 <子裝置名稱> 「較低層」子裝置識別碼名稱。 <子部署資訊清單> 子裝置的部署資訊清單檔。 <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 執行階段,您必須將設定套件組合套用至您的裝置。 最上層裝置與較低層裝置之間的設定不同,因此請留意要套用至每個裝置的裝置設定檔。
每個裝置都需要其對應的設定套件組合。 您可以使用 USB 磁碟機或安全的檔案複製,將設定套件組合移至每個裝置。 您必須將設定套件組合複製到每個 EFLOW 裝置的 Windows 主機 OS,然後將其複製到 EFLOW VM。
警告
請務必將正確的設定套件組合傳送至每個裝置。
最上層裝置設定
連線到最上層 Windows 主機裝置,並將 parent-1.tzg 檔案複製到裝置。
使用以系統管理員身分執行,啟動已提高權限的 PowerShell 工作階段。
將 parent-1.tzg 複製到 EFLOW VM。
Copy-EflowVmFile -fromFile parent-1.tzg -toFile ~/ -pushFile連線至您的 EFLOW 虛擬機器
Connect-EflowVm將設定套件組合壓縮檔解壓縮。 例如,使用 tar 命令來解壓縮「parent-1」壓縮檔:
tar -xzf ./parent-1.tgz設定安裝指令碼的執行權限。
chmod +x install.sh執行 install.sh 指令碼。
sudo sh ./install.sh套用正確的憑證權限,並重新啟動 IoT Edge 執行階段。
sudo chmod -R 755 /etc/aziot/certificates/ sudo iotedge system restart檢查所有 IoT Edge 服務是否都正常執行。
sudo iotedge system status最後,新增適當的防火牆規則,以啟用較低層裝置與最上層裝置之間的連線。
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在您的裝置上執行設定和連線檢查。
sudo iotedge check
在「最上層裝置」上,應該會看到具有數個通過評估的輸出。 您可能會看到一些有關日誌政策的警告,以及 DNS 政策 (視您的網絡而定)。
如果您想要進一步了解對裝置的設定檔所做的修改,請參閱操作指南中設定裝置的 IoT Edge 一節。
較低層裝置設定
連線到較低層 Windows 主機裝置,並將 child-1.tzg 檔案複製到裝置。
使用以系統管理員身分執行,啟動已提高權限的 PowerShell 工作階段。
將 child-1.tzg 複製到 EFLOW VM。
Copy-EflowVmFile -fromFile child-1.tzg -toFile ~/ -pushFile連線至您的 EFLOW 虛擬機器
Connect-EflowVm將設定套件組合壓縮檔解壓縮。 例如,使用 tar 命令來解壓縮「child-1」封存檔案:
tar -xzf ./child-1.tgz設定安裝指令碼的執行權限。
chmod +x install.sh執行 install.sh 指令碼。
sudo sh ./install.sh套用正確的憑證權限,並重新啟動 IoT Edge 執行階段。
sudo chmod -R 755 /etc/aziot/certificates/ sudo iotedge system restart檢查所有 IoT Edge 服務是否都正常執行。
sudo iotedge system status在您的裝置上執行設定和連線檢查。 針對較低層裝置,必須在命令中手動傳遞診斷映像:
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 上的模組 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 從父代提取映像。
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、模擬溫度感應器和診斷) 都在容器登錄中。
如果下游裝置的處理器架構與父裝置不同,請使用適當的架構映像。 使用連線的註冊表,或在下游裝置的 config.toml 檔案中指定 edgeAgent 和 edgeHub 模組的正確映像。 例如,如果父裝置在 ARM32v7 架構上執行,而下游裝置在 AMD64 架構上執行,請在下游裝置 config.toml 檔案中指定相符的版本和架構映像標籤。
[agent.config]
image = "$upstream:443/azureiotedge-agent:1.5.15-linux-amd64"
"systemModules": {
"edgeAgent": {
"settings": {
"image": "$upstream:443/azureiotedge-agent:1.5.15-linux-amd64"
},
},
"edgeHub": {
"settings": {
"image": "$upstream:443/azureiotedge-hub:1.5.15-linux-amd64",
}
}
}
清除資源
您可以刪除您在本文中建立的本機設定和 Azure 資源,以避免產生費用。
若要刪除資源:
登入 Azure 入口網站,然後選取 [資源群組]。
選取您的 IoT Edge 測試資源所屬的資源群組名稱。
檢閱您的資源群組中包含的資源清單。 若要將其全部刪除,您可以選取 [刪除資源群組]。 如果只想刪除某些部分,則可以選取各個資源以將其個別刪除。
後續步驟
在本教學課程中,您已將兩個 IoT Edge 裝置設定為閘道,並將其中之一設為另一個的父裝置。 然後,您嘗試使用 IoT Edge API Proxy 模組,透過閘道將容器映像提取到子裝置上。 如果您想要深入了解,請參閱關於 Proxy 模組使用方式的操作指南 (部分機器翻譯)。
若要深入了解如何使用閘道來建立 IoT Edge 裝置的階層式層級,請參閱下列文章。