Implantar instâncias de contêiner em uma rede virtual do Azure

A Rede Virtual do Azure fornece uma rede privada segura para seus recursos locais e do Azure. Implantando grupos de contêineres em uma rede virtual do Azure, os contêineres podem se comunicar com segurança com outros recursos na rede virtual.

Este artigo mostra como usar o comando az container create na CLI do Azure para implantar grupos de contêineres em uma nova rede virtual ou em uma rede virtual existente.

Importante

Antes de implantar grupos de contêineres em redes virtuais, sugerimos primeiro verificar a limitação. Para cenários de rede e limitações, consulte Cenários e recursos de rede virtual para Instâncias de Contêiner do Azure.

Importante

A implantação de grupo de contêineres em uma rede virtual está geralmente disponível para contêineres Linux e Windows, na maioria das regiões onde as Instâncias de Contêiner do Azure estão disponíveis. Para obter detalhes, consulte regiões disponíveis.

Importante

Os perfis de rede foram descontinuados na versão 2021-07-01 da API. Se você estiver usando essa ou uma versão mais recente, ignore as etapas e ações relacionadas aos perfis de rede.

Os exemplos neste artigo são formatados para o shell do Bash. Se você preferir outro shell, como o PowerShell ou o Prompt de Comando, ajuste os caracteres de continuação de linha adequadamente.

Implantar em uma rede virtual nova

Observação

Se estiver usando o intervalo de IP da sub-rede /29 para ter apenas 3 endereços IP, recomendamos sempre ir para um intervalo acima (nunca abaixo). Por exemplo, use o intervalo de IP da sub-rede /28 para poder ter no mínimo 1 ou mais buffers de IP por grupo de contêineres. Ao fazer isso, você conseguirá evitar contêineres nos estados emperrado, incapaz de iniciar, reiniciar ou mesmo incapaz de parar.

Para implantar em uma nova rede virtual e fazer o Azure criar os recursos de rede para você automaticamente, especifique o seguinte quando executar az container create:

  • Nome da rede virtual
  • Prefixo do endereço da rede virtual no formato CIDR
  • Nome da sub-rede
  • Prefixo do endereço da sub-rede no formato CIDR

Os prefixos do endereço da rede virtual e da sub-rede especificam os espaços de endereço para a rede virtual e a sub-rede, respectivamente. Esses valores são representados na notação CIDR (Roteamento Entre Domínios Sem Classe); por exemplo, 10.0.0.0/16. Para obter mais informações sobre como trabalhar com sub-redes, consulte Adicionar, alterar ou excluir uma sub-rede da rede virtual.

Depois de implantar seu primeiro grupo de contêineres com esse método, você pode implantar na mesma sub-rede especificando os nomes da rede virtual e da sub-rede ou o perfil de rede que o Azure cria automaticamente para você. Como o Azure delega a sub-rede para Instâncias de Contêiner do Azure, é possível implantar apenas grupos de contêineres na sub-rede.

Exemplo

O comando az container create a seguir especifica as configurações para uma nova rede virtual e sub-rede. Forneça o nome de um grupo de recursos que foi criado em uma região onde as implantações de grupo de contêineres em uma rede virtual estão disponíveis. Esse comando implanta o contêiner aci-helloworld da Microsoft público, que executa um servidor da Web Node.js pequeno que atende a uma página da Web estática. Na próxima seção, você implantará um segundo grupo de contêineres na mesma sub-rede e testará a comunicação entre as duas instâncias de contêiner.

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

Quando você implanta em uma nova rede virtual usando esse método, a implantação pode demorar alguns minutos enquanto os recursos de rede são criados. Após a implantação inicial, as implantações adicionais do grupo de contêineres para a mesma sub-rede são concluídas mais rapidamente.

Implantar em uma rede virtual existente

