Compartir a través de


Tutorial: Implementación de una aplicación web ASP.NET mediante el uso de Azure Cosmos DB for NoSQL, identidad administrada y AKS a través de Bicep

SE APLICA A: NoSQL

En este tutorial implementará una aplicación web ASP.NET de referencia en un clúster de Azure Kubernetes Service (AKS) que se conecta a Azure Cosmos DB for NoSQL.

Azure Cosmos DB es una plataforma de base de datos distribuida totalmente administrada para el desarrollo de aplicaciones modernas con bases de datos NoSQL o relacionales.

AKS es un servicio administrado de Kubernetes que le ayuda a implementar y administrar rápidamente los clústeres.

Importante

  • En este artículo se necesita la versión más reciente de la CLI de Azure. Para más información, consulte Instalación de la CLI de Azure. Si usa Azure Cloud Shell, ya está instalada la versión más reciente.
  • Este artículo también requiere la última versión de Bicep CLI dentro de Azure CLI. Para más información, consulte Instalación de herramientas de Bicep.
  • Si ejecuta los comandos de este tutorial localmente en lugar de en Azure Cloud Shell, asegúrese de usar una cuenta de administrador.

Prerrequisitos

Para compilar la aplicación web ASP.NET y crear su imagen de contenedor, se necesitan las siguientes herramientas:

Información general

En este tutorial se usa un enfoque de infraestructura como código (IaC) para implementar los recursos en Azure. Usaremos Bicep, que es un nuevo lenguaje declarativo que ofrece las mismas funcionalidades que las plantillas de Azure Resource Manager. Sin embargo, Bicep incluye una sintaxis más concisa y fácil de usar.

Los módulos de Bicep implementarán los siguientes recursos de Azure dentro del ámbito de la suscripción de destino:

En este tutorial se usan los siguientes procedimientos recomendados para la seguridad de Azure Cosmos DB:

Sugerencia

En los pasos de este tutorial se usa Azure Cosmos DB for NoSQL. Sin embargo, puede aplicar los mismos conceptos a Azure Cosmos DB for MongoDB.

Descarga de los módulos de Bicep

Descargue o clone los módulos de Bicep desde la carpeta Bicep del repositorio de GitHub azure-samples/cosmos-aks-samples:

git clone https://github.com/Azure-Samples/cosmos-aks-samples.git

cd Bicep/

Conexión a su suscripción de Azure

Use az sign in para conectarse a la suscripción predeterminada de Azure:

az login

Opcionalmente, use az account set con el nombre o el identificador de una suscripción específica para establecer la suscripción activa si tiene varias.

az account set \
  --subscription <subscription-id>

Inicialización de los parámetros de implementación

Cree un archivo param.json mediante el JSON del siguiente ejemplo. Reemplace los marcadores de posición {resource group name}, {Azure Cosmos DB account name} y {Azure Container Registry instance name} por sus propios valores.

Importante

Todos los nombres de recursos que use en el código siguiente deben cumplir las reglas de nomenclatura y las restricciones de los recursos de Azure. Asegúrese también de que los valores de marcador de posición se reemplazan de forma coherente y coinciden con los valores de param.json.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "rgName": {
      "value": "{resource group name}"
    },    
    "cosmosName" :{
      "value": "{Azure Cosmos DB account name}"
    },
    "acrName" :{
      "value": "{Azure Container Registry instance name}"
    }
  }
}

Creación de una implementación de Bicep

Establezca variables de shell mediante los siguientes comandos. Reemplace los marcadores de posición {deployment name} y {location} por sus propios valores.

deploymentName='{deployment name}'  # Name of the deployment
location='{location}' # Location for deploying the resources

En la carpeta Bicep, use az deployment sub create para implementar la plantilla en el ámbito de la suscripción actual.

az deployment sub create \
  --name $deploymentName \
  --location $location \
  --template-file main.bicep \
  --parameters @param.json

Durante la implementación, la consola generará un mensaje que indicará que la implementación sigue en ejecución:

 / Running ..

La implementación puede tardar entre 20 y 30 minutos. Después de completar el aprovisionamiento, la consola generará JSON con Succeeded como estado de aprovisionamiento.

      }
    ],
    "provisioningState": "Succeeded",
    "templateHash": "0000000000000000",
    "templateLink": null,
    "timestamp": "2022-01-01T00:00:00.000000+00:00",
    "validatedResources": null
  },
  "tags": null,
  "type": "Microsoft.Resources/deployments"
}

También puede ver el estado de implementación en el grupo de recursos:

Captura de pantalla del estado de implementación del grupo de recursos en Azure Portal.

Nota

Al crear un clúster de AKS, se crea automáticamente un segundo grupo de recursos para almacenar los recursos de dicho clúster. Para más información, consulte ¿Por qué se crean dos grupos de recursos con AKS?

Use los siguientes comandos para vincular la instancia de Azure Container Registry con AKS. Reemplace los marcadores de posición {Azure Container Registry instance name} y {resource group name} por sus propios valores.

acrName='{Azure Container Registry instance name}'
rgName='{resource group name}'
aksName=$rgName'aks'

Ejecute az aks update para asociar el recurso de Azure Container Registry existente con el clúster de AKS:

az aks update \
  --resource-group $rgName \
  --name $aksName \
  --attach-acr $acrName

Conexión al clúster de AKS

Para administrar un clúster de Kubernetes, usará kubectl, el cliente de línea de comandos de Kubernetes. Si usa Azure Cloud Shell, kubectl ya está instalado. Para instalar kubectl en el entorno local, use az aks install-cli:

az aks install-cli

