Share via


準備在生產環境中部署 IoT Edge 解決方案

適用於:yes 圖示IoT Edge 1.1

重要

IoT Edge 1.1終止支援日期為 2022 年 12 月 13 日。 如需此產品、服務、技術或 API 的支援資訊,請參閱 Microsoft 產品生命週期。 如需更新至最新版本IoT Edge的詳細資訊,請參閱更新IoT Edge

當您準備將 IoT Edge 解決方案從開發層面轉移到生產環境時,請確保其設定可以提供持續性效能。

本文提供的資訊並非完全相同。 為了協助您設定優先權,每個區段都會以清單開始,並將工作分成兩個部分:生產前需完成的重要事項,或是您需要知道的實用事項。

裝置設定

IoT Edge 裝置可以是任何項目,包括 Raspberry Pi、膝上型電腦或伺服器上執行的虛擬機器。 您可以實際或透過虛擬連線存取裝置,或者裝置可能長時間受到隔離。 無論是哪種方式,您都想確保其設定為能妥善執行。

  • 重要

    • 安裝生產憑證
    • 研擬裝置管理計畫
    • 使用 Moby 作為容器引擎
  • 實用

    • 選擇上游通訊協定

安裝生產憑證

生產環境中的每個 IoT Edge 裝置都要安裝裝置憑證授權單位 (CA) 的憑證。 該 CA 憑證接著會在 config 檔案的 IoT Edge 執行階段中宣告。 對於開發和測試的實務案例,如果 config 檔案中未宣告任何的憑證,則 IoT Edge 執行階段會建立暫時的憑證。 不過,這些暫時憑證三個月後就會過期,而且對於生產情節並不安全。 針對生產的實務案例,您應該提供您自己的裝置 CA 憑證 (從自我簽署的憑證授權單位中,或向商業憑證授權單位購買)。

注意

目前,由於 libiothsm 中的限制,無法使用在 2038 年 1 月 1 日或之後到期的憑證。

若要了解裝置 CA 憑證的角色,請參閱 Azure IoT Edge 如何使用憑證

如需如何在 IoT Edge 裝置上安裝憑證,以及從 config 檔中參考它們的相關資訊,請參閱管理 IoT Edge 裝置上的憑證

研擬裝置管理計畫

在生產環境中設置任何裝置前,應先了解如何管理未來的更新作業。 若是 IoT Edge 裝置,要更新的元件清單可能包含:

  • 裝置韌體
  • 作業系統程式庫
  • 容器引擎,例如 Moby
  • IoT Edge
  • CA 憑證

Device Update for IoT Hub (Preview) 是一項服務,其可讓您為 IoT 裝置部署無線更新 (OTA)。

更新 IoT Edge 的替代方法需要實際存取或透過 SSH 存取 IoT Edge 裝置。 如需詳細資訊,請參閱更新 IoT Edge 執行階段。 若要更新多個裝置,請考慮將更新步驟新增至指令碼中,或是使用 Ansible 等自動化工具。

使用 Moby 作為容器引擎

容器引擎是所有 IoT Edge 裝置的先決條件。 生產環境僅支援 Moby 引擎。 Docker 等其他容器引擎可搭配 IoT Edge 使用,也可以使用這些引擎進行開發。 搭配 Azure IoT Edge 使用時可重新分配 Moby 引擎,而且 Microsoft 可提供此引擎的相關服務。

選擇上游通訊協定

您可以為 IoT Edge 代理程式和 IoT Edge 中樞設定 IoT 中樞上游通訊用的通訊協定 (其可確定所使用的連接埠)。 預設的通訊協定是 AMQP,但您可以根據網路設定變更。

這兩個執行階段模組都有 UpstreamProtocol 環境變數。 有效的變數值為:

  • MQTT
  • AMQP
  • MQTTWS
  • AMQPWS

為裝置本身 config 檔案中的 IoT Edge 代理程式,設定 UpstreamProtocol 變數。 舉例來說,如果您的 IoT Edge 裝置位於封鎖 AMQP 連接埠的 Proxy 伺服器後方,可能需要設定 IoT Edge 代理程式,使用透過 WebSocket 的 AMQP (AMQPWS),建立 IoT 中樞的初始連線。

