Развертывание экземпляров контейнеров в виртуальной сети Azure
Виртуальная сеть Azure обеспечивает безопасное и конфиденциальное сетевое подключение для Azure и локальных ресурсов. Развертывание групп контейнеров в виртуальной сети Azure позволяет контейнерам безопасно обмениваться данными с другими ресурсами в виртуальной сети.
В этой статье показано использование команды az container create в Azure CLI для развертывания групп контейнеров в новой или в существующей виртуальной сети.
Внимание
- Перед использованием виртуальной сети необходимо делегировать подсети.
- Прежде чем развертывать группы контейнеров в виртуальных сетях, сначала рекомендуется проверить ограничение. Сетевые сценарии и ограничения см. в статье Сценарии и ресурсы виртуальной сети для Экземпляров контейнеров Azure.
- Развертывание группы контейнеров в виртуальной сети обычно доступно для контейнеров Linux и Windows в большинстве регионов, где Экземпляры контейнеров Azure доступно. Дополнительные сведения см. в доступных регионах.
Внимание
Сетевые профили больше не используются с выпуска API версии 2021-07-01
. Если вы используете эту или более новую версию, пропустите все шаги и действия, связанные с сетевыми профилями.
Примеры в этой статье отформатированы для выполнения в оболочке Bash. Если вы предпочитаете использовать другую оболочку, например PowerShell или командную строку, измените соответствующим образом символы продолжения строки.
Необходимые компоненты
Определение переменных среды
Путь автоматического развертывания использует следующие переменные среды и имена ресурсов в этом руководстве. Пользователи, выполняемые вручную, могут использовать собственные переменные и имена в качестве предпочтительных.
export RANDOM_ID="$(openssl rand -hex 3)"
export MY_RESOURCE_GROUP_NAME="myACIResourceGroup$RANDOM_ID"
export MY_VNET_NAME="aci-vnet"
export MY_SUBNET_NAME="aci-subnet"
export MY_SUBNET_ID="/subscriptions/$(az account show --query id --output tsv)/resourceGroups/$MY_RESOURCE_GROUP_NAME/providers/Microsoft.Network/virtualNetworks/$MY_VNET_NAME/subnets/$MY_SUBNET_NAME"
export MY_APP_CONTAINER_NAME="appcontainer"
export MY_COMM_CHECKER_NAME="commchecker"
export MY_YAML_APP_CONTAINER_NAME="appcontaineryaml"
Создание или изменение группы ресурсов
Для управления всеми ресурсами, используемыми в следующих примерах, требуется группа ресурсов. Чтобы создать группу ресурсов, используйте az group create:
az group create --name $MY_RESOURCE_GROUP_NAME --location eastus
Успешная операция должна вывести выходные данные, аналогичные следующему JSON:
Результаты.
{
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx/resourceGroups/myACIResourceGroup123abc",
"location": "abcdef",
"managedBy": null,
"name": "myACIResourceGroup123",
"properties": {
"provisioningState": "Succeeded"
},
"tags": null,
"type": "Microsoft.Resources/resourceGroups"
}
Развертывание в новой виртуальной сети
Примечание.
Если вы используете диапазон IP-адресов подсети /29, чтобы иметь только 3 IP-адреса. мы всегда рекомендуем перейти к одному диапазону выше (никогда не ниже). Например, используйте диапазон IP-адресов подсети /28, чтобы иметь не менее 1 или более буфера IP-адресов для каждой группы контейнеров. Это позволяет избежать зависаемых контейнеров, не в состоянии запустить, перезапустить или даже не остановить состояния.
Чтобы обеспечить развертывание в новой виртуальной сети и автоматическое создание сетевых ресурсов в Azure, укажите следующее при выполнении команды az container create:
- имя виртуальной сети;
- Префикс адреса виртуальной сети в формате CIDR.
- Имя подсети
- Префикс адреса подсети в формате CIDR.
Префиксы адресов виртуальной сети и подсети определяют адресное пространство соответственно для виртуальной сети и подсети. Эти значения представлены в нотации бесклассовой междоменной маршрутизации (CIDR), например 10.0.0.0/16
. Дополнительные сведения о работе с подсетями см. в статье Создание, изменение или удаление виртуальной сети.
После развертывания первой группы контейнеров с помощью этого метода можно развернуть в той же подсети, указав имена виртуальной сети и подсети или профиль сети, который Azure автоматически создает для вас. Так как Azure делегирует подсети службе "Экземпляры контейнеров Azure", в этой подсети можно развернуть только группы контейнеров.
Пример
Следующая команда az container create задает настройки для новой виртуальной сети и подсети. Укажите имя группы ресурсов, созданной в регионе, где доступны развертывания группы контейнеров в виртуальной сети. Эта команда развертывает общедоступный контейнер Майкрософт aci-helloworld, который запускает небольшой веб-сервер Node.js, обслуживающий статическую веб-страницу. В следующем разделе вы развернете вторую группу контейнеров в той же подсети и протестируете связь между двумя экземплярами контейнеров.
az container create \
--name $MY_APP_CONTAINER_NAME \
--resource-group $MY_RESOURCE_GROUP_NAME \
--image mcr.microsoft.com/azuredocs/aci-helloworld \
--vnet $MY_VNET_NAME \
--vnet-address-prefix 10.0.0.0/16 \
--subnet $MY_SUBNET_NAME \
--subnet-address-prefix 10.0.0.0/24
Успешная операция должна вывести выходные данные, аналогичные следующему JSON:
Результаты.
{
"confidentialComputeProperties": null,
"containers": [
{
"command": null,
"environmentVariables": [],
"image": "mcr.microsoft.com/azuredocs/aci-helloworld",
"instanceView": {
"currentState": {
"detailStatus": "",
"exitCode": null,
"finishTime": null,
"startTime": "0000-00-00T00:00:00.000000+00:00",
"state": "Running"
},
"events": [
{
"count": 1,
"firstTimestamp": "0000-00-00T00:00:00+00:00",
"lastTimestamp": "0000-00-00T00:00:00+00:00",
"message": "Successfully pulled image \"mcr.microsoft.com/azuredocs/aci-helloworld@sha256:0000000000000000000000000000000000000000000000000000000000000000\"",
"name": "Pulled",
"type": "Normal"
},
{
"count": 1,
"firstTimestamp": "0000-00-00T00:00:00+00:00",
"lastTimestamp": "0000-00-00T00:00:00+00:00",
"message": "pulling image \"mcr.microsoft.com/azuredocs/aci-helloworld@sha256:0000000000000000000000000000000000000000000000000000000000000000\"",
"name": "Pulling",
"type": "Normal"
},
{
"count": 1,
"firstTimestamp": "0000-00-00T00:00:00+00:00",
"lastTimestamp": "0000-00-00T00:00:00+00:00",
"message": "Started container",
"name": "Started",
"type": "Normal"
}
],
"previousState": null,
"restartCount": 0
},
"livenessProbe": null,
"name": "appcontainer",
"ports": [
{
"port": 80,
"protocol": "TCP"
}
],
"readinessProbe": null,
"resources": {
"limits": null,
"requests": {
"cpu": 1.0,
"gpu": null,
"memoryInGb": 1.5
}
},
"securityContext": null,
"volumeMounts": null
}
],
"diagnostics": null,
"dnsConfig": null,
"encryptionProperties": null,
"extensions": null,
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx/resourceGroups/myACIResourceGroup123/providers/Microsoft.ContainerInstance/containerGroups/appcontainer",
"identity": null,
"imageRegistryCredentials": null,
"initContainers": [],
"instanceView": {
"events": [],
"state": "Running"
},
"ipAddress": {
"autoGeneratedDomainNameLabelScope": null,
"dnsNameLabel": null,
"fqdn": null,
"ip": "10.0.0.4",
"ports": [
{
"port": 80,
"protocol": "TCP"
}
],
"type": "Private"
},
"location": "eastus",
"name": "appcontainer",
"osType": "Linux",
"priority": null,
"provisioningState": "Succeeded",
"resourceGroup": "myACIResourceGroup123abc",
"restartPolicy": "Always",
"sku": "Standard",
"subnetIds": [
{
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx/resourceGroups/myACIResourceGroup123/providers/Microsoft.Network/virtualNetworks/aci-vnet/subnets/aci-subnet",
"name": null,
"resourceGroup": "myACIResourceGroup123abc"
}
],
"tags": {},
"type": "Microsoft.ContainerInstance/containerGroups",
"volumes": null,
"zones": null
}
Развертывание в новой виртуальной сети с помощью этого метода может занять несколько минут, пока создаются сетевые ресурсы. После первоначального развертывания дальнейшие развертывания групп контейнеров в той же подсети выполняются быстрее.
Развертывание в существующей виртуальной сети
Чтобы развернуть группу контейнеров в существующей виртуальной сети, сделайте следующее:
- Создайте подсеть в существующей виртуальной сети, используйте существующую подсеть, в которой уже развернута группа контейнеров, или используйте существующую подсеть, очищенную от всех остальных ресурсов и настроек. Подсеть, используемая для групп контейнеров, может содержать только группы контейнеров. Перед развертыванием группы контейнеров в подсети необходимо явно делегировать подсеть перед подготовкой. После делегирования подсеть можно использовать только для групп контейнеров. Если попытаться развернуть в делегированной подсети ресурсы, отличные от групп контейнеров, операция завершится ошибкой.
- Разверните группу контейнеров с помощью az container create и укажите один из следующих вариантов:
- имя виртуальной сети и имя подсети;
- идентификатор ресурса виртуальной сети и идентификатор ресурса подсети, которые позволяют использовать виртуальную сеть из другой группы ресурсов;
Развертывание с помощью YAML-файла
Возможно также развертывание группы контейнеров в существующей виртуальной сети с помощью файла YAML, шаблона Resource Manager или другого программного метода, например с помощью пакета SDK для Python.
Например, при использовании файла YAML можно выполнить развертывание в виртуальной сети с подсетью, делегированной в Экземпляры контейнеров Azure. Задайте следующие свойства.
ipAddress
— параметры IP-адреса для группы контейнеров.ports
— открываемые порты, если таковые имеются.protocol
— протокол (TCP или UDP) для открытого порта.
subnetIds
: идентификаторы ресурсов подсетей, которые необходимо развернуть вid
— идентификатор ресурса подсетиname
— имя подсети
Этот YAML создает группу контейнеров в виртуальной сети. Введите имя группы контейнеров в полях имени и идентификаторе подсети в поле идентификатора подсети. Для имени используется appcontaineryaml . Если вам нужно найти идентификатор подсети и больше не иметь доступа к предыдущим выходным данным, вы можете использовать команду az container show для просмотра. id
Найдите поле под subnetIds
.
apiVersion: '2021-07-01'
location: eastus
name: appcontaineryaml
properties:
containers:
- name: appcontaineryaml
properties:
image: mcr.microsoft.com/azuredocs/aci-helloworld
ports:
- port: 80
protocol: TCP
resources:
requests:
cpu: 1.0
memoryInGB: 1.5
ipAddress:
type: Private
ports:
- protocol: tcp
port: '80'
osType: Linux
restartPolicy: Always
subnetIds:
- id: <subnet_id>
name: default
tags: null
type: Microsoft.ContainerInstance/containerGroups
Следующая команда Bash предназначена для автоматического пути развертывания.
echo -e "apiVersion: '2021-07-01'\nlocation: eastus\nname: $MY_YAML_APP_CONTAINER_NAME\nproperties:\n containers:\n - name: $MY_YAML_APP_CONTAINER_NAME\n properties:\n image: mcr.microsoft.com/azuredocs/aci-helloworld\n ports:\n - port: 80\n protocol: TCP\n resources:\n requests:\n cpu: 1.0\n memoryInGB: 1.5\n ipAddress:\n type: Private\n ports:\n - protocol: tcp\n port: '80'\n osType: Linux\n restartPolicy: Always\n subnetIds:\n - id: $MY_SUBNET_ID\n name: default\ntags: null\ntype: Microsoft.ContainerInstance/containerGroups" > container-instances-vnet.yaml
Разверните группу контейнеров с помощью команды az container create, указав имя YAML-файла для значения параметра --file
.
az container create --resource-group $MY_RESOURCE_GROUP_NAME \
--file container-instances-vnet.yaml
Следующая команда Bash предназначена для автоматического пути развертывания.
rm container-instances-vnet.yaml
После завершения развертывания выполните команду az container show , чтобы отобразить его состояние:
az container list --resource-group $MY_RESOURCE_GROUP_NAME --output table
Выходные данные должны выглядеть примерно так:
Результаты.
Name ResourceGroup Status Image IP:ports Network CPU/Memory OsType Location
---------------- ------------------------ --------- ------------------------------------------ -------------- --------- --------------- -------- ----------
appcontainer myACIResourceGroup123abc Succeeded mcr.microsoft.com/azuredocs/aci-helloworld 10.0.0.4:80,80 Private 1.0 core/1.5 gb Linux abcdef
appcontaineryaml myACIResourceGroup123abc Succeeded mcr.microsoft.com/azuredocs/aci-helloworld 10.0.0.5:80,80 Private 1.0 core/1.5 gb Linux abcdef
Демонстрация взаимодействия между экземплярами контейнеров
В следующем примере выполняется развертывание третьей группы контейнеров в той же подсети, созданной ранее. Используя образ Alpine Linux, он проверяет взаимодействие между собой и первым экземпляром контейнера.
Примечание.
Из-за ограничения скорости для извлечения общедоступных образов Docker, таких как Alpine Linux, используемых здесь, вы можете получить ошибку в форме:
(RegistryErrorResponse) Ответ об ошибке получен из реестра Docker "index.docker.io". Повторите попытку позже. Код: сообщение RegistryErrorResponse: сообщение об ошибке получено из реестра Docker "index.docker.io". Повторите попытку позже.
Следующая команда Bash предназначена для автоматического пути развертывания.
echo -e "Due to rate limiting in effect for pulling public Docker images like the Alpine Linux one used here, you may receive an error in the form:\n\n(RegistryErrorResponse) An error response is received from the docker registry 'index.docker.io'. Please retry later.\nCode: RegistryErrorResponse\nMessage: An error response is received from the docker registry 'index.docker.io'. Please retry later.\n\nIf this occurs, the automated deployment will exit. You can try again or go to the end of the guide to see instructions for cleaning up your resources."
Сначала получите IP-адрес первой развернутой группы контейнеров — appcontainer:
az container show --resource-group $MY_RESOURCE_GROUP_NAME \
--name $MY_APP_CONTAINER_NAME \
--query ipAddress.ip --output tsv
В выходных данных отображается IP-адрес группы контейнеров в частной подсети. Например:
Результаты.
10.0.0.4
Теперь в качестве значения параметра CONTAINER_GROUP_IP
укажите IP-адрес, полученный командой az container show
, и выполните следующую команду az container create
. Этот второй контейнер, commchecker, запускает образ на базе Alpine Linux и выполняет wget
в отношении IP-адреса частной подсети первой группы контейнеров.
az container create \
--resource-group $MY_RESOURCE_GROUP_NAME \
--name $MY_COMM_CHECKER_NAME \
--image alpine:3.4 \
--command-line "wget 10.0.0.4" \
--restart-policy never \
--vnet $MY_VNET_NAME \
--subnet $MY_SUBNET_NAME
После завершения развертывания второго контейнера извлеките журналы, чтобы просмотреть выходные данные выполняемой wget
команды:
az container logs --resource-group $MY_RESOURCE_GROUP_NAME --name $MY_COMM_CHECKER_NAME
Если второй контейнер успешно обменивается данными с первым, выходные данные должны выглядеть следующим образом:
Connecting to 10.0.0.4 (10.0.0.4:80)
index.html 100% |*******************************| 1663 0:00:00 ETA
Выходные данные журнала должны показывать, что программе wget
удалось подключиться и скачать файл индекса из первого контейнера, используя его частный IP-адрес в локальной подсети. Сетевой трафик между двумя группами контейнеров оставался в пределах виртуальной сети.
Очистка ресурсов
Если вы не планируете продолжать использовать эти ресурсы, их можно удалить, чтобы избежать расходов На Azure. Все ресурсы, используемые в этом руководстве, можно очистить, удалив группу ресурсов с помощью команды az group delete . После удаления эти ресурсы восстановить невозможно.
Следующие шаги
Сведения о развертывании новой виртуальной сети, подсети, профиля сети и группы контейнеров с помощью шаблона Resource Manager см. в статье "Создание группы контейнеров Azure с виртуальной сетью".
Сведения о развертывании Экземпляры контейнеров Azure, которые могут извлекать образы из Реестр контейнеров Azure через частную конечную точку, см. в статье "Развертывание в Экземпляры контейнеров Azure из Реестр контейнеров Azure с помощью управляемого удостоверения.