Dela via


Självstudie: Distribuera ett ASP.NET webbprogram med hjälp av Azure Cosmos DB för NoSQL, hanterad identitet och AKS via Bicep

GÄLLER FÖR: NoSQL

I den här handledningen distribuerar du en referens ASP.NET webbapplikation i ett AKS-kluster (Azure Kubernetes Service) som ansluter till Azure Cosmos DB för NoSQL-databaser.

Azure Cosmos DB är en fullständigt hanterad distribuerad databasplattform för modern programutveckling med NoSQL eller relationsdatabaser.

AKS är en hanterad Kubernetes-tjänst som hjälper dig att snabbt distribuera och hantera kluster.

Viktigt!

  • Den här artikeln kräver den senaste versionen av Azure CLI. Mer information finns i Installera Azure CLI. Om du använder Azure Cloud Shell är den senaste versionen redan installerad.
  • Den här artikeln kräver också den senaste versionen av Bicep CLI i Azure CLI. Mer information finns i Installera Bicep-verktyg.
  • Om du kör kommandona i den här självstudien lokalt i stället för i Azure Cloud Shell kontrollerar du att du använder ett administratörskonto.

Förutsättningar

Följande verktyg krävs för att kompilera ASP.NET webbappen och skapa dess containeravbildning:

Översikt

I den här självstudien används en IaC-metod (infrastruktur som kod) för att distribuera resurserna till Azure. Du använder Bicep, som är ett nytt deklarativt språk som erbjuder samma funktioner som Azure Resource Manager-mallar. Bicep innehåller dock en syntax som är mer koncis och enklare att använda.

Bicep-modulerna distribuerar följande Azure-resurser inom det riktade prenumerationsomfånget:

I den här självstudien används följande metodtips för Azure Cosmos DB-säkerhet:

Tips

Stegen i den här självstudien använder Azure Cosmos DB för NoSQL. Du kan dock använda samma begrepp för Azure Cosmos DB för MongoDB.

Ladda ned Bicep-modulerna

Ladda ned eller klona Bicep-modulerna från mappen BicepGitHub-lagringsplatsen azure-samples/cosmos-aks-samples :

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

cd Bicep/

Ansluta till din Azure-prenumeration

Använd az sign in för att ansluta till din azure-standardprenumeration:

az login

Du kan också använda az account set med namnet eller ID:t för en specifik prenumeration för att ange den aktiva prenumerationen om du har flera prenumerationer:

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

Initiera distributionsparametrarna

Skapa en param.json fil med hjälp av JSON i följande exempel. {resource group name}Ersätt platshållarna , {Azure Cosmos DB account name}och {Azure Container Registry instance name} med dina egna värden.

Viktigt!

Alla resursnamn som du använder i följande kod ska följa namngivningsreglerna och begränsningarna för Azure-resurser. Kontrollera också att platshållarvärdena ersätts konsekvent och matchar värdena i 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}"
    }
  }
}

Skapa en Bicep-distribution

Ange gränssnittsvariabler med hjälp av följande kommandon. {deployment name} Ersätt platshållarna och {location} med dina egna värden.

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

I mappen Bicep använder du az deployment sub create för att distribuera mallen till det aktuella prenumerationsomfånget:

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

Under distributionen matar konsolen ut ett meddelande som anger att distributionen fortfarande körs:

 / Running ..

Distributionen kan ta mellan 20 och 30 minuter. När etableringen är klar kommer konsolen att mata ut JSON med Succeeded som etableringstillståndet.

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

Du kan också se distributionsstatusen i resursgruppen:

Skärmbild av distributionsstatusen för resursgruppen i Azure Portal.

Kommentar

När du skapar ett AKS-kluster skapas en andra resursgrupp automatiskt för att lagra AKS-resurserna. Mer information finns i Varför skapas två resursgrupper med AKS?.

Använd följande kommandon för att länka din Azure Container Registry-instans med AKS. {Azure Container Registry instance name} Ersätt platshållarna och {resource group name} med dina egna värden.

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

