Zelfstudie: Een ASP.NET-webtoepassing implementeren met behulp van Azure Cosmos DB for NoSQL, beheerde identiteit en AKS via Bicep
VAN TOEPASSING OP: NoSQL
In deze zelfstudie implementeert u een verwijzing ASP.NET webtoepassing op een AKS-cluster (Azure Kubernetes Service) dat verbinding maakt met Azure Cosmos DB for NoSQL.
Azure Cosmos DB is een volledig beheerd gedistribueerd databaseplatform voor moderne toepassingsontwikkeling met NoSQL of relationele databases.
AKS is een beheerde Kubernetes-service waarmee u snel clusters kunt implementeren en beheren.
Belangrijk
- Voor dit artikel is de nieuwste versie van de Azure CLI vereist. Zie De Azure CLI installeren voor meer informatie. Als u Azure Cloud Shell gebruikt, is de nieuwste versie al geïnstalleerd.
- Voor dit artikel is ook de nieuwste versie van de Bicep CLI in de Azure CLI vereist. Zie Bicep-hulpprogramma's installeren voor meer informatie.
- Als u de opdrachten in deze zelfstudie lokaal uitvoert in plaats van in Azure Cloud Shell, moet u ervoor zorgen dat u een beheerdersaccount gebruikt.
Vereisten
De volgende hulpprogramma's zijn vereist voor het compileren van de ASP.NET webtoepassing en het maken van de containerinstallatiekopieën:
- Docker Desktop
- Visual Studio Code
- C#-extensie voor Visual Studio Code
- Docker-extensie voor Visual Studio Code
- Azure-accountextensie voor Visual Studio Code
Overzicht
In deze zelfstudie wordt gebruikgemaakt van een IaC-benadering (Infrastructure as Code) voor het implementeren van de resources in Azure. U gebruikt Bicep, een nieuwe declaratieve taal die dezelfde mogelijkheden biedt als Azure Resource Manager-sjablonen. Bicep bevat echter een syntaxis die beknopter en gemakkelijker te gebruiken is.
De Bicep-modules implementeren de volgende Azure-resources binnen het beoogde abonnementsbereik:
- Een resourcegroep om de resources te organiseren
- Een beheerde identiteit voor verificatie
- Een containerregister voor het opslaan van containerinstallatiekopieën
- Een AKS-cluster
- Een virtueel netwerk voor het configureren van AKS
- Een Azure Cosmos DB for NoSQL-account, samen met een database, een container en de SQL-rol
- Een sleutelkluis voor het opslaan van beveiligde sleutels
- (Optioneel) Een Log Analytics-werkruimte
In deze zelfstudie worden de volgende aanbevolen procedures voor Azure Cosmos DB-beveiliging gebruikt:
- Implementeer toegangsbeheer met behulp van op rollen gebaseerd toegangsbeheer (RBAC) en een beheerde identiteit. Met deze functies hoeven ontwikkelaars geen geheimen, referenties, certificaten en sleutels te beheren voor veilige communicatie tussen services.
- Beperk Azure Cosmos DB-toegang tot het AKS-subnet door een service-eindpunt voor een virtueel netwerk te configureren.
- Stel
disableLocalAuth = true
in dedatabaseAccount
resource in om RBAC af te dwingen als de enige verificatiemethode.
Tip
In de stappen in deze zelfstudie wordt Gebruikgemaakt van Azure Cosmos DB for NoSQL. U kunt echter dezelfde concepten toepassen op Azure Cosmos DB voor MongoDB.
De Bicep-modules downloaden
Download of kloon de Bicep-modules uit de map Bicep van de GitHub-opslagplaats azure-samples/cosmos-aks-samples :
git clone https://github.com/Azure-Samples/cosmos-aks-samples.git
cd Bicep/
Verbinding maken met uw Azure-abonnement
Gebruik az sign in om verbinding te maken met uw standaard Azure-abonnement:
az login
Gebruik desgewenst az account set met de naam of id van een specifiek abonnement om het actieve abonnement in te stellen als u meerdere abonnementen hebt:
az account set \
--subscription <subscription-id>
De implementatieparameters initialiseren
Maak een param.json-bestand met behulp van de JSON in het volgende voorbeeld. Vervang de {resource group name}
tijdelijke {Azure Cosmos DB account name}
aanduidingen en {Azure Container Registry instance name}
tijdelijke aanduidingen door uw eigen waarden.
Belangrijk
Alle resourcenamen die u in de volgende code gebruikt, moeten voldoen aan de naamgevingsregels en -beperkingen voor Azure-resources. Zorg er ook voor dat de waarden van de tijdelijke aanduiding consistent worden vervangen en overeenkomen met de waarden in 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}"
}
}
}
Een Bicep-implementatie maken
Stel shell-variabelen in met behulp van de volgende opdrachten. Vervang de {deployment name}
tijdelijke aanduidingen door {location}
uw eigen waarden.
deploymentName='{deployment name}' # Name of the deployment
location='{location}' # Location for deploying the resources
Gebruik az deployment sub create in de bicep-map om de sjabloon te implementeren in het huidige abonnementsbereik:
az deployment sub create \
--name $deploymentName \
--location $location \
--template-file main.bicep \
--parameters @param.json
Tijdens de implementatie voert de console een bericht uit waarin wordt aangegeven dat de implementatie nog steeds wordt uitgevoerd:
/ Running ..
De implementatie kan 20 tot 30 minuten duren. Nadat het inrichten is voltooid, voert de console JSON uit als Succeeded
de inrichtingsstatus:
}
],
"provisioningState": "Succeeded",
"templateHash": "0000000000000000",
"templateLink": null,
"timestamp": "2022-01-01T00:00:00.000000+00:00",
"validatedResources": null
},
"tags": null,
"type": "Microsoft.Resources/deployments"
}
U kunt ook de implementatiestatus in de resourcegroep zien:
Notitie
Wanneer u een AKS-cluster maakt, wordt automatisch een tweede resourcegroep gemaakt om de AKS-resources op te slaan. Zie Waarom zijn er twee resourcegroepen gemaakt met AKS? voor meer informatie.
Azure Container Registry koppelen aan AKS
Gebruik de volgende opdrachten om uw Azure Container Registry-exemplaar te koppelen aan AKS. Vervang de {Azure Container Registry instance name}
tijdelijke aanduidingen door {resource group name}
uw eigen waarden.
acrName='{Azure Container Registry instance name}'
rgName='{resource group name}'
aksName=$rgName'aks'
Voer deze opdracht uit az aks update
om de bestaande Azure Container Registry-resource te koppelen aan het AKS-cluster:
az aks update \
--resource-group $rgName \
--name $aksName \
--attach-acr $acrName
Verbinding maken met het AKS-cluster
Als u een Kubernetes-cluster wilt beheren, gebruikt u kubectl, de Kubernetes-opdrachtregelclient. Als u Azure Cloud Shell gebruikt, is kubectl
al geïnstalleerd. Als u lokaal wilt installeren kubectl
, gebruikt u az aks install-cli
:
az aks install-cli
Als u wilt configureren kubectl
dat er verbinding wordt gemaakt met uw Kubernetes-cluster, gebruikt u az aks get-credentials
. Bij deze opdracht worden referenties gedownload en wordt Kubernetes CLI geconfigureerd voor het gebruik van deze referenties.
az aks get-credentials \
--resource-group $rgName \
--name $aksName
De AKS-pods verbinden met Azure Key Vault
Door Microsoft Entra beheerde identiteiten maken gebruik van AKS-primitieven om beheerde identiteiten te koppelen aan Azure-resources en -identiteiten in Microsoft Entra-id met pods. U gebruikt deze identiteiten om toegang te verlenen tot het CSI-stuurprogramma (Azure Key Vault Provider for Secrets Store Container Storage Interface).
Gebruik de volgende opdracht om de waarden van de tenant-id (homeTenantId
) te vinden:
az account show
Gebruik de volgende YAML-sjabloon om een secretproviderclass.yml-bestand te maken. Vervang de {Tenant Id}
tijdelijke aanduidingen door {resource group name}
uw eigen waarden. Zorg er ook voor dat de waarde overeenkomt {resource group name}
met de waarde in 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.
De SecretProviderClass toepassen op het AKS-cluster
Gebruik kubectl om het Stuurprogramma Secrets Store CSI te installeren met behulp van de YAML:
kubectl apply \
--filename secretproviderclass.yml
De ASP.NET-webtoepassing bouwen
Download of kloon de broncode van de webtoepassing uit de toepassingsmap van de GitHub-opslagplaats azure-samples/cosmos-aks-samples :
git clone https://github.com/Azure-Samples/cosmos-aks-samples.git
cd Application/
Open de map Toepassing in Visual Studio Code. Voer de toepassing uit met behulp van de F5-toets of de foutopsporingsopdracht: Start de foutopsporing .
De Docker-containerinstallatiekopieën pushen naar Azure Container Registry
Als u een containerinstallatiekopieën wilt maken op het tabblad Explorer in Visual Studio Code, klikt u met de rechtermuisknop op Dockerfile en selecteert u Build Image.
Voer in de prompt die vraagt om de naam en versie om de installatiekopieën te taggen, de naam todo:latest in.
Gebruik het Deelvenster Docker om de ingebouwde installatiekopie naar Azure Container Registry te pushen. U vindt de ingebouwde installatiekopie onder het knooppunt Installatiekopieën . Open het takenknooppunt, klik met de rechtermuisknop op de meest recente en selecteer Push.
Selecteer in de prompts uw Azure-abonnement, Azure Container Registry-resource en installatiekopieëntags. De indeling van de afbeeldingstag moet zijn
{acrname}.azurecr.io/todo:latest
.Wacht tot Visual Studio Code de containerinstallatiekopieën naar Azure Container Registry pusht.
De YAML-implementatie voorbereiden
Gebruik de volgende YAML-sjabloon om een akstododeploy.yml-bestand te maken. Vervang de {ACR name}
tijdelijke aanduidingen en {resource group name}
{Image name}
{Version}
tijdelijke aanduidingen door uw eigen waarden.
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
De YAML-implementatie toepassen
Gebruik kubectl apply
opnieuw om de toepassingspods te implementeren en de pods beschikbaar te maken via een load balancer:
kubectl apply \
--filename akstododeploy.yml \
--namespace 'my-app'
De toepassing testen
Wanneer de toepassing wordt uitgevoerd, maakt een Kubernetes-service de front-end van de toepassing beschikbaar op internet. Dit proces kan enkele minuten duren.
Gebruik kubectl om het externe IP-adres weer te geven dat door de load balancer wordt weergegeven:
kubectl get services \
--namespace "my-app"
Als u toegang wilt krijgen tot de toepassing, opent u het IP-adres dat u hebt ontvangen als uitvoer in een browser.
De resources opschonen
Als u azure-kosten wilt voorkomen, moet u overbodige resources opschonen wanneer u het cluster niet meer nodig hebt. Gebruik az group delete en az deployment sub delete om respectievelijk de resourcegroep en abonnementsimplementatie te verwijderen:
az group delete \
--resource-group $rgName
--yes
az deployment sub delete \
--name $deploymentName