一旦您的 IoT Edge 裝置連線,請務必在未來的部署中繼續設定這兩個執行階段模組的 UpstreamProtocol 變數。 設定 IoT Edge 裝置以透過 Proxy 伺服器進行通訊中提供此程序的範例。

部署

  • 實用
    • 與上游的通訊協定一致
    • 為系統模組設定主機儲存體
    • 減少 IoT Edge 中樞所使用的記憶體空間
    • 在部署資訊清單中使用正確的模組映像
    • 使用自訂模組時請注意對應項大小的限制
    • 設定如何套用模組的更新

與上游的通訊協定一致

如果您已在 IoT Edge 裝置上設定 IoT Edge 代理程式,使用預設 AMQP 以外的其他通訊協定,就應在所有後續部署中宣告相同通訊協定。 舉例來說,如果您的 IoT Edge 裝置位於封鎖 AMQP 連接埠的 Proxy 伺服器後方,可能是設定該裝置透過 WebSocket (AMQPWS) 使用 AMQP 連線。 將模組部署到裝置時,請為 IoT Edge 代理程式和 IoT Edge 中樞設定相同 AMQPWS 通訊協定,否則預設 AMQP 會覆寫此設定,並阻止您再次連線。

您只需要為 IoT Edge 代理程式和 IoT Edge 中樞模組設定 UpstreamProtocol 環境變數。 任何其他模組會採用執行階段模組中設定的任何通訊協定。

設定 IoT Edge 裝置以透過 Proxy 伺服器進行通訊中提供此程序的範例。

為系統模組設定主機儲存體

IoT Edge 中樞和代理程式模組會使用本機儲存體來維護狀態,並啟用模組、裝置和雲端之間的傳訊。 為了提升可靠性和效能,請將系統模組設定為使用主機檔案系統上的儲存體。

如需相關資訊,請參閱系統模組的主機儲存體

減少 IoT Edge 中樞使用的記憶體空間

如果您正在以有限的可用記憶體,部署限制裝置,可以將 IoT Edge 中樞設定為以更少容量執行,並減少使用的磁碟空間。 但這些設定確實會限制 IoT Edge 中樞的效能,所以請找到適用於您解決方案的最佳平衡。

請勿在受限裝置上進行效能最佳化

依預設,IoT Edge 中樞已針對效能進行最佳化,因此它會嘗試配置大量的記憶體。 這項設定會在 Raspberry Pi 等小型裝置上造成穩定性問題。 如果您正在部署資源有限的裝置,則您可能想要在 Edge 中樞上將 OptimizeForPerformance 環境變數設為 false

OptimizeForPerformance 設定為 true時,MQTT 通訊協定前端會使用 PooledByteBufferAllocator,其效能更好,但會配置更多記憶體。 配置器無法在 32 位的作業系統或記憶體不足的裝置上妥善地運作。 此外,當針對效能優化時,RocksDb 會為其角色配置更多記憶體作為本機儲存體提供者。

如需詳細資訊,請參閱小型裝置上的穩定性問題

停用未使用的通訊協定

最佳化 IoT Edge 中樞效能並減少其記憶體使用量的另一種方法是,針對解決方案中未使用的任何通訊協定關閉通訊協定標頭 (protocol head)。

通訊協定標頭的設定方式是針對您部署資訊清單中的 IoT Edge 中樞模組,設定布林環境變數設定。 這三個變數分別是:

  • amqpSettings__enabled
  • mqttSettings__enabled
  • httpSettings__enabled

這三個變數都有兩條底線,而且可以設為 true 或 false。

減少訊息的儲存時間

如果訊息因故無法傳遞到 IoT 中樞,則 IoT Edge 中樞模組會暫時儲存訊息。 在未傳遞訊息過期之前,您可以設定 IoT Edge 中樞保留訊息的時間。 如果您的裝置記憶體有問題,可以減少 IoT Edge 中樞模組對應項中的 timeToLiveSecs 值。

timeToLiveSecs 參數的預設值是 7200 秒,也就是兩小時。

在部署資訊清單中使用正確的模組映像

如果使用空白或錯誤的模組映像,則 Edge 代理程式會重試載入映像,這會導致額外流量的產生。 將正確的映像新增至部署資訊清單中,以避免產生不必要的流量。