Para implantar um grupo de contêineres em uma rede virtual existente:

  1. Crie uma sub-rede em sua rede virtual existente, use uma sub-rede existente na qual um grupo de contêineres já esteja implantado ou use uma sub-rede existente esvaziada de todos os outros recursos e configurações.
  2. Implante um grupo de contêineres com az container create e especifique um dos itens a seguir:
    • Nome da rede virtual e nome da sub-rede
    • ID de recurso de rede virtual e ID de recurso de sub-rede, que permite usar uma rede virtual de um grupo de recursos diferente
    • Nome ou ID do perfil de rede, que você pode obter usando lista de perfis de rede az

Exemplo

O exemplo a seguir implanta um segundo grupo de contêineres na mesma sub-rede criada anteriormente e verifica a comunicação entre as duas instâncias de contêiner.

Primeiramente, obtenha o endereço IP do primeiro grupo de contêineres que você implantou, o appcontainer:

az container show --resource-group myResourceGroup \
  --name appcontainer \
  --query ipAddress.ip --output tsv

A saída exibe o endereço IP do grupo de contêineres na sub-rede privada. Por exemplo:

10.0.0.4

Agora, defina CONTAINER_GROUP_IP como o IP recuperado com o comando az container show e execute o seguinte comando az container create. Esse segundo contêiner, commchecker, executa uma imagem com base em Linux Alpine e executa wget em relação ao endereço IP da sub-rede privada do primeiro grupo de contêineres.

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

Após a conclusão dessa segunda implantação de contêiner, extraia seus logs para que você possa ver a saída do comando wget executado por ele:

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

Se o segundo contêiner tiver se comunicado com êxito com o primeiro, a saída será semelhante a:

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

A saída de log deve mostrar que wget conseguiu se conectar e baixar o arquivo de índice do primeiro contêiner usando seu endereço IP privado na sub-rede local. O tráfego de rede entre os dois grupos de contêineres permaneceu dentro da rede virtual.

Exemplo – YAML

Você também pode implantar um grupo de contêineres em uma rede virtual existente usando um arquivo YAML, um modelo do Resource Manager ou outro método programático, como com o SDK do Python.

Por exemplo, ao usar um arquivo YAML, você pode implantar em uma rede virtual com uma sub-rede delegada para Instâncias de Contêiner do Azure. Especifique as seguintes propriedades:

  • ipAddress: as configurações de endereço IP para o grupo de contêineres.
    • ports: as portas a serem abertas, se houver.
    • protocol: o protocolo (TCP ou UDP) para a porta aberta.
  • subnetIds: As IDs de recurso das sub-redes a serem implantadas
    • id: ID do recurso da da sub-rede
    • name: o nome da sub-rede

Esse YAML cria um grupo de contêineres chamado appcontaineryaml em sua rede virtual.

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

Implante o grupo de contêineres com o comando az container create, especificando o nome do arquivo YAML para o parâmetro --file:

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

Depois que a implantação for concluída, execute o comando az container show para exibir seu status. Saída de exemplo:

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

Limpar os recursos

Excluir instâncias de contêiner

Quando terminar de trabalhar com as instâncias de contêiner que criou, exclua-as com os comandos a seguir:

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

Excluir recursos de rede

Esse recurso atualmente exige vários comandos adicionais para excluir os recursos de rede criados anteriormente. Se você usou os comandos de exemplo nas seções anteriores deste artigo para criar sua rede virtual e sub-rede, pode usar o script a seguir para excluir esses recursos de rede. O script pressupõe que o grupo de recursos contém uma única rede virtual com um único perfil de rede.

Antes de executar o script, defina a variável RES_GROUP como o nome do grupo de recursos que contém a rede virtual e a sub-rede que devem ser excluídas. Atualize o nome da rede virtual se você não tiver usado o nome aci-vnet sugerido anteriormente. O script é formatado para o shell do Bash. Se você preferir outro shell, como o PowerShell ou o Prompt de Comando, você precisará ajustar a atribuição de variável e os acessadores adequadamente.

Aviso

Esse script exclui recursos! Ele exclui a rede virtual e todas as sub-redes que ela contém. Certifique-se de que você não precisa mais de qualquer um dos recursos na rede virtual, incluindo todas as sub-redes que ela contém, antes de executar esse script. Depois de excluídos, esses recursos são irrecuperáveis.

# 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

Próximas etapas