Руководство. Развертывание подключенного реестра во вложенной иерархии IoT Edge

В этом руководстве показано, как с помощью команд Azure CLI создать двухуровневую иерархию устройств Azure IoT Edge и развернуть подключенный реестр в качестве модуля на каждом уровне. В этом сценарии устройство на верхнем уровне обменивается данными с облачным реестром. Устройство на нижнем уровне обменивается данными с родительским подключенным реестром на верхнем уровне.

Общие сведения об использовании подключенного реестра с IoT Edge см. в статье Использование подключенного реестра с Azure IoT Edge.

Предварительные требования

  • Используйте среду Bash в Azure Cloud Shell. Дополнительные сведения см. в статье Краткое руководство по Bash в Azure Cloud Shell.

  • Если вы предпочитаете выполнять справочные команды CLI локально, установите Azure CLI. Если вы работаете в Windows или macOS, Azure CLI можно запустить в контейнере Docker. Дополнительные сведения см. в разделе Запуск Azure CLI в контейнере Docker.

    • Если вы используете локальную установку, выполните вход в Azure CLI с помощью команды az login. Чтобы выполнить аутентификацию, следуйте инструкциям в окне терминала. Сведения о других возможностях, доступных при входе, приведены в статье Вход с помощью Azure CLI.

    • Установите расширение Azure CLI при первом использовании, когда появится соответствующий запрос. Дополнительные сведения о расширениях см. в статье Использование расширений с Azure CLI.

    • Выполните команду az version, чтобы узнать установленную версию и зависимые библиотеки. Чтобы обновиться до последней версии, выполните команду az upgrade.

  • Центр Интернета вещей Azure. Инструкции по развертыванию см. в статье Создание центра Интернета вещей с помощью портала Azure.

  • Два ресурса подключенных реестров в Azure. Инструкции по развертыванию см. в кратком руководстве по созданию подключенного реестра с помощью Azure CLI или портала Azure.

    • Подключенный реестр для верхнего уровня может быть в режиме ReadWrite или ReadOnly. В этой статье предполагается, что используется режим ReadWrite, а имя подключенного реестра хранится в переменной среды $CONNECTED_REGISTRY_RW.
    • Подключенный реестр для нижнего уровня должен быть в режиме ReadOnly. В этой статье предполагается, что имя подключенного реестра хранится в переменной среды $CONNECTED_REGISTRY_RO.

Импорт образов в облачный реестр

Импортируйте следующие образы контейнеров в облачный реестр с помощью команды az acr import. Пропустите этот шаг, если вы уже импортировали эти образы.

Образ подключенного реестра

Чтобы обеспечить поддержку вложенных сценариев IoT Edge, образ контейнера для подключенной среды выполнения реестра должен быть доступным в частном реестре контейнеров Azure. С помощью команды az acr import импортируйте образ подключенного реестра в частный реестр.

# Use the REGISTRY_NAME variable in the following Azure CLI commands to identify the registry
REGISTRY_NAME=<container-registry-name>

az acr import \
  --name $REGISTRY_NAME \
  --source mcr.microsoft.com/acr/connected-registry:0.8.0

Образы прокси-сервера API и IoT Edge

Для включения поддержки подключенного реестра во вложенных ресурсах IoT Edge необходимо развернуть модули для IoT Edge и прокси-сервера API. Импортируйте эти образы в свой частный реестр.

Модуль прокси-сервера API IoT Edge позволяет устройству IoT Edge предоставлять несколько служб с помощью протокола HTTPS на одном и том же порту, например 443.

az acr import \
  --name $REGISTRY_NAME \
  --source mcr.microsoft.com/azureiotedge-agent:1.2.4

az acr import \
  --name $REGISTRY_NAME \
  --source mcr.microsoft.com/azureiotedge-hub:1.2.4

az acr import \
  --name $REGISTRY_NAME \
  --source mcr.microsoft.com/azureiotedge-api-proxy:1.1.2