請勿使用模組映像的偵錯版本

從測試情節轉移至生產環境情節時,請務必移除部署資訊清單中的偵錯設定。 檢查部署資訊清單中的模組映像是否都沒有 .debug 尾碼。 如果您已新增建立選項,以公開模組中的連接埠進行偵錯時,也請移除這些建立選項。

使用自訂模組時請注意對應項大小的限制

包含自訂模組的部署資訊清單是 EdgeAgent 對應項的一部分。 請檢閱模組對應項大小的限制

如果您部署了大量的模組,則可能會耗用掉此對應項大小的限制量。 請考慮使用一些對此硬式限制的常見緩解措施:

  • 將任何組態儲存在自訂模組對應項中,這會有它自己的限制。
  • 儲存指向非空間有限位置 (即 blob 存放區) 的一些組態。

容器管理

  • 重要
    • 使用標籤來管理版本
    • 管理磁碟區
  • 實用
    • 在您的私人登錄中儲存執行時間容器
    • 設定映像記憶體回收

使用標籤來管理版本

標籤是 Docker 概念,可用來區別 Docker 容器版本。 標籤是類似 1.1 的尾碼,位於容器存放庫的末端。 例如,mcr.microsoft.com/azureiotedge-agent:1.1。 標籤可以變動,而且可以隨時更改並指向另一個容器,因此當您更新模組映像時,您的團隊應同意要遵循的慣例。

標籤也可協助您強制更新 IoT Edge 裝置。 當您將更新版模組推送至容器登錄時,請以遞增方式處理標記。 接著,將新部署和遞增的標籤一併推送到您的裝置。 容器引擎會將遞增的標籤辨識為新版本,並將最新的模組版本向下提取至您的裝置。

IoT Edge 執行階段的標籤

IoT Edge 代理程式和 IoT Edge 中樞映像會標示與其相關聯的 IoT Edge 版本。 標記可透過兩種不同的使用方式用於執行階段映像上:

  • 累積標記 - 僅使用版本號碼的前兩個值來取得符合這些數字的最新映像。 例如,有新版本指向最新的 1.1.x 版時,就會更新 1.1。 如果 IoT Edge 裝置的容器執行階段重新提取映像,執行階段模組就會更新為最新版本。 從 Azure 入口網站執行的部署預設為累積標記。 進行開發時建議使用此方法。

  • 特定標記 - 版本號碼的三個值全都會使用,以明確設定映像版本。 例如,1.1.0 在其初始版本後不會變更。 當您準備好要更新時,您可以在部署資訊清單中宣告新的版本號碼。 建議將此方法用於生產用途。

管理磁碟區

IoT Edge 不會移除連結至模組容器的磁碟區。 此行為是根據設計,因為其允許跨容器執行個體保存資料,例如升級案例。 不過,如果這些磁碟區未使用,可能會導致磁碟空間耗盡和後續的系統錯誤。 如果您在案例中使用 Docker 磁碟區,建議您使用 Docker 磁碟區剪除Docker 磁碟區 rm 等 Docker 工具,以移除未使用的磁碟區,特別是針對生產案例。

在您的私人登錄中儲存執行時間容器

您知道如何在私人 Azure 登錄中儲存自訂程式碼模組的容器映射,但您也可以使用它來儲存公用容器映射,例如 edgeAgentedgeHub 執行時間模組。 如果您有非常嚴格的防火牆限制 (如同這些執行階段容器會儲存在 Microsoft Container Registry (MCR) 中),則可能需要這麼做。

