Contenedores en Azure Container Apps
Azure Container Apps le administra los detalles de Kubernetes y las orquestaciones de contenedores. Los contenedores de Azure Container Apps pueden usar cualquier runtime, lenguaje de programación o pila de desarrollo de su elección.
Azure Container Apps admite:
- Cualquier imagen de contenedor x86-64 (
linux/amd64
) basada en Linux sin ninguna imagen base necesaria - Contenedores de cualquier registro de contenedor público o privado
- Contenedores sidecar e init
Las características también incluyen:
- Los cambios en la
template
sección de configuración desencadenan una nueva revisión de la aplicación contenedora. - Si un contenedor se bloquea, se reinicia automáticamente.
Entre las características de los trabajos se incluyen:
- Las ejecuciones de trabajos usan la
template
sección de configuración para definir la imagen del contenedor y otras opciones cuando se inicia cada ejecución. - Si un contenedor sale con un código de salida distinto de cero, la ejecución del trabajo se marca como errónea. Puede configurar un trabajo para reintentar ejecuciones con errores.
Configuración
El código siguiente es un ejemplo de la matriz containers
en la sección properties.template
de una plantilla de recursos de aplicación de contenedor. El extracto muestra las opciones de configuración disponibles al configurar un contenedor.
{
"properties": {
"template": {
"containers": [
{
"name": "main",
"image": "[parameters('container_image')]",
"env": [
{
"name": "HTTP_PORT",
"value": "80"
},
{
"name": "SECRET_VAL",
"secretRef": "mysecret"
}
],
"resources": {
"cpu": 0.5,
"memory": "1Gi"
},
"volumeMounts": [
{
"mountPath": "/appsettings",
"volumeName": "appsettings-volume"
}
],
"probes": [
{
"type": "liveness",
"httpGet": {
"path": "/health",
"port": 8080,
"httpHeaders": [
{
"name": "Custom-Header",
"value": "liveness probe"
}
]
},
"initialDelaySeconds": 7,
"periodSeconds": 3
},
{
"type": "readiness",
"tcpSocket": {
"port": 8081
},
"initialDelaySeconds": 10,
"periodSeconds": 3
},
{
"type": "startup",
"httpGet": {
"path": "/startup",
"port": 8080,
"httpHeaders": [
{
"name": "Custom-Header",
"value": "startup probe"
}
]
},
"initialDelaySeconds": 3,
"periodSeconds": 3
}
]
}
]
},
"initContainers": [
{
"name": "init",
"image": "[parameters('init_container_image')]",
"resources": {
"cpu": 0.25,
"memory": "0.5Gi"
},
"volumeMounts": [
{
"mountPath": "/appsettings",
"volumeName": "appsettings-volume"
}
]
}
]
...
}
...
}
Configuración | Descripción | Comentarios |
---|---|---|
image |
Nombre de la imagen de contenedor para la aplicación de contenedor. | Este valor toma la forma de repository/<IMAGE_NAME>:<TAG> . |
name |
Nombre descriptivo del contenedor. | Se usa para la identificación y los informes. |
command |
Comando de inicio del contenedor. | Equivalente al campo de punto de entrada de Docker. |
args |
Argumentos del comando de inicio. | Las entradas de la matriz se unen para crear una lista de parámetros que se pasa al comando de inicio. |
env |
Matriz de pares clave-valor que definen variables de entorno. | Utilice secretRef en lugar del campo value para hacer referencia a un secreto. |
resources.cpu |
Número de CPU asignadas al contenedor. | Con el plan de consumo, los valores deben cumplir las siguientes reglas: • mayor que cero • menor o igual que 2 • puede ser cualquier número decimal (con un máximo de dos posiciones decimales) Por ejemplo, 1.25 es válido, pero 1.555 no lo es.El valor predeterminado es 0,25 CPU por contenedor. Cuando se usa el perfil de carga de trabajo Consumo en el plan Dedicado, se aplican las mismas reglas, excepto que las CPU deben ser menores o iguales a 4. Cuando se usa el plan Dedicado, el número máximo de CPU debe ser menor o igual que el número de núcleos disponibles en el perfil en el que se ejecuta la aplicación contenedora. |
resources.memory |
Cantidad de RAM asignada al contenedor. | Con el plan de consumo, los valores deben cumplir las siguientes reglas: • mayor que cero • menor o igual que 4Gi • puede ser cualquier número decimal (con un máximo de dos posiciones decimales) Por ejemplo, 1.25Gi es válido, pero 1.555Gi no lo es.La opción predeterminada es 0.5Gi por contenedor.Cuando se usa la carga de trabajo Consumo en el plan dedicado, se aplican las mismas reglas, excepto que la memoria debe ser menor o igual que 8Gi .Cuando se usa el plan Dedicado, la memoria máxima debe ser menor o igual que la cantidad de memoria disponible en el perfil donde se ejecuta la aplicación contenedora. |
volumeMounts |
Una matriz de definiciones de montaje de volumen. | Puede definir un volumen temporal o varios volúmenes de almacenamiento permanentes para el contenedor. Para obtener más información sobre los volúmenes de almacenamiento, consulte Uso de montajes de almacenamiento en Azure Container Apps. |
probes |
Una matriz de sondeos de estado habilitados en el contenedor. | Esta característica se basa en sondeos de estado de Kubernetes. Para más información sobre la configuración de sondeos, consulte Sondeos de estado en Azure Container Apps. |
Cuando se usa el plan de consumo o una carga de trabajo consumo en el plan dedicado, las asignaciones totales de CPU y memoria solicitadas para todos los contenedores de una aplicación de contenedor deben agregar hasta una de las siguientes combinaciones.
vCPU (núcleos) | Memoria | Plan de consumo | Perfil de carga de trabajo de consumo |
---|---|---|---|
0.25 |
0.5Gi |
✔ | ✔ |
0.5 |
1.0Gi |
✔ | ✔ |
0.75 |
1.5Gi |
✔ | ✔ |
1.0 |
2.0Gi |
✔ | ✔ |
1.25 |
2.5Gi |
✔ | ✔ |
1.5 |
3.0Gi |
✔ | ✔ |
1.75 |
3.5Gi |
✔ | ✔ |
2.0 |
4.0Gi |
✔ | ✔ |
2.25 |
4.5Gi |
✔ | |
2.5 |
5.0Gi |
✔ | |
2.75 |
5.5Gi |
✔ | |
3.0 |
6.0Gi |
✔ | |
3.25 |
6.5Gi |
✔ | |
3.5 |
7.0Gi |
✔ | |
3.75 |
7.5Gi |
✔ | |
4.0 |
8.0Gi |
✔ |
El total de las solicitudes de CPU en todos los contenedores debe coincidir con uno de los valores de la columna vCPU .
El total de las solicitudes de memoria de todos los contenedores deben coincidir con el valor de memoria de la columna de memoria en la misma fila de la columna de CPU.
Al usar el perfil consumo en el plan Dedicado, las asignaciones totales de CPU y memoria solicitadas para todos los contenedores de una aplicación de contenedor deben ser menores o iguales que los núcleos y la memoria disponibles en el perfil.
Varios contenedores
En escenarios avanzados, puede ejecutar varios contenedores en una sola aplicación de contenedor. Use este patrón solo en instancias específicas en las que los contenedores estén estrechamente acoplados.
Para la mayoría de los escenarios de microservicios, el procedimiento recomendado es implementar cada servicio como una aplicación de contenedor independiente.
Los varios contenedores de la misma aplicación de contenedor comparten el disco duro y los recursos de red y experimentan el mismo ciclo de vida de la aplicación.
Hay dos maneras de ejecutar varios contenedores en una aplicación de contenedor: contenedores sidecar y contenedores de inicialización.
Contenedores sidecar
Puede definir varios contenedores en una sola aplicación contenedora para implementar el patrón sidecar.
Algunos ejemplos de contenedores sidecar son los siguientes:
Un agente que lee los registros del contenedor de aplicaciones principal en un volumen compartido y los reenvía a un servicio de registro.
Un proceso en segundo plano que actualiza una memoria caché usada por el contenedor de aplicaciones principal en un volumen compartido.
Estos escenarios son ejemplos y no representan las únicas formas de implementar un sidecar.
Para ejecutar varios contenedores en una aplicación de contenedor, agregue más de un contenedor en la matriz containers
de la plantilla de aplicación contenedora.
Iniciar contenedores
Puede definir uno o varios contenedores de inicialización en una aplicación contenedora. Los contenedores de inicialización se ejecutan antes del contenedor de aplicaciones principal y se usan para realizar tareas de inicialización, como descargar datos o preparar el entorno.
Los contenedores de inicialización se definen en la initContainers
matriz de la plantilla de aplicación contenedora. Los contenedores se ejecutan en el orden en que se definen en la matriz y deben completarse correctamente antes de que se inicie el contenedor de la aplicación principal.
Nota:
Los contenedores de inicialización admiten la extracción de imágenes mediante identidades administradas, pero los procesos que se ejecutan en contenedores de inicialización no tienen acceso a identidades administradas.
Registros de contenedor
Puede implementar imágenes hospedadas en registros privados proporcionando credenciales en la configuración de Container Apps.
Para usar un registro de contenedor, defina los campos necesarios en la matriz registries
en la sección properties.configuration
de la plantilla de recursos de la aplicación de contenedor. El campo passwordSecretRef
identifica el nombre del secreto en el nombre de la matriz secrets
donde definió la contraseña.
{
...
"registries": [{
"server": "docker.io",
"username": "my-registry-user-name",
"passwordSecretRef": "my-password-secret-name"
}]
}
Las credenciales guardadas se usan para extraer una imagen de contenedor del registro privado a medida que se implementa la aplicación.
En el ejemplo siguiente se muestra cómo configurar las credenciales de Azure Container Registry en una aplicación contenedora.
{
...
"configuration": {
"secrets": [
{
"name": "acr-password",
"value": "my-acr-password"
}
],
...
"registries": [
{
"server": "myacr.azurecr.io",
"username": "someuser",
"passwordSecretRef": "acr-password"
}
]
}
}
Nota:
Docker Hub limita el número de descargas de imágenes de Docker. Cuando se alcanza el límite, los contenedores de la aplicación no se iniciarán. Use un registro con límites suficientes, como Azure Container Registry para evitar este problema.
Identidad administrada con Azure Container Registry
Puede usar una identidad administrada de Azure para autenticarse con Azure Container Registry en lugar de usar un nombre de usuario y una contraseña. Para obtener más información, vea Identidades administradas en Azure Container Apps.
Al asignar una identidad administrada a un registro, use el identificador de recurso de identidad administrada para una identidad asignada por el usuario o system
para la identidad asignada por el sistema.
{
"identity": {
"type": "SystemAssigned,UserAssigned",
"userAssignedIdentities": {
"<IDENTITY1_RESOURCE_ID>": {}
}
}
"properties": {
"configuration": {
"registries": [
{
"server": "myacr1.azurecr.io",
"identity": "<IDENTITY1_RESOURCE_ID>"
},
{
"server": "myacr2.azurecr.io",
"identity": "system"
}]
}
...
}
}
Para obtener más información sobre cómo configurar identidades asignadas por el usuario, consulte Adición de una identidad asignada por el usuario.
Limitaciones
Azure Container Apps tiene las siguientes limitaciones:
Contenedores con privilegios: Azure Container Apps no permite el modo de contenedores con privilegios con acceso de nivel de host.
Sistema operativo: se necesitan imágenes de contenedor basadas en Linux (
linux/amd64
).