az acr import \
  --name $REGISTRY_NAME \
  --source mcr.microsoft.com/azureiotedge-diagnostics:1.2.4

Образ hello-world

Для тестирования подключенного реестра импортируйте образ hello-world. Этот репозиторий синхронизируется с подключенным реестром и извлекается клиентами подключенного реестра.

az acr import \
  --name $REGISTRY_NAME \
  --source mcr.microsoft.com/hello-world:1.1.2

Получение конфигурации подключенного реестра

Чтобы развернуть каждый подключенный реестр на устройстве IoT Edge в иерархии, необходимо получить параметры конфигурации из ресурса подключенного реестра в Azure. При необходимости выполните команду az acr connected-registry get-settings для каждого подключенного реестра, чтобы получить конфигурацию.

По умолчанию сведения о параметрах не содержат пароль токена синхронизации, который также требуется для развертывания подключенного реестра. При необходимости вы можете создать один из паролей, передав параметр --generate-password 1 или --generate-password 2. Сохраните созданный пароль в надежном расположении. Вы не сможете получить его повторно.

Предупреждение

При повторном создании пароля меняются учетные данные токена синхронизации. Если устройство настроено с использованием предыдущего пароля, нужно обновить конфигурацию.

# Use the REGISTRY_NAME variable in the following Azure CLI commands to identify the registry
REGISTRY_NAME=<container-registry-name>

# Run the command for each registry resource in the hierarchy

az acr connected-registry get-settings \
  --registry $REGISTRY_NAME \
  --name $CONNECTED_REGISTRY_RW \
  --parent-protocol https

az acr connected-registry get-settings \
  --registry $REGISTRY_NAME \
  --name $CONNECTED_REGISTRY_RO \
  --parent-protocol https

Выходные данные команды включают строку подключения к реестру и связанные параметры. В следующем примере выходных данных показана строка подключения для подключенного реестра с именем myconnectedregistry с родительским реестром contosoregistry:

{
  "ACR_REGISTRY_CONNECTION_STRING": "ConnectedRegistryName=myconnectedregistry;SyncTokenName=myconnectedregistry-sync-token;SyncTokenPassword=xxxxxxxxxxxxxxxx;ParentGatewayEndpoint=contosoregistry.eastus.data.azurecr.io;ParentEndpointProtocol=https"
}

Настройка манифестов развертывания

Манифест развертывания — это документ JSON, в котором указано, какие модули следует развернуть на устройстве IoT Edge. Подробную информацию см. в статье Сведения о развертывании модулей и установлении маршрутов в IoT Edge.

Чтобы развернуть модуль подключенного реестра на каждом IoT Edge устройстве с помощью Azure CLI, сохраните следующие манифесты развертывания локально в виде файлов JSON. Используя сведения из предыдущих разделов, обновите соответствующие значения JSON в каждом манифесте. В следующем разделе вам потребуются пути к файлам для выполнения команды, применяющей конфигурацию к устройству.

Манифест развертывания для верхнего уровня

Для устройства верхнего уровня создайте файл манифеста развертывания deploymentTopLayer.json с приведенным ниже содержимым. Этот манифест похож на тот, который использовался в кратком руководстве по развертыванию подключенного реестра на устройстве IoT Edge.

Примечание

Если вы уже развернули подключенный реестр на устройстве IoT Edge верхнего уровня с помощью краткого руководства, вы можете использовать этот реестр на верхнем уровне вложенной иерархии. Измените шаги по развертыванию в этом руководстве, чтобы настроить реестр в иерархии (не показано).

