Configuración de una instancia de NAT Gateway para la dirección IP estática para el tráfico saliente desde un grupo de contenedores

La configuración de un grupo de contenedores con una dirección IP externa permite a los clientes externos usar la dirección IP para tener acceso a un contenedor del grupo. Por ejemplo, un explorador puede acceder a una aplicación web que se ejecute en un contenedor. Sin embargo, actualmente un grupo de contenedores usa una dirección IP diferente para el tráfico saliente. Esta dirección IP de salida no se expone mediante programación, lo que hace que la supervisión del grupo de contenedores y la configuración de las reglas del firewall cliente sean más complejas.

En este artículo encontrará los pasos para configurar un grupo de contenedores en una red virtual integrada en una puerta de enlace de traducción de direcciones de red (NAT). Al configurar una instancia de NAT Gateway para SNAT, un intervalo de direcciones de subred delegado a Azure Container Instances (ACI), puede identificar el tráfico saliente de los grupos de contenedores. El tráfico de salida del grupo de contenedores usará la dirección IP pública de NAT Gateway. Una única instancia de NAT Gateway puede usarse en varios grupos de contenedores implementados en la subred delegada en ACI de dicha red virtual.

En este artículo, se usa la CLI de Azure para crear los recursos para este escenario:

  • Grupos de contenedores implementados en una subred delegada en la red virtual
  • Una instancia de NAT Gateway implementada en la red con una dirección IP pública estática

A continuación, validará la salida de los grupos de contenedores de ejemplo a través de NAT Gateway.

Nota:

El servicio ACI recomienda la integración con NAT Gateway para cargas de trabajo en contenedores que tienen requisitos de salida estática, pero no de entrada estática. Para obtener una arquitectura de ACI que admita tanto la entrada como la salida estáticas, consulte el siguiente tutorial: Uso de Azure Firewall para entrada y salida.

Si no tiene una suscripción a Azure, cree una cuenta gratuita de Azure antes de empezar.

Requisitos previos

Inicio de Azure Cloud Shell

Azure Cloud Shell es un shell interactivo gratuito que puede usar para ejecutar los pasos de este artículo. Tiene las herramientas comunes de Azure preinstaladas y configuradas para usarlas en la cuenta.

Para abrir Cloud Shell, seleccione Pruébelo en la esquina superior derecha de un bloque de código. También puede ir a https://shell.azure.com para iniciar Cloud Shell en una pestaña independiente del explorador.

Cuando se abra Cloud Shell, compruebe que Bash está seleccionado para el entorno. En las sesiones siguientes se usará la CLI de Azure en un entorno de Bash, seleccione Copiar para copiar los bloques de código, péguelos en Cloud Shell y, luego, presione Entrar para ejecutarlos.

Inicio de sesión en Azure

Cloud Shell se autentica de forma automática en la cuenta inicial con la que ha iniciado sesión. Use el script siguiente para iniciar sesión con otra suscripción, y reemplace <Subscription ID> con el id. de la suscripción de Azure. Si no tiene una suscripción a Azure, cree una cuenta gratuita de Azure antes de empezar.

subscription="<subscriptionId>" # add subscription here

az account set -s $subscription # ...or use 'az login'

Para más información, vea Establecimiento de la suscripción activa o Inicio de sesión de forma interactiva

Nota:

Para descargar el script completo, vaya al script completo.

Introducción

En este tutorial, se usa una variable aleatoria. Si usa un grupo de recursos existente, modifique el valor de esta variable adecuadamente.

resourceGroup=resourceGroup$RANDOM

Grupo de recursos de Azure: si aún no tiene un grupo de recursos de Azure, cree un grupo de recursos con el comando az group create. Modifique el valor de ubicación según sea necesario.

az group create --name $resourceGroup --location eastus

Implementación de ACI en una red virtual

En un caso típico, es posible que ya tenga una instancia de Azure Virtual Network donde implementar un grupo de contenedores. Para fines de demostración, los siguientes comandos crean una red virtual y una subred cuando se crea el grupo de contenedores. La subred se delega en Azure Container Instances.

El grupo de contenedores ejecuta una pequeña aplicación web desde la imagen aci-helloworld. Como se muestra en otros artículos de la documentación, esta imagen empaqueta una pequeña aplicación web escrita en Node.js que sirve una página HTML estática.

Cree el grupo de contenedores con el comando az container create:

az container create \
  --name appcontainer \
  --resource-group $resourceGroup \
  --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

Nota:

Ajuste el valor de --subnet address-prefix para el espacio de direcciones IP que necesita en la subred. La subred compatible más pequeña es /29, que proporciona ocho direcciones IP. Algunas >direcciones IP están reservadas para su uso por parte de Azure, sobre las que puede obtener más información aquí.

Crear una dirección IP pública

En las secciones siguientes, use la CLI de Azure para implementar una instancia de NAT Gateway de Azure en la red virtual. Para obtener más información, consulte Inicio rápido: Creación de NAT Gateway con la CLI de Azure.

En primer lugar, use az network vnet public-ip create para crear una dirección IP pública para NAT Gateway. Se usará para acceder a Internet. Recibirá una advertencia sobre un próximo cambio importante en el que las direcciones IP de SKU estándar tendrán en cuenta la zona de disponibilidad de manera predeterminada. Puede obtener más información sobre el uso de zonas de disponibilidad y direcciones IP públicas aquí.

az network public-ip create \
  --name myPublicIP \
  --resource-group $resourceGroup \
  --sku standard \
  --zone 1 \
  --allocation static

Almacene la dirección IP pública en una variable para usarla durante el paso de validación más adelante en este script.

ngPublicIp="$(az network public-ip show \
  --name myPublicIP \
  --resource-group $resourceGroup \
  --query ipAddress --output tsv)"

Implementación de NAT Gateway en una red virtual

Use el siguiente comando az network nat gateway create para crear una instancia de NAT Gateway que use la dirección IP pública que creó en el paso anterior.

az network nat gateway create \
  --resource-group $resourceGroup \
  --name myNATgateway \
  --public-ip-addresses myPublicIP \
  --idle-timeout 10

Configuración del servicio NAT para la subred de origen

Se va a configurar la subred de origen aci-subnet para usar el recurso de NAT Gateway concreto myNATgateway con az network vnet subnet update. Este comando activará el servicio NAT en la subred especificada.

az network vnet subnet update \
    --resource-group $resourceGroup  \
    --vnet-name aci-vnet \
    --name aci-subnet \
    --nat-gateway myNATgateway

Prueba de la salida desde un grupo de contenedores

Para probar el acceso de entrada al appcontainer que se ejecuta en la red virtual, vaya a la dirección IP pública del firewall. Anteriormente, almacenó la dirección IP pública en la variable $NG_PUBLIC_IP.

Implemente el siguiente contenedor de ejemplo en la red virtual. Cuando se ejecuta, envía una única solicitud HTTP a http://checkip.dyndns.org, que muestra la dirección IP del remitente (la dirección IP de salida). Si la regla de aplicación en el firewall está configurada correctamente, se devuelve la dirección IP pública del firewall.

az container create \
  --resource-group $resourceGroup \
  --name testegress \
  --image mcr.microsoft.com/azuredocs/aci-tutorial-sidecar \
  --command-line "curl -s http://checkip.dyndns.org" \
  --restart-policy OnFailure \
  --vnet aci-vnet \
  --subnet aci-subnet

Vea los registros de contenedor para confirmar que la dirección IP sea la misma que la dirección IP pública creada en el primer paso del tutorial.

az container logs \
  --resource-group $resourceGroup \
  --name testegress

La salida es parecida a esta:

<html><head><title>Current IP Check</title></head><body>Current IP Address: 52.142.18.133</body></html>

LA dirección IP debe coincidir con la dirección IP pública creada en el primer paso del tutorial.

echo $ngPublicIp

Limpieza de recursos

Cuando ya no los necesite, puede usar el comando az group delete para quitar el grupo de recursos y todos los recursos relacionados como se indica a continuación. El parámetro --no-wait devuelve el control a la petición de confirmación sin esperar a que finalice la operación. El parámetro --yes confirma que desea eliminar los recursos sin pedir confirmación adicional.

az group delete --name $resourceGroup --yes --no-wait

Pasos siguientes

En este artículo, configuró grupos de contenedores en una red virtual detrás de una instancia de NAT Gateway de Azure. Mediante esta configuración, configuró una única dirección IP estática para la salida desde grupos de contenedores de Azure Container Instances.

Para obtener ayuda para la resolución de problemas, consulte Solución de problemas de conectividad de Azure Virtual Network NAT.