Para configurar kubectl con el fin de conectarse al clúster de Kubernetes, use az aks get-credentials. Con este comando se descargan las credenciales y se configura la CLI de Kubernetes para usarlas.

az aks get-credentials \
  --resource-group $rgName \
  --name $aksName

Conexión de los pods de AKS a Azure Key Vault

Las identidades administradas del pod de Microsoft Entra usan primitivas de AKS para asociar identidades administradas para recursos de Azure e identidades en Microsoft Entra ID con pods. Usará estas identidades para conceder acceso al controlador de Container Storage Interface (CSI) del proveedor de Azure Key Vault para el almacenamiento de secretos.

Use el siguiente comando para buscar los valores del identificador de inquilino (homeTenantId):

az account show

Use la siguiente plantilla YAML para crear un archivo secretproviderclass.yml. Reemplace los marcadores de posición {Tenant Id} y {resource group name} por sus propios valores. Asegúrese también de que el valor de {resource group name} coincide con el valor en param.json.

# This is a SecretProviderClass example that uses aad-pod-identity to access the key vault
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: azure-kvname-podid
spec:
  provider: azure
  parameters:
    usePodIdentity: "true"               
    keyvaultName: "{resource group name}kv"       # Replace resource group name. Bicep generates the key vault name.
    tenantId: "{Tenant Id}"              # The tenant ID of your account. Use the 'homeTenantId' attribute value from  the 'az account show' command output.

Aplicación de SecretProviderClass al clúster de AKS

Use kubectl apply para instalar el controlador CSI del almacén de secretos mediante YAML:

kubectl apply \
  --filename secretproviderclass.yml

Creación de la aplicación web ASP.NET

Descargue o clone el código fuente de la aplicación web desde la carpeta Application del repositorio de GitHub azure-samples/cosmos-aks-samples.

git clone https://github.com/Azure-Samples/cosmos-aks-samples.git

cd Application/

Abra la carpeta Aplicaciones en Visual Studio Code. Ejecute la aplicación con la tecla F5 o con el comando Depuración: Iniciar depuración.

Inserción de una imagen de contenedor de Docker en Azure Container Registry

  1. Para crear una imagen de contenedor desde la pestaña Explorador de Visual Studio Code, haga clic con el botón derecho en Dockerfile y, a continuación, seleccione Compilar imagen.

    Captura de pantalla del menú contextual de Visual Studio Code con la opción Crear imagen seleccionada.

  2. En el símbolo del sistema que solicita el nombre y la versión para etiquetar la imagen, escriba el nombre todo:latest.

  3. Use el panel de Docker para insertar la imagen compilada en Azure Container Registry. Puede encontrar la imagen creada en el nodo Imágenes. Abra el nodo todo, haga clic con el botón derecho en más reciente y seleccione Insertar.

    Captura de pantalla del menú contextual de Visual Studio Code con la opción Insertar seleccionada.

  4. En las indicaciones, seleccione la suscripción de Azure, Azure Container Registry el recurso y las etiquetas de imagen. El formato de etiqueta de la imagen debe ser {acrname}.azurecr.io/todo:latest.

  5. Espere a que Visual Studio Code inserte la imagen de contenedor en Azure Container Registry.

Preparación de la implementación de YAML

Use la siguiente plantilla YAML para crear un archivo akstododeploy.yml. Reemplace los marcadores de posición {ACR name}, {Image name}, {Version} y {resource group name} por sus propios valores.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: todo
  labels:
    aadpodidbinding: "cosmostodo-apppodidentity"
    app: todo
spec:
  replicas: 2
  selector:
    matchLabels:
      app: todo
  template:
    metadata:
      labels:
        app: todo
        aadpodidbinding: "cosmostodo-apppodidentity"
    spec:
      containers:
      - name: mycontainer
        image: "{ACR name}/{Image name}:{Version}"   # Update per your environment; for example, myacrname.azurecr.io/todo:latest. Do not add https:// in ACR Name.
        ports:
        - containerPort: 80
        env:
        - name: KeyVaultName
          value: "{resource group name}kv"       # Replace resource group name. Key Vault name is generated by Bicep.
      nodeSelector:
        kubernetes.io/os: linux
      volumes:
        - name: secrets-store01-inline
          csi:
            driver: secrets-store.csi.k8s.io
            readOnly: true
            volumeAttributes:
              secretProviderClass: "azure-kvname-podid"       
---
    
kind: Service
apiVersion: v1
metadata:
  name: todo
spec:
  selector:
    app: todo
    aadpodidbinding: "cosmostodo-apppodidentity"    
  type: LoadBalancer
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

Aplicación a la implementación de YAML

Use kubectl apply de nuevo para implementar los pods de aplicación y exponerlos con un equilibrador de carga:

kubectl apply \
  --filename akstododeploy.yml \
  --namespace 'my-app'

Prueba de la aplicación

Cuando la aplicación se ejecuta, un servicio de Kubernetes expone el front-end de la aplicación a Internet. Este proceso puede tardar unos minutos en completarse.

Use kubectl get para ver la dirección IP externa que expone el equilibrador de carga:

kubectl get services \
  --namespace "my-app"

Para acceder a la aplicación, abra la dirección IP que recibió como salida en un explorador.

Limpiar los recursos

Para evitar cargos de Azure, limpie los recursos innecesarios cuando ya no necesite el clúster. Use az group delete y az deployment sub delete para eliminar el grupo de recursos y la implementación de la suscripción, respectivamente:

az group delete \
  --resource-group $rgName 
  --yes

az deployment sub delete \
  --name $deploymentName