Параметры модуля подключенного реестра

  • Используйте учетные данные маркера и строку подключения, указанные в предыдущих разделах, чтобы обновить соответствующие значения JSON в узле env.

  • В узле env следующие переменные среды являются необязательными:

    Переменная Описание
    ACR_REGISTRY_LOGIN_SERVER Указывает уникальное имя узла или полное доменное имя. Если значение указано, подключенный реестр принимает только запросы, выполненные для этого значения сервера входа.

    Если значение не указано, доступ к подключенному реестру можно получить с помощью любого значения сервера входа.
    ACR_REGISTRY_CERTIFICATE_VOLUME Если подключенный реестр будет доступен по протоколу HTTPS, указывает на том, где хранятся сертификаты HTTPS.

    Если значение не задано, используется расположение по умолчанию /var/acr/certs.
    ACR_REGISTRY_DATA_VOLUME Перезаписывает расположение по умолчанию /var/acr/data, где подключенный реестр будет сохранять образы.

    Это расположение должно соответствовать привязке тома для контейнера.

    Важно!

    Если подключенный реестр прослушивает порт, отличный от 80 и 443, значение ACR_REGISTRY_LOGIN_SERVER (если оно указано) должно включать порт. Например, 192.168.0.100:8080.

  • Необходимо установить привязку HostPort для подключенного реестра, если модуль прокси-сервера API не используется. Пример

     "createOptions": "{\"HostConfig\":{\"Binds\":[\"/home/azureuser/connected-registry:/var/acr/data\"],\"PortBindings\":{\"8080/tcp\":[{\"HostPort\":\"8080\"}]}}}"
    

Параметры модуля прокси-сервера API

  • Прокси-сервер API будет прослушивать порт 8000, настроенный как NGINX_DEFAULT_PORT. Дополнительные сведения о параметрах прокси-сервера API см. в репозитории GitHub для IoT Edge.
{
    "modulesContent": {
        "$edgeAgent": {
            "properties.desired": {
                "modules": {
                    "connected-registry": {
                        "settings": {
                            "image": "<REPLACE_WITH_CLOUD_REGISTRY_NAME>.azurecr.io/acr/connected-registry:0.8.0",
                            "createOptions": "{\"HostConfig\":{\"Binds\":[\"/home/azureuser/connected-registry:/var/acr/data\"]}}"
                        },
                        "type": "docker",
                        "env": {
                            "ACR_REGISTRY_CONNECTION_STRING": {
                                "value": "ConnectedRegistryName=<REPLACE_WITH_CONNECTED_REGISTRY_NAME>;SyncTokenName=<REPLACE_WITH_SYNC_TOKEN_NAME>;SyncTokenPassword=REPLACE_WITH_SYNC_TOKEN_PASSWORD;ParentGatewayEndpoint=<REPLACE_WITH_CLOUD_REGISTRY_NAME>.<REPLACE_WITH_CLOUD_REGISTRY_REGION>.data.azurecr.io;ParentEndpointProtocol=https"
                            }
                        },
                        "status": "running",
                        "restartPolicy": "always",
                        "version": "1.0"
                    },
                    "IoTEdgeAPIProxy": {
                        "settings": {
                            "image": "<REPLACE_WITH_CLOUD_REGISTRY_NAME>.azurecr.io/azureiotedge-api-proxy:1.1.2",
                            "createOptions": "{\"HostConfig\":{\"PortBindings\":{\"8000/tcp\":[{\"HostPort\":\"8000\"}]}}}"
                        },
                        "type": "docker",
                        "env": {
                            "NGINX_DEFAULT_PORT": {
                                "value": "8000"
                            },
                            "CONNECTED_ACR_ROUTE_ADDRESS": {
                                "value": "connected-registry:8080"
                            },
                            "BLOB_UPLOAD_ROUTE_ADDRESS": {
                                "value": "AzureBlobStorageonIoTEdge:11002"
                            }
                        },
                        "status": "running",
                        "restartPolicy": "always",
                        "version": "1.0"
                    }
                },
                "runtime": {
                    "settings": {
                        "minDockerVersion": "v1.25",
                        "registryCredentials": {
                            "cloudregistry": {
                                "address": "<REPLACE_WITH_CLOUD_REGISTRY_NAME>.azurecr.io",
                                "password": "<REPLACE_WITH_SYNC_TOKEN_PASSWORD>",
                                "username": "<REPLACE_WITH_SYNC_TOKEN_NAME>"
                            }
                        }
                    },
                    "type": "docker"
                },
                "schemaVersion": "1.1",
                "systemModules": {
                    "edgeAgent": {
                        "settings": {
                            "image": "<REPLACE_WITH_CLOUD_REGISTRY_NAME>.azurecr.io/azureiotedge-agent:1.2.4",
                            "createOptions": ""
                        },
                        "type": "docker",
                        "env": {
                            "SendRuntimeQualityTelemetry": {
                                "value": "false"
                            }
                        }
                    },
                    "edgeHub": {
                        "settings": {
                            "image": "<REPLACE_WITH_CLOUD_REGISTRY_NAME>.azurecr.io/azureiotedge-hub:1.2.4",
                            "createOptions": "{\"HostConfig\":{\"PortBindings\":{\"443/tcp\":[{\"HostPort\":\"443\"}],\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}]}}}"
                        },
                        "type": "docker",
                        "status": "running",
                        "restartPolicy": "always"
                    }
                }
            }
        },
        "$edgeHub": {
            "properties.desired": {
                "routes": {
                    "route": "FROM /messages/* INTO $upstream"
                },
                "schemaVersion": "1.1",
                "storeAndForwardConfiguration": {
                    "timeToLiveSecs": 7200
                }
            }
        }
    }
}

