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: Containers

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).

Pasos siguientes