Stellen Sie Arc-fähige Workloads in einer erweiterten Zone bereit: ContainerApps

In diesem Artikel erfahren Sie, wie Sie eine Arc-fähige ContainerApp in einer erweiterten Zone bereitstellen. Informationen zu derzeit unterstützten PaaS-Workloads finden Sie unter Serviceangebote für Azure Erweiterte Zonen. Um sich mit Container-Apps auf Azure Arc vertraut zu machen, erkunden Sie Azure Container Apps unter Azure Arc Overview.

Voraussetzungen

Hinweis

Verwenden Sie den vorgesehenen erweiterten Speicherort als Standortvariable.

Erste Schritte

Wenn Sie bereits mit dem Thema vertraut sind, können Sie diesen Absatz überspringen. Hier sind wichtige Themen, die Sie lesen möchten, bevor Sie mit der Erstellung fortfahren:

Erstellen einer Container Apps-Instanz in einer Arc-fähigen AKS-Instanz in erweiterten Zonen.

Verwenden Sie nach dem Erstellen des Arc-fähigen AKS-Clusters das folgende PowerShell-Skript, um Ihre Container-App auf einem AKS-Cluster in einer erweiterten Zone zu erstellen und sie mit Azure Arc-fähigen Kubernetes zu verbinden.

Hinweis

Stellen Sie sicher, dass Sie die Parameter aus den Arc-fähigen AKS-Schritten ordnungsgemäß in das Skript übertragen.

# . "./CreateArcEnabledAksOnEZ.ps1"

