Implementación de una aplicación con una imagen de contenedor personalizada

Precaución

En este artículo se hace referencia a CentOS, una distribución de Linux que está cerca de su estado Final de ciclo vida (EOL). Tenga en cuenta su uso y planifique en consecuencia. Para más información, consulte la Guía de fin de ciclo de vida de CentOS.

Nota:

Azure Spring Apps es el nuevo nombre del servicio Azure Spring Cloud. Aunque el servicio tiene un nuevo nombre, verá el nombre antiguo en algunos lugares durante un tiempo mientras trabajamos para actualizar recursos, como capturas de pantalla, vídeos y diagramas.

La información de este artículo puede ponerse en práctica en:✔️ Estándar ✔️ Enterprise

En este artículo se explica cómo implementar aplicaciones de Spring Boot en Azure Spring Apps con una imagen de contenedor personalizada. La implementación de una aplicación con un contenedor personalizado admite la mayoría de las características que se usan al implementar una aplicación JAR. También se pueden implementar otras aplicaciones Java y no Java con la imagen del contenedor.

Requisitos previos

  • Imagen de contenedor que contiene la aplicación.
  • La imagen se inserta en un registro de imágenes. Para más información, consulte Azure Container Registry.

Nota:

La aplicación web debe escuchar en el puerto 1025 del plan Estándar y en el puerto 8080 del plan Enterprise. La manera de cambiar el puerto depende del marco de la aplicación. Por ejemplo, especifique SERVER_PORT=1025 para aplicaciones de Spring Boot o ASPNETCORE_URLS=http://+:1025/ para aplicaciones de ASP.NET Core. Puede deshabilitar el sondeo para las aplicaciones que no escuchan en ningún puerto. Para obtener más información, vea Configuración de sondeos de estado y períodos de gracia de finalización para aplicaciones hospedadas en Azure Spring Apps.

Implementación de aplicación

Para implementar una aplicación en una imagen de contenedor personalizada, siga estos pasos:

Para implementar una imagen de contenedor, use uno de los siguientes comandos:

  • Para implementar una imagen de contenedor en el Docker Hub público a una aplicación, use el siguiente comando:

    az spring app deploy \
       --resource-group <your-resource-group> \
       --name <your-app-name> \
       --container-image <your-container-image> \
       --service <your-service-name>
    
  • Para implementar una imagen de contenedor desde ACR a una aplicación, o desde otro registro privado a una aplicación, use el siguiente comando:

    az spring app deploy \
       --resource-group <your-resource-group> \
       --name <your-app-name> \
       --container-image <your-container-image> \
       --service <your-service-name>
       --container-registry <your-container-registry> \
       --registry-password <your-password> |
       --registry-username <your-username>
    

Para sobrescribir el punto de entrada de la imagen, agregue los dos argumentos siguientes a cualquiera de los comandos anteriores:

    --container-command "java" \
    --container-args "-jar /app.jar -Dkey=value"

Para deshabilitar la escucha en un puerto para imágenes que no son aplicaciones web, agregue el siguiente argumento a los comandos anteriores:

    --disable-probe true

Matriz de compatibilidad de características

La siguiente matriz muestra qué características se admiten en cada tipo de aplicación.

Característica Aplicaciones de Spring Boot: Implementación de contenedores Aplicaciones Polyglot: Implementación de contenedores Notas
Administración del ciclo de vida de la aplicación ✔️ ✔️
Compatibilidad con los registros de contenedores ✔️ ✔️
Asignar punto de conexión ✔️ ✔️
Azure Monitor ✔️ ✔️
Integración de APM ✔️ ✔️ Compatible con la instalación manual.
La implementación azul-verde ✔️ ✔️
Dominio personalizado ✔️ ✔️
Escalado: escalado automático ✔️ ✔️
Escalado: escalado manual (escalado o reducción horizontales, escalado o reducción verticales) ✔️ ✔️
Identidad administrada ✔️ ✔️
Spring Cloud Eureka & Config Server ✔️
Portal de API para VMware Tanzu ✔️ ✔️ Solo plan Enterprise.
Spring Cloud Gateway para VMware Tanzu ✔️ ✔️ Solo plan Enterprise.
Application Configuration Service for VMware Tanzu ✔️ Solo plan Enterprise.
Application Live View para VMware Tanzu ✔️ Solo plan Enterprise.
Registro del servicio VMware Tanzu ✔️ Solo plan Enterprise.
VNET ✔️ ✔️ Agregar registro para lalista de permitidos en NSG o Azure Firewall.
Dirección IP saliente ✔️ ✔️
E2E TLS ✔️ ✔️ Confíe en una entidad de certificación autofirmado.
Configuraciones de ejecución y preparación ✔️ ✔️
Solución de problemas avanzada: volcado de subproceso, montón o JFR ✔️ La imagen debe incluir Bash y JDK con PATH especificado.
Traiga su propio almacenamiento ✔️ ✔️
Integración del enlace del servicio con el Conector de recursos ✔️
Zona de disponibilidad ✔️ ✔️
Eventos del ciclo de vida de la aplicación ✔️ ✔️
Tamaño reducido de la aplicación: 0,5 vCPU y 512 MB ✔️ ✔️
Automatización de las implementaciones de aplicaciones con Terraform ✔️ ✔️
Eliminación temporal ✔️ ✔️
Experiencia de diagnóstico interactiva (basada en AppLens) ✔️ ✔️
Acuerdo de Nivel de Servicio ✔️ ✔️

Nota:

Las aplicaciones Polyglot incluyen aplicaciones que no son de Spring Boot Java, NodeJS, AngularJS, Python y .NET.