Манифест развертывания для нижнего уровня

Для устройства нижнего уровня создайте файл манифеста развертывания deploymentLowerLayer.json со следующим содержимым.

В целом файл манифеста развертывания нижнего уровня такой же, как и файл манифеста развертывания верхнего уровня. Различия описаны ниже.

  • В файле извлекаются образы из подключенного реестра верхнего уровня, а не из облачного реестра.

    Когда настраиваете подключенный реестр верхнего уровня сделайте так, чтобы он синхронизировал все необходимые образы локально, включая azureiotedge-agent, azureiotedge-hub, azureiotedge-api-proxy и acr/connected-registry. Устройство Интернета вещей нижнего уровня должно извлекать эти образы из подключенного реестра верхнего уровня.

  • В файле используется настроенный токен синхронизации на нижнем уровне для проверки подлинности с подключенным реестром верхнего уровня.

  • В файле настраивается конечная точка родительского шлюза с IP-адресом или полным доменным именем подключенного реестра верхнего уровня, а не с полным доменным именем облачного реестра.

Важно!

В приведенном ниже манифесте развертывания $upstream используется в качестве IP-адреса или полного доменного имени устройства, на котором размещается родительский подключенный реестр. Но $upstream не поддерживается в переменной среды. Подключенному реестру необходимо считать переменную среды ACR_PARENT_GATEWAY_ENDPOINT, чтобы получить конечную точку родительского шлюза. Вместо $upstream подключенный реестр поддерживает динамическое разрешение IP-адреса или полного доменного имени из другой переменной среды.

На вложенном устройстве IoT Edge на нижнем уровне имеется переменная среды $IOTEDGE_PARENTHOSTNAME, равная IP-адресу или полному доменному имени родительского устройства. Вручную замените переменную среды, указав ее в качестве значения ParentGatewayEndpoint в строке подключения, чтобы избежать жесткого определения IP-адреса или полного доменного имени в коде. Так как родительское устройство в этом примере выполняет nginx на порте 8000, передайте $IOTEDGE_PARENTHOSTNAME:8000. Также потребуется выбрать правильный протокол в ParentEndpointProtocol.

