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 con un estado de finalización del servicio (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:
Los planes Básico, Estándar y Enterprise quedarán en desuso a partir de mediados de marzo de 2025, con un período de retirada de 3 años. Se recomienda realizar la transición a Azure Container Apps. Para más información, consulte el anuncio de retirada de Azure Spring Apps.
El plan Estándar por consumo y dedicado quedará obsoleto a partir del 30 de septiembre de 2024, con un cierre completo al cabo de seis meses. Se recomienda realizar la transición a Azure Container Apps. Para más información, consulte Migrar el plan Estándar por consumo y dedicado de Azure Spring Apps a Azure Container Apps.
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:
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
Agregue las variables de entorno necesarias para APM:
ENV NEW_RELIC_APP_NAME=appName ENV NEW_RELIC_LICENSE_KEY=newRelicLicenseKey
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:
- Python: Instalación del agente de Python
- Node.js: Instalación del agente de Node.js
Dynatrace:
- Python: Instrumentación de aplicaciones de Python con OpenTelemetry
- Node.js: Instrumentación de aplicaciones de Node.js con OpenTelemetry
AppDynamics:
- Python: Instalación del agente de Python
- Node.js: Instalación del agente de Node.js
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"
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