Cadda vez mas, las organizaciones operan en entornos híbridos y multicloud, la seguridad, el gobierno y la gestión coherente de recursos y aplicaciones se convierte en un desafío esencial. Azure Arc surge como la respuesta de Microsoft para extender los servicios y el control de Azure más allá de su propia nube, permitiendo administrar servidores, clústeres de Kubernetes y bases de datos en cualquier infraestructura, ya sea local o en otros proveedores.
Por otro lado, Azure Container Apps ofrece un entorno serverless diseñado para ejecutar aplicaciones basadas en contenedores sin necesidad de gestionar la complejidad de la infraestructura subyacente. Con soporte nativo para microservicios, escalado automático y eventos, se convierte en una pieza clave para acelerar la innovación y simplificar el ciclo de vida de las aplicaciones modernas.
La combinación de Azure Arc y Container Apps abre la puerta a un modelo operativo unificado: desplegar, escalar y gobernar aplicaciones en contenedores desde una única plataforma, sin importar dónde residan los recursos. Este enfoque no solo potencia la flexibilidad y la portabilidad, sino que también garantiza seguridad, cumplimiento y consistencia en entornos distribuidos.
En este árticulo os voy a mostrar como integrar un clúster K8s desplegado en un servidor no Azure (en el ejemplo AWS) y como voy a controlar desde el portal de Azue, con Azure ARC y App Container el despliegue y actualización de aplicaciones.
Requerimientos para esta demo #
Para esta demo he utilizado:
- 1 Máquina Virtual con 16Gb de RAM y 4 cores desplegada en AWS tipo t3.large
El tamaño de la máquina virtual dependerá del número y tipo de aplicaciones a desplegar, para esta demo con estos recursos es suficiente.
⚠️ En VMs t3.large con 8 Gb de Ram y 2 Cores se quedan los PODs en Pending por falta de recursos
-
Software:
- Sistema Operativo Ubuntu 24.04
- MicroK8s (Gestor de Contenedores)
- Kubectl
- Helm
- Azure Cli
- Conexión a Internet
-
Permisos en Azure:
- Usuario o UMI con permisos sobre el Grupo de Recursos o subscripción donde añadiremos la VM.
- Otros permisos pueden ser necearios en función del ROL de administrador que deseemos sobre la VM.
⚠️ Consideraciones importantes Permisos mínimos recomendados: Si solo necesitas registrar una VM en Arc, el rol Connected Machine Resource Administrator es suficiente.
Para la demo utilizaremos un usuario Contributor a nivel de subscripción. Si queremos utilizar una UMI necesitaremos un usuario con permisos de Owner para poder asignar los permisos sobre el grupo de recursos a la UMI.
Paso 1: Instalar los requerimientos de software #
(Este procedimiento se realizara sobre los dos servidores desplegados. En el ejemplo solo añadimos uno)
Para esta demo obviaremos añadir nuestra VM a Azure ARC como VM Gestionada, aunque es recomendable hacerlo.
Azure CLI #
Para instalar Azure CLI (AZ Cli en adelante), ejecutaremos el siguiente comando:
1curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
Mas información en Azure Learn
MicroK8s #
Para descargar e instalar MicroK8s utilizaremos SNAP con el modificador –classic. También instalaremos kubectl y Helm.
Aunque es posible gestionar el clúster MicroK8s con su propia CLI, utilizaremos Kubectl por estar más familiarizados con él.
sudo snap install microk8s --classic
sudo snap install kubectl --classic
sudo snap install heml --classic
Para terminar con la configuración de MicroK8s solo será necesario obtener permisos de administración con los siguientes comandos:
mkdir ~/.kube
sudo usermod -a -G microk8s *usuario*
sudo chown -R *usario* ~/.kube
newgrp microk8s
y vincularlo con Kubectl:
microk8s config > ~/.kube/config
Creamos .kube para guardar el config y asignamos permisos de administración sobre microk8s añadiendo nuestro usuario al grupo. Con el siguiente comando podemos verificar la instalación:
microk8s status
y verificar el acceso a los PODs:
kubectl get pods -A
En este paso ya tenemos configurado nuestra maquina virtual para poder vincularla a Azure ARC.
Paso 2: Onboard clúster en Azure ARC #
En este punto añadiremos nuestro clúster a Azure ARC para que pueda ser gestionado por Azure y así poder desplegar posteriormente Azure App Containers.
Para ello, iremos al portal de Azure y buscaremos Azure ARC.
Una vez en Azure ARC, añadiremos iniciaremos el asistente de Azure ARC
El primer paso del asistente es asignar subscripción, grupo de recurso y nombre que asignaremos al clúster en el portal de Azure.
Luego seleccionaremos el tipo de conexión de red. Las opciones son:
- Public Endpoint: En este tipo de conexiones, el clúster conecta con Azure ARC directamente usando los endpoint públicos de Azure, el único requerimiento es tener IP pública.
- Proxy Server: Se utilizara en redes muy grandes o que por seguridad tengan el tráfico hacía Internet controlado. En este tipo de conexiones, los recursos de ARC se conectan a un servidor Proxy y este hace de Gateway hacía Azure. Requiere la instalación de un servidor que haga de Proxy.
- Private Endpoint: La conexión entre los agentes y Azure se hace por red privada, implica tener VPN o ExpressRoute hacía Azure y configurar la resolución DNS correctamente.
Para esta demos utilizaremos Public Endpoint
Pulsaremos en Siguiente y nos pedirá información de etiquetado. Para la demo nos saltaremos este paso, pero en entornos reales es fundamental para organizar los recursos y poder gestionarlos.
Para finalizar, Azure creara el script que necesitamos para añadir nuestro clúster. En mi caso:
# This script creates an Azure Arc resource to connect a Kubernetes clúster to Azure
# Documentation: https://aka.ms/AzureArcK8sDocs
# Log into Azure
az login --use-device-code
# Set Azure subscription
az account set --subscription "xxxxxxx-xxxxxxx-xxxxxxx-xxxxxx"
# Create connected clúster
az connectedk8s connect --name "ubuntuarc001-k8s" --resource-group "RG_JPP_EU_AzureCloudLab" --location "eastus" --correlation-id "c18ab9d0-685e-48e7-ab55-12588447b0ed" --tags "Datacenter=Urso City=Osuna StateOrDistrict=Sevilla CountryOrRegion=Spain"
Ejecutaremos el script en nuestra VM.
Desde hace algunas versiones, microk8s da un error de certificado al unirse a Azure ARC.
Para resolver el error. Ejecutaremos el siguiente Script para regenerar los certificados del cluster con las key correctas:
mkdir cadir
openssl genrsa -out cadir/ca.key 2048
openssl req -x509 -new -nodes -key cadir/ca.key -sha256 -days 360 -out cadir/ca.crt -addext "keyUsage=critical,digitalSignature,keyCertSign"
sudo microk8s.refresh-certs cadir
microk8s stop
microk8s start
⚠️ Si los PODs no levantan volved a ejecutar microk8s stop y start o reiniciar el servidor.
Volvemos a generar Kubeconfig y verificamos
microk8s config > ~/.kube/config
kubectl get nodes
Si todo es correcto, volvemos a ejecutar el script para unir el clúster a Azure ARC
Una vez finalizado el proceso podremos comprobar como se han añadido varios PODs relacionados con Azure ARC:
Bien en este punto ya tenemos el clúster integrado en Azure ARC:
Azure Container App sobre K8s Connected clúster funciona mediante la extensión Container Apps en Azure Arc. Azure Container Apps en Azure Arc crea un Custom Location sobre un clúster de Kubernetes habilitado con Arc. Ese Custom Location actúa como una “proyección” de tu infraestructura local o multicloud dentro de Azure, permitiendo desplegar aplicaciones de Azure Container Apps en tu propio clúster como si estuvieras en una región de Azure.
El proceso de instalación consta de tres fases:
- Instalación de la Extensión: Esta extensión habilita los recursos necesarios para ejecutar Container Apps (como el runtime y el plano de control).
- Creación de Custom Location: El Custom Location es un recurso de Azure que vincula el clúster Arc con servicios PaaS.
- Creación de Connected Environment: Se define un Azure Container Apps Connected Environment dentro del Custom Location. Actúa igual que un Container App Environment.
En resumen:
Elemento Función Container App Extension Habilita soporte de Container Apps en clúster >Arc Custom Location Proyección del clúster Arc como “región extendida” Connected Environment Entorno lógico donde se despliegan Container >Apps
Requisitos #
A nivel de Kubernetes, Container Apps requiere la capacidad de desplegar servicios de tipo Load Balancer. Dado que este tipo de recursos de Kubernetes solo está disponible nativamente en clústeres desplegados en proveedores de nube pública, es necesario utilizar soluciones de terceros para clústeres on-premises o híbridos. MetalLB es una de las implementaciones más populares que proporciona esta funcionalidad para clústeres bare-metal y microk8s lo implementa de forma sencilla mediante un addons.
microk8s enable metallb:10.0.5.20-10.0.5.30
10.0.5.20-10.0.5.30 es direccionamiento de mi red, adaptarlo a vuestra red.
Adicionalmente, en nuestro caso, al ser una VM de AWS es necesario reservar esas IPs en la ENI (Network Interface) de la instancia EC2.
Instalación de la Extensión #
# Preparamos Variables
EXTENSION_NAME="appcontainer-ext"
NAMESPACE="appcontainer"
CONNECTED_ENVIRONMENT_NAME="appcontainer-arc-env"
GROUP_NAME="RG_JPP_EU_AzureCloudLab"
CLUSTER_NAME="ubuntuarc001-k8s"
# Instalamos
az k8s-extension create \
--resource-group $GROUP_NAME \
--name $EXTENSION_NAME \
--cluster-name $CLUSTER_NAME \
--cluster-type connectedClusters \
--extension-type 'Microsoft.App.Environment' \
--release-train stable \
--auto-upgrade-minor-version true \
--scope cluster \
--release-namespace $NAMESPACE \
--configuration-settings "Microsoft.CustomLocation.ServiceAccount=default" \
--configuration-settings "appsNamespace=${NAMESPACE}" \
--configuration-settings "clusterName=${CONNECTED_ENVIRONMENT_NAME}"
Se puede comprobar la instalación viendo los POD instalados en el namespace appcontainer, los paquetes de HELM y la correcta asignación de la IP pública de tipo Load Balancer
Instalación de Custom Location #
# Recuperamos el ID de la Extensión
EXTENSION_ID=$(az k8s-extension show \
--cluster-type connectedClusters \
--cluster-name $CLUSTER_NAME \
--resource-group $GROUP_NAME \
--name $EXTENSION_NAME \
--query id --output tsv)
# Preparamos Variables
CUSTOM_LOCATION_NAME="osuna" # Name of the custom location
CONNECTED_CLUSTER_ID=$(az connectedk8s show --resource-group $GROUP_NAME --name $CLUSTER_NAME --query id --output tsv)
# Instalamos
az customlocation create \
--resource-group $GROUP_NAME \
--name $CUSTOM_LOCATION_NAME \
--host-resource-id $CONNECTED_CLUSTER_ID \
--namespace $NAMESPACE \
--cluster-extension-ids $EXTENSION_ID
Una vez finalice, podemos ver que nos ha creado la Custom Location con el cluster
Instalar el Connected Environment #
# Recuperamos el ID de Custom Location
CUSTOM_LOCATION_ID=$(az customlocation show \
--resource-group $GROUP_NAME \
--name $CUSTOM_LOCATION_NAME \
--query id --output tsv)
# Preparamos Variables
LOCATION="eastus"
az containerapp connected-env create \
--resource-group $GROUP_NAME \
--name $CONNECTED_ENVIRONMENT_NAME \
--custom-location $CUSTOM_LOCATION_ID \
--location $LOCATION
Ahora podemos verificar en el portal que se ha creado el Container App Environment
Paso 4: Instalar una Azure Container App #
Desde el App Environment añadimos una App Container:
En la pestaña Basics rellenamos la subscripción, Grupo de Recursos, nombre de la APP en región indicaremos la custom location desplegada en el paso anterior.
En Container le indicaremos donde coger la imagen del contenedor y el tamaño que tendrá:
En Ingress indicaremos como publicamos nuestra aplicación. Puedes elegir entre HTTP y TCP.
Target Port hace referencia al puerto donde se levantara la aplicación dentro del POD y Exposed Port el puerto utilizado por el Ingress para publicar la aplicación hacía el exterior.
Ya podemos crear en Review + Create y nuestra App Container se desplegará en el cluster.
Y en el cluster
Con esto quedaría nuestra container APP funcionando. Para conectar u jugar solo quedaría copiar la URL de la APP en el portal de Azure y, o bien publicar la aplicación con un ELB o bien acceder desde una VM que este en la misma red ya que container app es un recurso local.
Podemos ver en Custom Location como se han agregado estos recursos
Y a nivel de POD, vemos como se han asignado los recursos solicitados cuando creamos la App Tetris
Como último ejercicio vamos a subir los recursos a la APP Tetris y vemos como se redespliega de forma automática el nuevo POD
En el cluster se añade un segundo POD para no perder la disponibilidad de la aplicación
Y volviendo a ver los recursos asignados al nuevo POD, podemos comprobar como a asignado mas CPU y RAM
Conclusión #
La combinación de Azure Arc y Azure Container Apps representa un salto cualitativo en la gestión de aplicaciones modernas en entornos híbridos y multicloud. A través de esta integración, hemos demostrado cómo es posible extender las capacidades serverless de Azure a cualquier infraestructura, manteniendo la experiencia unificada de desarrollo y operaciones que caracteriza a la nube de Microsoft.
Los beneficios clave que hemos explorado incluyen:
- Flexibilidad sin compromisos: Ejecutar aplicaciones en contenedores con las ventajas del modelo serverless, independientemente de dónde resida la infraestructura
- Gestión centralizada: Un único panel de control para aplicaciones distribuidas geográficamente o desplegadas en diferentes proveedores
Mirando hacia el futuro, esta arquitectura híbrida se posiciona como una estrategia fundamental para organizaciones que buscan modernizar sus aplicaciones sin renunciar a sus inversiones en infraestructura existente. Azure Arc y Container Apps no solo resuelven las necesidades actuales de portabilidad y gestión, sino que preparan el terreno para un modelo operativo verdaderamente distribuido y resiliente.
La democratización de las capacidades serverless más allá de las fronteras de la nube pública marca el inicio de una nueva era en el desarrollo y despliegue de aplicaciones, donde la ubicación física deja de ser una limitación para la innovación.