{
    "modulesContent": {
        "$edgeAgent": {
            "properties.desired": {
                "modules": {
                    "connected-registry": {
                        "settings": {
                            "image": "$upstream:8000/acr/connected-registry:0.8.0",
                            "createOptions": "{\"HostConfig\":{\"Binds\":[\"/home/azureuser/connected-registry:/var/acr/data\"]}}"
                        },
                        "type": "docker",
                        "env": {
                            "ACR_REGISTRY_CONNECTION_STRING": {
                                "value": "ConnectedRegistryName=<REPLACE_WITH_CONNECTED_REGISTRY_NAME>;SyncTokenName=<REPLACE_WITH_SYNC_TOKEN_NAME>;SyncTokenPassword=<REPLACE_WITH_SYNC_TOKEN_PASSWORD>;ParentGatewayEndpoint=$IOTEDGE_PARENTHOSTNAME:8000;ParentEndpointProtocol=https"
                            }
                        },
                        "status": "running",
                        "restartPolicy": "always",
                        "version": "1.0"
                    },
                    "IoTEdgeApiProxy": {
                        "settings": {
                            "image": "$upstream:8000/azureiotedge-api-proxy:1.1.2",
                            "createOptions": "{\"HostConfig\": {\"PortBindings\": {\"8000/tcp\": [{\"HostPort\": \"8000\"}]}}}"
                        },
                        "type": "docker",
                        "version": "1.0",
                        "env": {
                            "NGINX_DEFAULT_PORT": {
                                "value": "8000"
                            },
                            "CONNECTED_ACR_ROUTE_ADDRESS": {
                                "value": "connected-registry:8080"
                            },
                            "NGINX_CONFIG_ENV_VAR_LIST": {
                                    "value": "NGINX_DEFAULT_PORT,BLOB_UPLOAD_ROUTE_ADDRESS,CONNECTED_ACR_ROUTE_ADDRESS,IOTEDGE_PARENTHOSTNAME,DOCKER_REQUEST_ROUTE_ADDRESS"
                            },
                            "BLOB_UPLOAD_ROUTE_ADDRESS": {
                                "value": "AzureBlobStorageonIoTEdge:11002"
                            }
                        },
                        "status": "running",
                        "restartPolicy": "always",
                        "startupOrder": 3
                    }
                },
                "runtime": {
                    "settings": {
                        "minDockerVersion": "v1.25",
                        "registryCredentials": {
                            "connectedregistry": {
                                "address": "$upstream:8000",
                                "password": "<REPLACE_WITH_SYNC_TOKEN_PASSWORD>",
                                "username": "<REPLACE_WITH_SYNC_TOKEN_NAME>"
                            }
                        }
                    },
                    "type": "docker"
                },
                "schemaVersion": "1.1",
                "systemModules": {
                    "edgeAgent": {
                        "settings": {
                            "image": "$upstream:8000/azureiotedge-agent:1.2.4",
                            "createOptions": ""
                        },
                        "type": "docker",
                        "env": {
                            "SendRuntimeQualityTelemetry": {
                                "value": "false"
                            }
                        }
                    },
                    "edgeHub": {
                        "settings": {
                            "image": "$upstream:8000/azureiotedge-hub:1.2.4",
                            "createOptions": "{\"HostConfig\":{\"PortBindings\":{\"443/tcp\":[{\"HostPort\":\"443\"}],\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}]}}}"
                        },
                        "type": "docker",
                        "status": "running",
                        "restartPolicy": "always"
                    }
                }
            }
        },
        "$edgeHub": {
            "properties.desired": {
                "routes": {
                    "route": "FROM /messages/* INTO $upstream"
                },
                "schemaVersion": "1.1",
                "storeAndForwardConfiguration": {
                    "timeToLiveSecs": 7200
                }
            }
        }
    }
}

Настройка и развертывание модулей подключенного реестра

Следующие инструкции взяты из статьи Руководство. Создание иерархии устройств IoT Edge и предусмотрены для развертывания модулей подключенного реестра в иерархии IoT Edge. Подробное описание отдельных инструкций см. в том руководстве.

Создание устройств верхнего и нижнего уровней

Создайте виртуальные машины верхнего и нижнего уровней с помощью существующего шаблона ARM. Шаблон также устанавливает агент IoT Edge. Если вы хотите выполнить развертывание на собственных устройствах, см. статью Руководство. Установка и удаление Azure IoT Edge для Linux с инструкциями по настройке устройства вручную.

Важно!