Kör az aks update för att koppla den befintliga Azure Container Registry-resursen till AKS-klustret:

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

Ansluta till AKS-klustret

För att hantera Kubernetes-kluster använder du kubectl, Kubernetes kommandoradsklient. Om du använder Azure Cloud Shell är kubectl redan installerat. Om du vill installera kubectl lokalt använder du az aks install-cli:

az aks install-cli

Om du vill konfigurera kubectl för att ansluta till kubernetes-klustret använder du az aks get-credentials. Det här kommandot laddar ned autentiseringsuppgifter och konfigurerar Kubernetes CLI för att använda dem.

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

Ansluta AKS-poddar till Azure Key Vault

Poddhanterade identiteter i Microsoft Entra använder AKS-primitiver för att associera hanterade identiteter för Azure-resurser och identiteter i Microsoft Entra-ID med poddar. Du använder dessa identiteter för att bevilja åtkomst till Azure Key Vault-providern för CSI-drivrutinen (Secrets Store Container Storage Interface).

Använd följande kommando för att hitta värdet för klientorganisations-ID:t (homeTenantId):

az account show

Använd följande YAML-mall för att skapa en secretproviderclass.yml fil. {Tenant Id} Ersätt platshållarna och {resource group name} med dina egna värden. Kontrollera också att värdet för {resource group name} matchar värdet i 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.

Tillämpa SecretProviderClass på AKS-klustret

Använd kubectl apply för att installera CSI-drivrutinen för Secrets Store med hjälp av YAML:

kubectl apply \
  --filename secretproviderclass.yml

Skapa ASP.NET webbappen

Ladda ned eller klona webbapplikationens källkod från mappen 'Application' i GitHub-lagringsplatsen azure-samples/cosmos-aks-samples.

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

cd Application/

Öppna appen i Visual Studio Code. Kör programmet med hjälp av antingen F5-nyckeln eller kommandot Felsök: Starta felsökning .

Skicka Docker-containeravbildningen till Azure Container Registry

  1. Om du vill skapa en containeravbildning från fliken Utforskaren i Visual Studio Code högerklickar du på Dockerfile och väljer sedan Skapa avbildning.

    Skärmbild av snabbmenyn i Visual Studio Code med alternativet Skapa bild valt.

  2. Ange namnet todo:latest i prompten som ber om att namnet och versionen ska tagga avbildningen.

  3. Använd Docker-fönstret för att skicka den skapade avbildningen till Azure Container Registry. Du hittar den skapade avbildningen under noden Bilder . Öppna todo-noden, högerklicka på senaste och välj sedan Push.

    Skärmbild av snabbmenyn i Visual Studio Code med alternativet Push markerat.

  4. I anvisningarna väljer du Azure Container Registry-resursen, din Azure-prenumeration, och taggar för avbildningar. Bildtaggformatet ska vara {acrname}.azurecr.io/todo:latest.

  5. Vänta tills Visual Studio Code skickar containeravbildningen till Azure Container Registry.

Förbered YAML-filen för deployment

Använd följande YAML-mall för att skapa en akstododeploy.yml fil. {ACR name}Ersätt platshållarna , {Image name}, {Version}och {resource group name} med dina egna värden.

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

Tillämpa distributionens YAML

Använd kubectl apply igen för att distribuera programpoddar och exponera poddarna via en lastbalanserare:

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

Testa programmet

När programmet körs exponerar en Kubernetes-tjänst programmets klientdel till Internet. Den här processen kan ta ett par minuter att slutföra.

Använd kubectl get för att visa den externa IP-adressen som lastbalanseraren exponerar:

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

Öppna IP-adressen som du fick som utdata i en webbläsare för att få åtkomst till applikationen.

Rensa resurserna

Undvik Azure-avgifter genom att rensa onödiga resurser när du inte längre behöver klustret. Använd az group delete och az deployment sub delete för att ta bort resursgruppen respektive prenumerationsdistributionen:

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

az deployment sub delete \
  --name $deploymentName