教學課程:使用 IoT Edge for Linux on Windows 建立 IoT Edge 裝置的階層
適用於: IoT Edge 1.5 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 for Linux on Windows 建立 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 主機 OS 上已設定連接埠轉送,可以使用內部或預設虛擬交換器。 但為了簡化本教學課程,這兩個裝置都應該使用外部虛擬交換器,並連線到相同的外部網路。
如需網路功能的詳細資訊,請參閱 適用於Linux的 Azure IoT Edge on Windows 網路 和 Windows 上適用於Linux的 Azure IoT Edge 網路設定。
如果您需要在 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 中樞內建立裝置,並為階層中的每個裝置建立設定套件組合。 將下列預留位置取代為適當值:
預留位置 描述 <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。
警告
請務必將正確的設定套件組合傳送至每個裝置。
最上層裝置設定
連線到最上層 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.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 資源,以避免產生費用。
若要刪除資源:
登入 Azure 入口網站,然後選取 [資源群組]。
選取您的 IoT Edge 測試資源所屬的資源群組名稱。
檢閱您的資源群組中包含的資源清單。 若要將其全部刪除,您可以選取 [刪除資源群組]。 如果只想刪除某些部分,則可以選取各個資源以將其個別刪除。
下一步
在本教學課程中,您已將兩個 IoT Edge 裝置設定為閘道,並將其中之一設為另一個的父裝置。 然後,您嘗試使用 IoT Edge API Proxy 模組,透過閘道將容器映像提取到子裝置上。 如果您想要深入了解,請參閱關於 Proxy 模組使用方式的操作指南 (部分機器翻譯)。
若要深入了解如何使用閘道來建立 IoT Edge 裝置的階層式層級,請參閱下列文章。