Чтобы обеспечить доступ к модулям, развернутым на устройстве IoT Edge, убедитесь, что на устройстве открыты такие порты для входящего трафика: 8000, 443, 5671, 8883. Инструкции по настройке см. в статье Как открыть порты для виртуальной машины с помощью портала Azure.

Создание и настройка иерархии

Создайте и настройте иерархию с помощью средства iotedge-config, выполнив следующие действия в Azure CLI или Azure Cloud Shell:

  1. Скачайте средство настройки.

     mkdir nested_iot_edge_tutorial
     cd ~/nested_iot_edge_tutorial
     wget -O iotedge_config.tar "https://github.com/Azure-Samples/iotedge_config_cli/releases/download/latest/iotedge_config_cli.tar.gz"
     tar -xvf iotedge_config.tar
    

    Это действие создаст папку iotedge_config_cli_release в каталоге для руководства. Для создания иерархии устройств вам потребуется файл шаблона iotedge_config.yaml, расположенный в ~/nested_iot_edge_tutorial/iotedge_config_cli_release/templates/tutorial. В одном каталоге хранится два манифеста развертывания для верхнего и нижнего уровней: файлы deploymentTopLayer.json и deploymentLowerLayer.json.

  2. В файле iotedge_config.yaml укажите свои значения. Измените iothub_hostname, iot_name, имена файлов манифестов развертывания для верхнего и нижнего уровней, а также учетные данные токена клиента, созданные для извлечения образов на каждом уровне из вышестоящего уровня. Ниже показан пример файла конфигурации.

    config_version: "1.0"
    
    iothub:
        iothub_hostname: <REPLACE_WITH_HUB_NAME>.azure-devices.net
        iothub_name: <REPLACE_WITH_HUB_NAME>
        ## Authentication method used by IoT Edge devices: symmetric_key or x509_certificate
        authentication_method: symmetric_key 
    
        ## Root certificate used to generate device CA certificates. Optional. If not provided a self-signed CA will be generated
        # certificates:
        #   root_ca_cert_path: ""
        #   root_ca_cert_key_path: ""
    
        ## IoT Edge configuration template to use
    configuration:
        template_config_path: "./templates/tutorial/device_config.toml"
        default_edge_agent: "$upstream:8000/azureiotedge-agent:1.2.4"
    
        ## Hierarchy of IoT Edge devices to create
    edgedevices:
        device_id: top-layer
        edge_agent: "<REPLACE_WITH_REGISTRY_NAME>.azurecr.io/azureiotedge-agent:1.2.4" ## Optional. If not provided, default_edge_agent will be used
        deployment: "./templates/tutorial/deploymentTopLayer.json" ## Optional. If provided, the given deployment file will be applied to the newly created device
            # hostname: "FQDN or IP" ## Optional. If provided, install.sh will not prompt user for this value nor the parent_hostname value
        container_auth: ## The token used to pull the image from cloud registry
            serveraddress: "<REPLACE_WITH_REGISTRY_NAME>.azurecr.io"
            username: "<REPLACE_WITH_SYNC_TOKEN_NAME_FOR_TOP_LAYER>"
            password: "<REPLACE_WITH_SYNC_TOKEN_PASSWORD_FOR_TOP_LAYER>"
        child:
            - device_id: lower-layer
              deployment: "./templates/tutorial/deploymentLowerLayer.json" ## Optional. If provided, the given deployment file will be applied to the newly created device
               # hostname: "FQDN or IP" ## Optional. If provided, install.sh will not prompt user for this value nor the parent_hostname value
              container_auth: ## The token used to pull the image from parent connected registry
                serveraddress: "$upstream:8000"
                username: "<REPLACE_WITH_SYNC_TOKEN_NAME_FOR_LOWER_LAYER>"
                password: "<REPLACE_WITH_SYNC_TOKEN_PASSWORD_FOR_LOWER_LAYER>"
    
  3. Подготовьте файлы манифестов развертывания для верхнего и нижнего уровней (deploymentTopLayer.json и deploymentLowerLayer.json). Скопируйте файлы манифестов развертывания, созданные ранее в рамках этой статьи, в папку ~/nestedIotEdgeTutorial/iotedge_config_cli_release/templates/tutorial.

  4. Перейдите в каталог iotedge_config_cli_release и запустите указанное средство, чтобы создать иерархию устройств IoT Edge.

    cd ~/nestedIotEdgeTutorial/iotedge_config_cli_release
    ./iotedge_config --config ~/nestedIotEdgeTutorial/iotedge_config_cli_release/templates/tutorial/iotedge_config.yaml --output ~/nestedIotEdgeTutorial/iotedge_config_cli_release/outputs -f
    

    При установленном параметре --output это средство создает в выбранном каталоге сертификаты устройств, пакеты сертификатов и файл журнала. При установленном параметре -f это средство автоматически находит все существующие устройства IoT Edge в Центре Интернета вещей и удаляет их, чтобы предотвратить ошибки и упростить работу с Центром Интернета вещей.

    Запуск средства может занять несколько минут.

  5. Скопируйте файлы top-layer.zip и lower-layer.zip, созданные на предыдущем шаге, в соответствующие виртуальные машины верхнего и нижнего уровней с помощью scp.

    scp <PATH_TO_CONFIGURATION_BUNDLE>   <USER>@<VM_IP_OR_FQDN>:~
    
  6. Подключитесь к устройству верхнего уровня для установки пакета конфигурации.

    1. Распакуйте пакет конфигурации. Перед этим следует установить средство распаковки.

      sudo apt install zip
      unzip ~/<PATH_TO_CONFIGURATION_BUNDLE>/<CONFIGURATION_BUNDLE>.zip #unzip top-layer.zip
      
    2. Выполните команду sudo ./install.sh. Введите IP-адрес или имя узла. Мы рекомендуем использовать IP-адрес.

    3. Выполните команду sudo iotedge list, чтобы убедиться, что все модули работают.

  7. Подключитесь к устройству нижнего уровня для установки пакета конфигурации.

    1. Распакуйте пакет конфигурации. Перед этим следует установить средство распаковки.

      sudo apt install zip
      unzip ~/<PATH_TO_CONFIGURATION_BUNDLE>/<CONFIGURATION_BUNDLE>.zip #unzip lower-layer.zip
      
    2. Выполните команду sudo ./install.sh. Введите IP-адреса или имена узлов устройства и родительского элемента. Мы рекомендуем использовать IP-адреса.

    3. Выполните команду sudo iotedge list, чтобы убедиться, что все модули работают.