下列步驟說明如何將 edgeAgentedgeHub 的 Docker 映射提取到本機電腦、重新標記、將它推送至私人登錄,然後更新組態檔,讓您的裝置知道從私人登錄提取映射。

  1. 從 Microsoft 登錄提取 edgeAgent Docker 映射。 視需要更新版本號碼。

    # Pull edgeAgent image
    docker pull mcr.microsoft.com/azureiotedge-agent:1.1
    
    # Pull edgeHub image
    docker pull mcr.microsoft.com/azureiotedge-hub:1.1
    
  2. 列出您的所有 Docker 映射、尋找 edgeAgentedgeHub 映射,然後複製其映射識別碼。

    docker images
    
  3. 重新標記 您的 edgeAgentedgeHub 映射。 將括弧中的值取代為您自己的值。

    # Retag your edgeAgent image
    docker tag <my-image-id> <registry-name/server>/azureiotedge-agent:1.1
    
    # Retag your edgeHub image
    docker tag <my-image-id> <registry-name/server>/azureiotedge-hub:1.1
    
  4. edgeAgentedgeHub 映射推送至私人登錄。 將括弧中的值取代為您自己的值。

    # Push your edgeAgent image to your private registry
    docker push <registry-name/server>/azureiotedge-agent:1.1
    
    # Push your edgeHub image to your private registry
    docker push <registry-name/server>/azureiotedge-hub:1.1
    
  5. 更新edgeAgentedgeHub系統模組之 deployment.template.json檔案中的映射參考,方法是將 取代 mcr.microsoft.com 為這兩個模組的您自己的 「registry-name/server」。

  6. 在IoT Edge裝置上開啟文字編輯器,以變更組態檔,讓它知道您的私人登錄映射。

    sudo nano /etc/aziot/config.toml
    
  7. 在文字編輯器中,于 下 [agent.config] 變更您的影像值。 將括弧中的值取代為您自己的值。

    [agent.config]
    image = "<registry-name/server>/azureiotedge-agent:1.1"
    
  8. 如果您的私人登錄需要驗證,請在 中 [agent.config.auth] 設定驗證參數。

    [agent.config.auth]
    serveraddress = "<login-server>" # Almost always equivalent to <registry-name/server>
    username = "<username>"
    password = "<password>"
    
  9. 儲存變更並結束文字編輯器。

  10. 套用IoT Edge設定變更。

    sudo iotedge config apply
    

    您的IoT Edge執行時間重新開機。

如需詳細資訊,請參閱

網路功能

  • 實用
    • 檢閱輸出/輸入設定
    • 允許來自 IoT Edge 裝置的連線
    • 設定 Proxy 通訊

檢閱輸出/輸入設定

Azure IoT 中樞和 IoT Edge 之間的通訊通道一律會設定為輸出。 在大部分的 IoT Edge 情節下,必要的連線只有三個。 容器引擎必須和容納模組映像的容器登錄連線。 IoT Edge 執行階段需要和 IoT 中樞連線才能擷取裝置組態資訊,以及傳送訊息和遙測。 而如果您使用自動佈建,IoT Edge 精靈必須連接到裝置佈建服務。 如需詳細資訊,請參閱防火牆和連接埠組態規則

允許來自 IoT Edge 裝置的連線

如果您的網路設定要求您明確允許來自 IoT Edge 裝置的連線,請檢閱下列 IoT Edge 元件清單:

  • IoT Edge 代理程式可能會透過 WebSockets 持續以 AMQP/MQTT 連線方式連線到 IoT 中樞。
  • IoT Edge 中樞可能會透過 WebSockets 持續以 AMQP 連線或多種 MQTT 連線方式連線到 IoT 中樞。
  • IoT Edge 服務會對 IoT 中樞進行 HTTPS 間歇性呼叫。

在這三種情況下,完整網域名稱 (FQDN) 會符合模式 \*.azure-devices.net

此外,容器引擎會透過 HTTPS 呼叫容器登錄。 若要擷取 IoT Edge 執行階段容器映像,則 FQDN 為 mcr.microsoft.com。 容器引擎會依部署中的設定,連線到其他登錄。

此檢查清單是防火牆規則的起始點:

FQDN (* = 萬用字元) 輸出 TCP 連接埠 使用方式
mcr.microsoft.com 443 Microsoft 容器登錄
*.data.mcr.microsoft.com 443 提供內容傳遞的資料端點
*.cdn.azcr.io 443 將模組從 Marketplace 部署到裝置
global.azure-devices-provisioning.net 443 裝置佈建服務存取權 (選擇性)
*.azurecr.io 443 個人和協力廠商容器登錄
*.blob.core.windows.net 443 從 Blob 儲存體下載 Azure Container Registry 映像差異
*.azure-devices.net 5671, 8883, 4431 IoT 中樞存取
*.docker.io 443 Docker 中樞存取權 (選擇性)

