Развертывание экземпляров контейнеров в виртуальной сети Azure

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

В этой статье показано использование команды az container create в Azure CLI для развертывания групп контейнеров в новой или в существующей виртуальной сети.

Важно!

Перед развертыванием групп контейнеров в виртуальных сетях рекомендуется сначала проверить ограничение. Сетевые сценарии и ограничения см. в статье Сценарии и ресурсы виртуальной сети для Экземпляров контейнеров Azure.

Важно!

Развертывание группы контейнеров в виртуальной сети является общедоступным для контейнеров Linux и Windows в большинстве регионов, где доступно Экземпляры контейнеров Azure. Дополнительные сведения см. в разделе available-regions.

Важно!

Сетевые профили больше не используются с выпуска API версии 2021-07-01. Если вы используете эту или более новую версию, пропустите все шаги и действия, связанные с сетевыми профилями.

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

Развертывание в новой виртуальной сети

Примечание

Если вы используете диапазон 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 appcontainer \
  --resource-group myResourceGroup \
  --image mcr.microsoft.com/azuredocs/aci-helloworld \
  --vnet aci-vnet \
  --vnet-address-prefix 10.0.0.0/16 \
  --subnet aci-subnet \
  --subnet-address-prefix 10.0.0.0/24

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

Развертывание в существующей виртуальной сети

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

  1. Создайте подсеть в существующей виртуальной сети, используйте существующую подсеть, в которой уже развернута группа контейнеров, или используйте существующую подсеть, очищенную от всех остальных ресурсов и настроек.
  2. Разверните группу контейнеров с помощью команды az container create и укажите один из следующих вариантов настроек:
    • имя виртуальной сети и имя подсети;
    • идентификатор ресурса виртуальной сети и идентификатор ресурса подсети, которые позволяют использовать виртуальную сеть из другой группы ресурсов;
    • идентификатор или имя сетевого профиля, которое можно получить с помощью команды az network profile list.

Пример

В следующем примере выполняется развертывание второй группы контейнеров в той же ранее созданной подсети и проверяется связь между двумя экземплярами контейнера.

Сначала получите IP-адрес первой развернутой группы контейнеров — appcontainer:

az container show --resource-group myResourceGroup \
  --name appcontainer \
  --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-адреса частной подсети первой группы контейнеров.

CONTAINER_GROUP_IP=<container-group-IP-address>

az container create \
  --resource-group myResourceGroup \
  --name commchecker \
  --image alpine:3.5 \
  --command-line "wget $CONTAINER_GROUP_IP" \
  --restart-policy never \
  --vnet aci-vnet \
  --subnet aci-subnet

Когда завершится развертывание второго контейнера, извлеките его журналы, чтобы просмотреть выходные данные выполненной им команды wget:

az container logs --resource-group myResourceGroup --name commchecker

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

Connecting to 10.0.0.4 (10.0.0.4:80)
index.html           100% |*******************************|  1663   0:00:00 ETA

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

Пример — YAML

Возможно также развертывание группы контейнеров в существующей виртуальной сети с помощью файла YAML, шаблона Resource Manager или другого программного метода, например с помощью пакета SDK для Python.

Например, при использовании файла YAML можно выполнить развертывание в виртуальной сети с подсетью, делегированной в Экземпляры контейнеров Azure. Задайте следующие свойства.

  • ipAddress — параметры IP-адреса для группы контейнеров.
    • ports — открываемые порты, если таковые имеются.
    • protocol — протокол (TCP или UDP) для открытого порта.
  • subnetIds — идентификаторы ресурсов подсетей, в которые будут развернуты в
    • id — идентификатор ресурса подсети
    • name — имя подсети

Этот код YAML создает группу контейнеров с именем appcontaineryaml в виртуальной сети.

apiVersion: '2021-07-01'
location: westus
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

Разверните группу контейнеров с помощью команды az container create, указав имя YAML-файла для значения параметра --file.

az container create --resource-group myResourceGroup \
  --file vnet-deploy-aci.yaml

После завершения развертывания выполните команду az container show, чтобы отобразить его состояние. Образец вывода:

Name              ResourceGroup    Status    Image                                       IP:ports     Network    CPU/Memory       OsType    Location
----------------  ---------------  --------  ------------------------------------------  -----------  ---------  ---------------  --------  ----------
appcontaineryaml  myResourceGroup  Running   mcr.microsoft.com/azuredocs/aci-helloworld  10.0.0.5:80  Private    1.0 core/1.5 gb  Linux     westus

Очистка ресурсов

Удаление экземпляров контейнеров

Когда завершите работу с созданными экземплярами контейнеров, удалите их с помощью следующих команд:

az container delete --resource-group myResourceGroup --name appcontainer -y
az container delete --resource-group myResourceGroup --name commchecker -y
az container delete --resource-group myResourceGroup --name appcontaineryaml -y

Удаление сетевых ресурсов

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

Перед выполнением скрипта задайте в качестве переменной RES_GROUP имя группы ресурсов, содержащей виртуальную сеть и подсеть, которые следует удалить. Обновите имя виртуальной сети, если предложенное ранее имя aci-vnet не использовалось. Скрипт отформатирован для оболочки Bash. Если вы предпочитаете использовать другую оболочку, например PowerShell или командную строку, измените методы доступа и присваивание значения переменной соответствующим образом.

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

Этот скрипт удаляет ресурсы! Он удаляет виртуальную сеть и все подсети, которые в ней содержатся. Убедитесь, что вам больше не требуются ресурсы в этой виртуальной сети, включая все содержащиеся в ней подсети, прежде чем запускать этот скрипт. После удаления эти ресурсы восстановить невозможно.

# Replace <my-resource-group> with the name of your resource group
# Assumes one virtual network in resource group
RES_GROUP=<my-resource-group>

# Get network profile ID
# Assumes one profile in virtual network
NETWORK_PROFILE_ID=$(az network profile list --resource-group $RES_GROUP --query [0].id --output tsv)

# Delete the network profile
az network profile delete --id $NETWORK_PROFILE_ID -y

# Delete virtual network
az network vnet delete --resource-group $RES_GROUP --name aci-vnet

Дальнейшие действия