Если вы не указали файл развертывания для конфигурации устройства или если возникли проблемы с развертыванием, например недопустимый манифест развертывания на устройстве верхнего или нижнего уровня, разверните эти модули вручную. Этот процесс описан в следующем разделе.

Развертывание модуля подключенного реестра вручную

Чтобы вручную развернуть подключенный модуль реестра на устройстве IoT Edge, используйте следующую команду:

az iot edge set-modules \
  --device-id <device-id> \
  --hub-name <hub-name> \
  --content <deployment-manifest-filename>

Дополнительные сведения см. в статье Развертывание модулей Azure IoT Edge с помощью Azure CLI.

После успешного развертывания для подключенного реестра отобразится состояние Online.

Чтобы проверить состояние подключенного реестра, используйте команду az acr connected-registry show:

az acr connected-registry show \
  --registry $REGISTRY_NAME \
  --name $CONNECTED_REGISTRY_RO \
  --output table

Возможно, потребуется подождать несколько минут, пока завершится развертывание подключенного реестра.

После успешного развертывания для подключенного реестра отобразится состояние Online.

Чтобы устранить неполадки с развертыванием, выполните iotedge check на затронутом устройстве. Дополнительные сведения см. в руководстве по устранению неполадок.

Следующие шаги

Из этого краткого руководства вы узнали, как развернуть подключенный реестр на вложенном устройстве IoT Edge. Перейдите к следующему руководству, чтобы узнать, как извлечь образы из развернутого подключенного реестра.