# Create a container app on an AKS cluster in an edge zone and connect it to Azure Arc-enabled Kubernetes
function CreateContainerAppOnArcEnabledAksEz {
    param(
        [string] $AKSClusterResourceGroupName,
        [string] $location = "westus",
        [string] $AKSName,
        [string] $edgeZone,
        [int] $nodeCount = 2,
        [string] $vmSize = "standard_nv12ads_a10_v5",
        [string] $ArcResourceGroupName,
        [string] $CONNECTED_ENVIRONMENT_NAME,
        [string] $CUSTOM_LOCATION_NAME,
        [string] $SubscriptionId,
        [string] $ACRName,
        [string] $imageName,
        [switch] $Debug
    )

    try {
        # Set the subscription
        az account set --subscription $SubscriptionId

        # Create the Arc-enabled EZ AKS cluster
        createArcEnabledAksOnEz -SubscriptionId $SubscriptionId -AKSClusterResourceGroupName $AKSClusterResourceGroupName -location $location -AKSName $AKSName -edgeZone $edgeZone -nodeCount $nodeCount -vmSize $vmSize -ArcResourceGroupName $ArcResourceGroupName -Debug:$Debug

        # Install container apps extension
        $CLUSTER_NAME = "$ArcResourceGroupName-cluster" # Name of the connected cluster resource
        $EXTENSION_NAME="appenv-ext"
        $NAMESPACE="app-ns"
        az k8s-extension create `
        --resource-group $ArcResourceGroupName `
        --name $EXTENSION_NAME `
        --cluster-type connectedClusters `
        --cluster-name $CLUSTER_NAME `
        --extension-type 'Microsoft.App.Environment' `
        --release-train stable `
        --auto-upgrade-minor-version true `
        --scope cluster `
        --release-namespace $NAMESPACE `
        --configuration-settings "Microsoft.CustomLocation.ServiceAccount=default" `
        --configuration-settings "appsNamespace=${NAMESPACE}" `
        --configuration-settings "clusterName=${CONNECTED_ENVIRONMENT_NAME}" `
        --configuration-settings "envoy.annotations.service.beta.kubernetes.io/azure-load-balancer-resource-group=${AKSClusterResourceGroupName}"
  
        # Save id property of the Container Apps extension for later
        $EXTENSION_ID=$(az k8s-extension show `
        --cluster-type connectedClusters `
        --cluster-name $CLUSTER_NAME `
        --resource-group $ArcResourceGroupName `
        --name $EXTENSION_NAME `
        --query id `
        --output tsv)

        # Wait for extension to fully install before proceeding
        az resource wait --ids $EXTENSION_ID --custom "properties.provisioningState!='Pending'" --api-version "2020-07-01-preview"
        
        $CONNECTED_CLUSTER_ID=$(az connectedk8s show --resource-group $ArcResourceGroupName --name $CLUSTER_NAME --query id --output tsv)
        az customlocation create `
        --resource-group $ArcResourceGroupName `
        --name $CUSTOM_LOCATION_NAME `
        --host-resource-id $CONNECTED_CLUSTER_ID `
        --namespace $NAMESPACE `
        --cluster-extension-ids $EXTENSION_ID    

        # DEBUG: Test custom location creation
        if ($Debug) {
            Write-Debug az customlocation show --resource-group $ArcResourceGroupName --name $CUSTOM_LOCATION_NAME
        }

        # Save id property of the custom location for later
        $CUSTOM_LOCATION_ID=$(az customlocation show `
        --resource-group $ArcResourceGroupName `
        --name $CUSTOM_LOCATION_NAME `
        --query id `
        --output tsv)

        # Create container Apps connected environment
        az containerapp connected-env create `
        --resource-group $ArcResourceGroupName `
        --name $CONNECTED_ENVIRONMENT_NAME `
        --custom-location $CUSTOM_LOCATION_ID `
        --location eastus

        # DEBUG: validate that the connected environment is successfully created
        if ($Debug) {
            Write-Debug az containerapp connected-env show --resource-group $ArcResourceGroupName --name $CONNECTED_ENVIRONMENT_NAME
        }

        # Create a new resource group for the container app
        $myResourceGroup="${imageName}-resource-group"
        az group create --name $myResourceGroup --location eastus

        # Get the custom location id
        $customLocationId=$(az customlocation show --resource-group $ArcResourceGroupName --name $CUSTOM_LOCATION_NAME --query id --output tsv)
        
        # Get info about the connected environment
        $myContainerApp="${imageName}-container-app"
        $myConnectedEnvironment=$(az containerapp connected-env list --custom-location $customLocationId -o tsv --query '[].id')

        # create acr and group
        az group create --name $ArcResourceGroupName --location eastus
        az acr create --resource-group $ArcResourceGroupName --name $ACRName --sku Basic

        # Wait for the ACR to be created
        Start-Sleep -Seconds 10   

        # login to acr and get login server
        az acr login --name $ACRName
        $ACRLoginServer = $(az acr show --name $ACRName --query loginServer --output tsv)

        # DEBUG: Test ACR login
        if ($Debug) {
            Write-Debug az acr show --name $ACRName
            Write-Debug az acr repository list --name $ACRName --output table
        }

        # Build and push docker image
        cd .\DemoApp
        docker build -t ${imageName} .
        docker tag ${imageName} ${ACRLoginServer}/${imageName}:latest
        docker push ${ACRLoginServer}/${imageName}:latest
        cd ..

        # Enable admin user in ACR and get password
        az acr update -n $ACRName --admin-enabled true
        $password = $(az acr credential show --name ${ACRName} --query passwords[0].value --output tsv)

        # Create container app
        az containerapp create `
        --resource-group $myResourceGroup `
        --name $myContainerApp `
        --environment $myConnectedEnvironment `
        --environment-type connected `
        --registry-server ${ACRLoginServer} `
        --registry-username ${ACRName} `
        --registry-password $password `
        --image "${ACRLoginServer}/${imageName}:latest" `
        --target-port 80 `
        --ingress 'external' `
        
        # Open the container app in a browser
        az containerapp browse --resource-group $myResourceGroup --name $myContainerApp
    }
    catch {
        # Catch any error
        Write-Error "An error occurred"
        Write-Error $Error[0]
    }  
}

CreateContainerAppOnArcEnabledAksEz -AKSClusterResourceGroupName "my-aks-cluster-group" `
                                    -location "westus" `
                                    -AKSName "my-aks-cluster"`
                                    -edgeZone "losangeles" `
                                    -nodeCount 2 `
                                    -vmSize "standard_nv12ads_a10_v5" `
                                    -ArcResourceGroupName "myArcResourceGroup" `
                                    -CONNECTED_ENVIRONMENT_NAME "myConnectedEnvironment" `
                                    -CUSTOM_LOCATION_NAME "myCustomLocation" `
                                    -SubscriptionId "<your subscription>"`
                                    -ACRName "containerappezacr" `
                                    -imageName "myimage"

Bereinigen von Ressourcen

Wenn Sie die Ressourcen nicht mehr benötigen, löschen Sie die Ressourcengruppe "my-aks-cluster-group " und alle darin enthaltenen Ressourcen mithilfe des Befehls zum Löschen der Az-Gruppe .

az group delete --name my-aks-cluster-group