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:
- Un grupo de recursos para organizar los recursos
- Una identidad administrada para la autenticación
- Un registro de contenedores para almacenar imágenes de contenedores
- Un clúster de AKS
- Una red virtual para configurar AKS
- Una cuenta de Azure Cosmos DB for NoSQL, junto con una base de datos, un contenedor y el rol de SQL
- Un almacén de claves para almacenar claves seguras
- (Opcional) Un área de trabajo de Log Analytics
En este tutorial se usan los siguientes procedimientos recomendados para la seguridad de Azure Cosmos DB:
- Implemente el control de acceso mediante el control de acceso basado en rol (RBAC) y una identidad administrada. Estas características eliminan la necesidad de que los desarrolladores administren secretos, credenciales, certificados y claves para la comunicación segura entre servicios.
- Limita el acceso de Azure Cosmos DB a la subred de AKS mediante la configuración de un punto de conexión de servicio de red virtual.
- Establezca
disableLocalAuth = true
en el recursodatabaseAccount
para aplicar RBAC como el único método de autenticación.
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:
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?
Vinculación de Azure Container Registry 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
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.
En el símbolo del sistema que solicita el nombre y la versión para etiquetar la imagen, escriba el nombre todo:latest.
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.
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
.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