Diseño y desarrollo de aplicaciones en contenedor con Docker y Microsoft Azure Parte 6

Mario Ignacio Valderrama Silva
Computación en la nube
El flujo de trabajo del desarrollador al utilizar las herramientas de Docker incluidas en Visual Studio 2017, versión 15.7 y posteriores, es similar al de usar Visual Studio Code y la CLI de Docker ...

Diseño y desarrollo de aplicaciones en contenedor con Docker y Microsoft Azure Parte 6

Compilación de aplicaciones ASP.NET Core implementadas como contenedores de Linux en un orquestador de AKS/Kubernetes


Azure Kubernetes Service (AKS) es un servicio de orquestaciones de Kubernetes administrado de Azure que simplifica la implementación y la administración de contenedores.

Estas son las características principales de AKS:

  • Plano de control hospedado en Azure
  • Actualizaciones automatizadas
  • Recuperación automática
  • Escalado configurable por el usuario
  • Experiencia de usuario más sencilla para desarrolladores y operadores de clúster.

En los ejemplos siguientes se examina la creación de una aplicación de ASP.NET Core 5.0 que se ejecuta en Linux y se implementa en un clúster de AKS en Azure, mientras que el desarrollo se realiza con Visual Studio 2019, versión 16.8.


Creación del proyecto de ASP.NET Core con Visual Studio 2019

ASP.NET Core es una plataforma de desarrollo de uso general de cuyo mantenimiento se encargan Microsoft y la comunidad .NET en GitHub. Es multiplataforma, admite Windows, macOS y Linux y puede usarse en escenarios de dispositivo, nube, IoT e incrustados.

En este ejemplo se usan un par de proyectos simples basados en plantillas de Visual Studio, por lo que no necesita muchos conocimientos adicionales para crear el ejemplo. Solo tiene que crear el proyecto con una plantilla estándar que incluya todos los elementos para ejecutar un proyecto pequeño con una API REST y una aplicación web con Razor Pages, mediante la tecnología ASP.NET Core 5.0.

Imagen 4-35. Creación de una aplicación web ASP.NET Core en Visual Studio 2019

.


Para crear el proyecto de ejemplo en Visual Studio, seleccione Archivo > Nuevo > Proyecto, seleccione el tipo de proyecto Web y luego la plantilla Aplicación web ASP.NET Core. También puede buscar la plantilla si la necesita.


Luego escriba el nombre y la ubicación de la aplicación como se muestra en la siguiente imagen.

Imagen 4-36. Especificación del nombre y la ubicación del proyecto en Visual Studio 2019.

Compruebe que ha seleccionado ASP.NET Core 5.0 como marco. .NET 5 está incluido en la última versión de Visual Studio 2019, y se instala y configura automáticamente al instalar Visual Studio.


Imagen 4-37. Selección de ASP.NET Core 5.0 y del tipo de proyecto API web

Observe que la compatibilidad con Docker no está habilitada ahora. Lo hará en el paso siguiente después de la creación del proyecto.



Para mostrar que puede "aplicar Docker" al proyecto en cualquier momento, se va a agregar compatibilidad con Docker ahora. Haga clic con el botón derecho en el nodo del proyecto en el Explorador de soluciones y seleccione Agregar > Compatibilidad con Docker en el menú contextual.


Imagen 4-38. Incorporación de compatibilidad con Docker a un proyecto existente

Para acabar de agregar compatibilidad con Docker, puede elegir Windows o Linux. En este caso, seleccione Linux.



Imagen 4-39. Selección de contenedores de Linux


Con estos sencillos pasos, ya tiene la aplicación de ASP.NET Core 5.0 en ejecución en un contenedor de Linux.


De forma similar, también puede agregar un proyecto WebApp muy sencillo (figura 4-40) para usar el punto de conexión de la API web, aunque los detalles no se tratan aquí.


Después, agregue compatibilidad con el orquestador al proyecto WebApi como se muestra a continuación, en la imagen 4-40.

Imagen 4-40. Incorporación de compatibilidad con el orquestador al proyecto WebApi.


Al seleccionar la opción Docker Compose, que es correcta para el desarrollo local, Visual Studio agrega el proyecto docker-compose, con los archivos de docker-compose, como se muestra en la imagen 4-41.


Imagen 4-41. Incorporación de compatibilidad con el orquestador al proyecto WebApi.

Los archivos iniciales agregados son similares a estos:



docker-compose.yml

docker-compose.override.yml

Para que la aplicación se ejecute con Docker Compose, solo tiene que realizar algunos ajustes en docker-compose.override.yml

Ahora puede ejecutar la aplicación con la tecla F5, mediante el botón Reproducir, o bien la tecla Ctrl+F5 al seleccionar el proyecto docker-compose, como se muestra en la imagen 4-42.


Imagen 4-42. Incorporación de compatibilidad con el orquestador al proyecto WebApi.

Al ejecutar la aplicación docker-compose como se ha explicado, se consigue:


  1. Compilar las imágenes y crear los contenedores según el archivo docker-compose.
  2. Abrir el explorador en la dirección configurada en el cuadro de diálogo "Propiedades" del proyecto docker-compose.
  3. Abrir la ventana Contenedor (en Visual Studio 2019, versión 16.4 y posteriores).
  4. Compatibilidad del depurador con todos los proyectos de la solución, como se muestra en las siguientes imágenes.