Puntos comunes que se deben tener en cuenta al implementar un contenedor personalizado

Los puntos siguientes le ayudarán a resolver las situaciones más comunes al implementar con una imagen personalizada.

Confiar en una entidad de certificación

Hay dos opciones para confiar en una entidad de certificación:

Opción 1: Cargar a través de Azure Spring Apps

Para cargar los certificados de entidad de certificación en las aplicaciones, consulte Uso de certificados TLS/SSL en la aplicación en Azure Spring Apps. A continuación, los certificados se montarán en la ubicación /etc/azure-spring-cloud/certs/public/.

Opción 2: Instalación manual en la imagen

Para confiar en una CA de la imagen, establezca las siguientes variables en función del entorno:

  • Debe importar aplicaciones de Java en el almacén de confianza y agregar las siguientes líneas a Dockerfile:

    ADD EnterpriseRootCA.crt /opt/
    RUN keytool -keystore /etc/ssl/certs/java/cacerts -storepass changeit -noprompt -trustcacerts -importcert -alias EnterpriseRootCA -file /opt/EnterpriseRootCA.crt
    
  • Para las aplicaciones Node.js, establezca la NODE_EXTRA_CA_CERTS variable de entorno:

    ADD EnterpriseRootCA.crt /opt/
    ENV NODE_EXTRA_CA_CERTS="/opt/EnterpriseRootCA.crt"
    
  • Para Python u otros lenguajes que se basan en el almacén de CA del sistema, en imágenes de Debian o Ubuntu, agregue las siguientes variables de entorno:

    ADD EnterpriseRootCA.crt /usr/local/share/ca-certificates/
    RUN /usr/sbin/update-ca-certificates
    
  • Para Python u otros lenguajes que se basan en el almacén de CA del sistema, en imágenes basadas en CentOS o Fedora, agregue las siguientes variables de entorno:

    ADD EnterpriseRootCA.crt /etc/pki/ca-trust/source/anchors/
    RUN /usr/bin/update-ca-trust
    

Evitar un comportamiento inesperado cuando las imágenes cambien

Cuando se reinicia o se escala horizontalmente en la aplicación, siempre se extraerá la imagen más reciente. Si se ha cambiado la imagen, las instancias de aplicación recién iniciadas usarán la nueva imagen, mientras que las instancias antiguas continuarán usando la imagen anterior.

Nota:

Evite usar la latest etiqueta o sobrescribir la imagen sin cambiar la etiqueta para evitar un comportamiento inesperado de la aplicación.

Evite no poder conectarse al registro de contenedor en una red virtual

Si ha implementado la instancia en una red virtual, asegúrese de permitir el tráfico al registro de contenedor en el NSG o Azure Firewall (si se usa). Para más información, consulte Responsabilidades del cliente para la ejecución en la red virtual para agregar las reglas de seguridad necesarias.

Instale un APM en la imagen manualmente

Los pasos de instalación varían en diferentes monitores de rendimiento de aplicaciones (APMs) e idiomas. Los pasos siguientes son para New Relic con aplicaciones Java. Debe modificar el Dockerfile con los pasos siguientes:

  1. Descargue e instale el archivo del agente en la imagen al agregar lo siguiente al Dockerfile:

    ADD newrelic-agent.jar /opt/agents/newrelic/java/newrelic-agent.jar
    
  2. Agregue las variables de entorno necesarias para APM:

    ENV NEW_RELIC_APP_NAME=appName
    ENV NEW_RELIC_LICENSE_KEY=newRelicLicenseKey
    
  3. Modifique el punto de entrada de la imagen al agregar: java -javaagent:/opt/agents/newrelic/java/newrelic-agent.jar

Para instalar los agentes para otros idiomas, consulte la documentación oficial de los otros agentes:

New Relic:

Dynatrace:

AppDynamics:

Ver los registros del contenedor

Para ver los registros de la consola de la aplicación de contenedor, se puede usar el siguiente comando de la CLI:

az spring app logs \
    --resource-group <your-resource-group> \
    --name <your-app-name> \
    --service <your-service-name> \
    --instance <your-instance-name>

Para ver los registros de eventos del contenedor desde Azure Monitor, escriba la consulta:

AppPlatformContainerEventLogs
| where App == "hw-20220317-1b"

Captura de pantalla de Azure Monitor que muestra el registro de eventos de contenedor.

Examine la imagen en busca de vulnerabilidades

Le recomendamos usar Microsoft Defender for Cloud con ACR para evitar que las imágenes sean vulnerables. Para más información, consulte Microsoft Defender for Cloud

Cambio entre la implementación de JAR y la de contenedores

Puede cambiar el tipo de implementación de JAR a implementación de contenedor directamente mediante la implementación con el siguiente comando:

az spring app deploy \
    --resource-group <your-resource-group> \
    --name <your-app-name> \
    --container-image <your-container-image> \
    --service <your-service-name>

O de forma inversa:

az spring app deploy \
    --resource-group <your-resource-group> \
    --name <your-app-name> \
    --artifact-path <your-jar-file> \
    --service <your-service-name>

Creación de otra implementación con una implementación JAR existente

Puede crear otra implementación mediante una implementación JAR existente con el siguiente comando:

az spring app deployment create \
    --resource-group <your-resource-group> \
    --name <your-deployment-name> \
    --app <your-app-name> \
    --container-image <your-container-image> \
    --service <your-service-name>

CI/CD

Actualmente se admite la automatización de implementaciones con Azure Pipelines Tareas o Acciones de GitHub. Para más información, consulte Automatización de implementaciones de aplicaciones en Azure Spring Apps y Uso de CI/CD de Azure Spring Apps con Acciones de GitHub

Pasos siguientes