1開放連接埠 8883 適用於安全的 MQTT,或連接埠 5671 適用於安全的 AMQP。 如果您只能透過埠 443 進行連線,則可以透過 WebSocket 通道來執行其中一種通訊協定。

由於 IoT 中樞的 IP 位址可以變更而不通知,因此一律會針對允許清單設定使用 FQDN。 若要進一步了解,請參閱了解 IoT 中樞的 IP 位址

其中有些防火牆規則是繼承自 Azure Container Registry。 如需相關資訊,請參閱設定存取防火牆後面的 Azure 容器登錄的規則

您可以在 Azure Container Registry 中啟用專用的資料端點,以避免使用 *.blob.core.windows.net FQDN 的萬用字元允許清單。 如需詳細資訊,請參閱啟用專用的資料端點

注意

為了在 REST 和資料端點之間提供一致的 FQDN,從 2020 年 6 月 15 日開始,Microsoft Container Registry 資料端點會從 *.cdn.mscr.io 變更為 *.data.mcr.microsoft.com
如需詳細資訊,請參閱 Microsoft Container Registry 用戶端防火牆規則設定

如果您不想將防火牆設定為允許存取公用容器登錄,則可以將映像儲存在私人容器登錄中,如在私人登錄中儲存執行階段容器中所述。

設定 Proxy 通訊

如果要在使用 Proxy 伺服器的網路上部署您的裝置,裝置必須能夠透過 Proxy 通訊,以便觸達 IoT 中樞和容器登錄。 如需詳細資訊,請參閱設定 IoT Edge 裝置以透過 Proxy 伺服器進行通訊

解決方案管理

  • 實用
    • 設定記錄與診斷
    • 設定預設的記錄驅動程式
    • 請考量測試和 CI/CD 管線

設定記錄與診斷

在 Linux 上,IoT Edge 精靈會將日誌當作預設記錄驅動程式。 您可以使用命令列工具 journalctl 查詢精靈記錄。

在 Windows 中,IoT Edge 精靈會使用 PowerShell 診斷。 使用 Get-IoTEdgeLog 查詢精靈記錄。 IoT Edge 模組會使用 JSON 驅動程式進行記錄,此為預設值。

. {Invoke-WebRequest -useb aka.ms/iotedge-win} | Invoke-Expression; Get-IoTEdgeLog

正在測試 IoT Edge 部署時,通常可以存取您的裝置來擷取記錄並進行疑難排解。 在部署情節中,可能不提供該選項。 請考慮要如何收集生產環境中的裝置相關資訊。 其中一個選項是使用能夠收集其他模組資訊,並將資訊傳送至雲端的記錄模組。 其中一個記錄模組範例是 logspout loganalytics,您也可以設計自己的專用模組。

設定預設的記錄驅動程式

依預設,Moby 容器引擎不會設定容器記錄大小限制。 經過一段時間之後,這可能會導致裝置充滿記錄,並用盡磁碟空間。 將您的容器引擎設定為使用local記錄驅動程式作為您的記錄機制。 Local 記錄驅動程式會提供預設的記錄大小限制、依預設執行記錄輪換,並使用更有效率的檔案格式來協助防止磁碟空間耗盡。 您也可以選擇使用不同的記錄驅動程式,並根據需求來設定不同的大小限制。

選項:為所有容器模組設定預設的記錄驅動程式

您可以將 log driver 的值設定為 daemon.json 中的記錄驅動程式名稱,來將您的容器引擎設定為使用特定的記錄驅動程式。 下列範例會將預設的記錄驅動程式設定為 local 記錄驅動程式 (建議)。

{
    "log-driver": "local"
}

您也可以將您的 log-opts 索引鍵設定為使用 daemon.json 檔案中的適當值。 下列範例會將記錄檔驅動程式設定為 local,並設定 max-sizemax-file 選項。

{
    "log-driver": "local",
    "log-opts": {
        "max-size": "10m",
        "max-file": "3"
    }
}

將此資訊新增 (或附加) 至名為 daemon.json 的檔案,並將其放在下列位置中:

平台 位置
Linux /etc/docker/
Windows C:\ProgramData\iotedge-moby\config\

必須重新啟動容器引擎,變更才會生效。

選項:調整每個容器模組的記錄設定

您可以在每個模組的 createOptions 中執行此動作。 例如:

"createOptions": {
    "HostConfig": {
        "LogConfig": {
            "Type": "local",
            "Config": {
                "max-size": "10m",
                "max-file": "3"
            }
        }
    }
}

Linux 系統上的其他選項

  • journald 設定為預設的記錄驅動程式,以設定容器引擎來將記錄傳送至 systemd日誌

  • 安裝 logrotate 工具,以定期從您的裝置中移除舊的記錄。 使用下列檔案規格:

    /var/lib/docker/containers/*/*-json.log{
         copytruncate
         daily
         rotate7
         delaycompress
         compress
         notifempty
         missingok
    }
    

請考量測試和 CI/CD 管線

若要提高 IoT Edge 部署情節的效率,請考量將您的生產環境部署整合至您的測試和 CI/CD 管線。 Azure IoT Edge 支援 Azure DevOps 等多個 CI/CD 平台。 如需詳細資訊,請參閱 Azure IoT Edge 的持續整合與持續部署

安全性考量

  • 重要
    • 管理您的容器登錄存取權
    • 限制容器對主機資源的存取

管理您的容器登錄存取權

將模組部署到生產 IoT Edge 裝置之前,請務必控管容器登錄的存取權,避免他人存取或變更您的容器映像。 使用私人容器登錄來管理容器映像。

在教學課程和其他說明文件中,我們會指示您在 IoT Edge 裝置使用與開發電腦上所用相同的容器登錄認證。 這些指示僅協助您更輕鬆地設定測試和開發環境,在生產情節中不應遵照這些指示。

如需更安全的登錄存取權,您可以選擇驗證選項。 一個熱門且建議的驗證方式是使用非常適合應用程式或服務的 Active Directory 服務主體,以自動或無人值守(無頭)的方式來提取容器映像,如同 IoT Edge 裝置那樣。 另一個選項是使用以存放庫為範圍的權杖,這可讓您建立只存在於建立它們的 Azure Container Registry 中的長期或短期的識別,以及將存取的範圍限制到存放庫的層級。

若要建立服務主體,請執行兩個指令碼,如建立服務主體中所述。 這些指令碼會執行下列工作:

  • 第一個指令碼會建立服務主體。 它會輸出服務主體 ID 和服務主體密碼。 將這些值安全地儲存在您的記錄中。

  • 第二個指令碼會建立角色指派來授與服務主體,以便後續視需要來加以執行。 建議對 參數套用 acrPullrole 使用者角色。 如需角色的清單,請參閱 Azure Container Registry 角色和權限

若要使用服務主體進行驗證,請提供您從第一個指令碼取得的服務主體 ID 和密碼。 在部署資訊清單中指定這些認證。

  • 針對使用者名稱或用戶端 ID,指定服務主體 ID。

  • 針對密碼或用戶端密碼,指定服務主體密碼。


若要建立以存放庫為範圍的權杖,請遵循建立以存放庫為範圍的權杖

若要使用以存放庫為範圍的權杖進行驗證,請提供您在建立以存放庫為範圍的權杖之後取得的權杖名稱和密碼。 在部署資訊清單中指定這些認證。

  • 針對使用者名稱,指定權杖的使用者名稱。

  • 針對密碼,指定其中一個權杖的密碼。

注意

在實作增強式安全性驗證之後,請停用管理員使用者設定,讓預設的使用者名稱/密碼存取不再可用。 在 Azure 入口網站的容器登錄中,從左窗格功能表的 [設定] 底下,選取 [存取金鑰]。

限制容器對主機資源的存取

若要在模組之間平衡共用的主機資源,建議您限制每個模組的資源耗用量。 這些限制可確保一個模組不會耗用太多的記憶體或 CPU 使用量,並防止其他程序在裝置上執行。 IoT Edge 平台依預設不會限制模組的資源,因為知道指定模組需要以最佳方式來執行多少資源需要測試。

Docker 提供一些限制,可讓您用來限制記憶體和 CPU 使用量等資源。 如需詳細資訊,請參閱記憶體、CPU 和 GPU 的執行階段選項

您可以使用部署資訊清單中的建立選項,來將這些限制套用至個別模組。 如需詳細資訊,請參閱如何設定 IoT Edge 模組的容器建立選項

下一步