Explorador abierto:

Imagen 4-43. Ventana del explorador con una aplicación en ejecución en varios contenedores.

Ventana Contenedores:

Imagen 4-44. Ventana "Contenedores" de Visual Studio

La ventana Contenedores permite ver los contenedores en ejecución, examinar las imágenes disponibles, ver variables de entorno, registros y asignaciones de puertos, inspeccionar el sistema de archivos, adjuntar un depurador o abrir una ventana de terminal dentro del entorno del contenedor.



Como puede ver, la integración entre Visual Studio 2019 y Docker está totalmente orientada a la productividad del desarrollador.


Por supuesto, también puede enumerar las imágenes mediante el comando docker images. Debería ver las imágenes webapi y webapp con las etiquetas dev creadas por la implementación automática del proyecto con Visual Studio 2019.

Imagen 4-45. Vista de imágenes de Docker

Registro de la solución en una instancia de Azure Container Registry (ACR)




Puede cargar las imágenes en Azure Container Registry (ACR), pero también puede usar Docker Hub o cualquier otro registro de modo que las imágenes puedan implementarse en el clúster de AKS desde ese registro.


Creación de una instancia de ACR

Ejecute el siguiente comando desde az cli:


Creación de la imagen en modo de versión

Ahora va a crear la imagen en modo Versión (listo para producción). Para ello, cambie a Versión, como se muestra en la imagen 4-46, y ejecute la aplicación como antes.

Imagen 4-46. Selección del modo de versión

Si ejecuta el comando docker images, ve que se crean dos imágenes, una para el modo debug (desarrollo) y otra para el modo release (más reciente).



Creación de una nueva etiqueta para la imagen

Es preciso etiquetar cada imagen de contenedor con el nombre loginServer del registro. Esta etiqueta se usa para el enrutamiento al insertar imágenes de contenedor en un registro de imágenes.


Para ver el nombre loginServer desde Azure Portal, tome la información de Azure Container Registry.

Imagen 4-47. Vista del nombre del Registro


También puede ejecutar el comando siguiente:

az acr list --resource-group <resource-group-name> --query "[].{acrLoginServer:loginServer}" --output table

Imagen 4-48. Obtención del nombre del registro mediante az cli

En ambos casos, obtendrá el nombre. En nuestro ejemplo, se trata de exploredocker.azurecr.io.



Ahora puede etiquetar la imagen. Para ello, tome la imagen más reciente (la imagen de versión) con este comando:

Después de ejecutar el comando docker tag, muestre las imágenes con el comando docker images. Debería ver la imagen con la nueva etiqueta.

Imagen 4-49. Vista de las imágenes etiquetadas


Inserción de la imagen en Azure ACR

Inicie sesión en Azure Container Registry.


Inserte la imagen en Azure ACR con el comando siguiente:



Este comando tarda un poco en cargar las imágenes, pero proporciona información durante el proceso. En la imagen siguiente puede ver la salida de una imagen completada y otra en curso.

Imagen 4-50. Salida de la consola del comando push.

Para implementar la aplicación de varios contenedores en el clúster de AKS, necesita algunos archivos .yaml de manifiesto que tengan la mayoría de las propiedades tomadas de los archivos docker-compose.yml y docker-compose.override.yml.



deploy-webapi.yml


deploy-webapp.yml

Ya está casi listo para implementar con kubectl, pero primero debe obtener las credenciales del clúster de AKS con este comando:


Imagen 4-51. Obtención de credenciales de AKS en el entorno de kubectl.

También debe permitir que el clúster de AKS extraiga imágenes de la instancia de ACR con este comando:


az aks update --name explore-docker-aks --resource-group explore-docker-aks-rg --attach-acr exploredocker

El comando anterior puede tardar un par de minutos en terminar. Luego use el comando kubectl apply para iniciar las implementaciones; entonces, kubectl get all indica los objetos del clúster.


Imagen 4-52. Implementación en Kubernetes

Tiene que esperar un rato para que el equilibrador de carga obtenga la dirección IP externa al consultar con kubectl get services y, luego, la aplicación debe estar disponible en esa dirección, como se muestra en la siguiente imagen:


Imagen 4-53. Implementación en Kubernetes

Una vez finalizada la implementación, puede acceder a la interfaz de usuario web de Kubernetes con un proxy local, mediante un túnel SSH.



En primer lugar, debe crear un elemento ClusterRoleBinding con el siguiente comando:


kubectl create clusterrolebinding kubernetes-dashboard --clusterrole=cluster-admin --serviceaccount=kube-system:kubernetes-dashboard


Y luego este comando para iniciar el proxy:



Se debe abrir una ventana del explorador en http://127.0.0.1:8001 con una vista similar a esta:

Imagen 4-54. Vista de la información del clúster de Kubernetes

Ya tiene la aplicación ASP.NET Core en ejecución en contenedores de Linux e implementada en un clúster de AKS en Azure.


Mario Ignacio Valderrama Silva

Desarrollador y Scrum Master Apasionado por la tecnología.

Me apasiona la detección, análisis y construcción de nuevas herramientas que permitan resolver los problemas de forma eficiente.
Trabajando en equipo con pasión, compromiso y energía para alcanzar los objetivos propuestos.

Related Posts

Únete a nuestra Newsletter

Lidera la Conversación en la Nube