Implementación de instancias de contenedor en una red virtual de Azure
Azure Virtual Network proporciona acceso de red seguro y privado a los recursos locales y de Azure. Al implementar grupos de contenedores en una red virtual de Azure, los contenedores pueden comunicarse de forma segura con otros recursos de la red virtual.
En este artículo se muestra cómo usar el comando az container create en la CLI de Azure para implementar grupos de contenedores en una red virtual nueva o existente.
Importante
- Las subredes deben delegarse antes de usar una red virtual
- Antes de implementar grupos de contenedores en redes virtuales, se recomienda comprobar primero la limitación. Para conocer los escenarios y las limitaciones de red, consulte Escenarios y recursos de redes virtuales para Azure Container Instances.
- La implementación del grupo de contenedores en una red virtual está disponible con carácter general para contenedores de Linux y Windows en la mayoría de las regiones donde Azure Container Instances está disponible. Para obtener más información, consulte las regiones disponibles.
Importante
Los perfiles de red han quedado en desuso desde la versión 2021-07-01
de la API. Si usa esta versión o una versión más reciente, omita los pasos y las acciones relacionados con los perfiles de red.
Los ejemplos que aparecen en este artículo están formateados para el shell de Bash. Si prefiere otro shell como PowerShell o el símbolo del sistema, ajuste los caracteres de continuación de línea según corresponda.
Requisitos previos
Definición de las variables de entorno
La ruta de implementación automatizada usa las siguientes variables de entorno y nombres de recursos en esta guía. Los usuarios que continúan a través de la guía manualmente pueden usar sus propias variables y nombres como prefiera.
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"
Crear un grupo de recursos
Necesita un grupo de recursos para administrar todos los recursos usados en los ejemplos siguientes. Para crear un grupo de recursos, use az group create:
az group create --name $MY_RESOURCE_GROUP_NAME --location eastus
Una operación correcta debe generar una salida similar a la siguiente JSON:
Resultados:
{
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx/resourceGroups/myACIResourceGroup123abc",
"location": "abcdef",
"managedBy": null,
"name": "myACIResourceGroup123",
"properties": {
"provisioningState": "Succeeded"
},
"tags": null,
"type": "Microsoft.Resources/resourceGroups"
}
Implementación en una nueva red virtual
Nota:
Si usa el intervalo IP de subred /29 para tener solo 3 direcciones IP. se recomienda ir siempre un intervalo por encima (nunca por debajo). Por ejemplo, use el intervalo IP de subred /28 para que pueda tener al menos 1 o más búferes de IP por grupo de contenedores. Al hacerlo, puede evitar que los contenedores se bloqueen, no puedan iniciarse, reiniciarse o tampoco puedan detener los estados.
Para implementarlos en una nueva red virtual y hacer que Azure cree automáticamente los recursos de red, especifique lo siguiente al ejecutar az container create:
- Nombre de la red virtual
- Prefijo de dirección de red virtual en formato CIDR
- Nombre de subred
- Prefijo de dirección de subred en formato CIDR
Los prefijos de direcciones de subred y red virtual especifican los espacios de direcciones para la subred y la red virtual, respectivamente. Estos valores se representan en notación de Enrutamiento de interdominios sin clases (CIDR), por ejemplo 10.0.0.0/16
. Para más información sobre cómo trabajar con las subredes, consulte Incorporación, cambio o eliminación de una subred de red virtual.
Cuando implemente el primer grupo de contenedores con este método, puede implementarlo en la misma subred; para ello, especifique los nombres de la red virtual y la subred, o el perfil de red que Azure crea automáticamente para usted. Dado que Azure delega la subred en Azure Container Instances, solo puede implementar grupos de contenedores en la subred.
Ejemplo
El comando az container create siguiente especifica valores para una nueva red virtual y una subred. Proporcione el nombre de un grupo de recursos creado en una región en la que haya disponibles implementaciones de grupo de contenedores en una red virtual. Este comando implementa el contenedor aci-helloworld público de Microsoft que ejecuta un pequeño servidor web de Node.js que sirve una página web estática. En la siguiente sección, implementará un segundo grupo de contenedores en la misma subred y probará la comunicación entre las dos instancias de contenedor.
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
Una operación correcta debe generar una salida similar a la siguiente JSON:
Resultados:
{
"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
}
Al implementar en una nueva red virtual mediante este método, la implementación puede tardar unos minutos mientras se crean los recursos de red. Tras la implementación inicial, las implementaciones de grupos de contenedores adicionales en la misma subred se completan más rápido.
Implementación en una red virtual existente
Para implementar un grupo de contenedores en una red virtual existente:
- Cree una subred en la red virtual existente, use una subred existente en la que ya se haya implementado un grupo de contenedores, o bien use una subred existente vacía de todos los demás recursos y configuración. La subred que usó para los grupos de contenedores puede contener solo grupos de contenedores. Antes de implementar un grupo de contenedores en una subred, debe delegar explícitamente la subred antes del aprovisionamiento. Una vez delegada, la subred se puede usar solo para grupos de contenedores. Si intenta implementar recursos distintos de grupos de contenedores en una subred delegada, se produce un error en la operación.
- Implemente un grupo de contenedores con az container create y especifique uno de los siguientes:
- Nombre de red virtual y nombre de subred
- El identificador de recurso de red virtual y el identificador de recurso de subred, lo permite usar una red virtual desde otro grupo de recursos
Implementación mediante un archivo YAML
También puede implementar un grupo de contenedores en una red virtual existente mediante un archivo YAML, una plantilla de Resource Manager u otro método de programación como con el SDK de Python.
Por ejemplo, si usa un archivo YAML, puede realizar la implementación en una red virtual con una subred delegada en Azure Container Instances. Especifique las propiedades siguientes:
ipAddress
: la configuración de direcciones IP privadas para el grupo de contenedores.ports
: los puertos que deben abrirse, si hay alguno.protocol
: el protocolo (TCP o UDP) para el puerto abierto.
subnetIds
: identificadores de recursos de las subredes en las que se va a implementarid
: identificador de recurso de la subredname
: nombre de la subred
Este YAML crea un grupo de contenedores en la red virtual. Escriba el nombre del grupo de contenedores en los campos de nombre y el identificador de subred en el campo Id. de subred. Usamos appcontaineryaml para el nombre. Si necesita encontrar el identificador de subred y ya no tiene acceso a las salidas anteriores, puede usar el comando az container show para verlo. Busque el campo id
en 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
El siguiente comando de Bash es para la ruta de implementación automatizada.
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
Implemente el grupo de contenedores con el comando az container create y especifique el nombre del archivo YAML para el parámetro --file
:
az container create --resource-group $MY_RESOURCE_GROUP_NAME \
--file container-instances-vnet.yaml
El siguiente comando de Bash es para la ruta de implementación automatizada.
rm container-instances-vnet.yaml
Una vez completada la implementación, ejecute el comando az container show para mostrar su estado:
az container list --resource-group $MY_RESOURCE_GROUP_NAME --output table
La salida debe ser similar al ejemplo siguiente:
Resultados:
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
Demostración de la comunicación entre instancias de contenedor
En el ejemplo siguiente se implementa un tercer grupo de contenedores en la misma subred creada anteriormente. Con una imagen de Alpine Linux, comprueba la comunicación entre sí y la primera instancia de contenedor.
Nota:
Debido a la limitación de velocidad en vigor para extraer imágenes públicas de Docker como la instancia de Alpine Linux que se usa aquí, puede recibir un error en el formulario:
(RegistryErrorResponse) Se recibe una respuesta de error del registro de Docker "index.docker.io". Inténtelo de nuevo más tarde. Código: RegistryErrorResponse Message: se recibe una respuesta de error del registro de Docker "index.docker.io". Inténtelo de nuevo más tarde.
El siguiente comando de Bash es para la ruta de implementación automatizada.
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."
En primer lugar, obtenga la dirección IP del primer grupo de contenedores que implementó, appcontainer:
az container show --resource-group $MY_RESOURCE_GROUP_NAME \
--name $MY_APP_CONTAINER_NAME \
--query ipAddress.ip --output tsv
La salida muestra la dirección IP del grupo de contenedores en la subred privada. Por ejemplo:
Resultados:
10.0.0.4
Ahora, establezca CONTAINER_GROUP_IP
en la dirección IP que recuperó con el comando az container show
y ejecute el siguiente comando az container create
. Este segundo contenedor, commchecker, ejecuta una imagen basada en Linux de Alpine y wget
con la dirección IP de la subred privada del primer grupo de contenedores.
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
Una vez completada esta segunda implementación de contenedor, extraiga sus registros para que pueda ver la salida del comando wget
que ejecutó:
az container logs --resource-group $MY_RESOURCE_GROUP_NAME --name $MY_COMM_CHECKER_NAME
Si el segundo contenedor se comunicó correctamente con el primero, la salida es similar a la siguiente:
Connecting to 10.0.0.4 (10.0.0.4:80)
index.html 100% |*******************************| 1663 0:00:00 ETA
La salida del registro debe mostrar que wget
fue capaz de conectarse y descargar el archivo de índice del primer contenedor usando su dirección IP privada en la subred local. El tráfico de red entre los dos grupos de contenedores permanece dentro de la red virtual.
Limpieza de recursos
Si no tiene previsto seguir usando estos recursos, puede eliminarlos para evitar cargos de Azure. Para limpiar todos los recursos que usó en esta guía, elimine el grupo de recursos con el comando az group delete. Una vez eliminado, estos recursos son irrecuperables.
Pasos siguientes
Para implementar una nueva red virtual, subred, perfil de red y grupo de contenedores mediante una plantilla de Resource Manager, consulte el artículo sobre la creación de un grupo de contenedores de Azure con red virtual.
Para implementar Azure Container Instances que puedan extraer imágenes de un Azure Container Registry a través de un punto de conexión privado, consulte Implementación en Azure Container Instances desde Azure Container Registry mediante una identidad administrada.