你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

在扩展区域中部署已启用 Arc 的工作负载:容器应用

本文介绍如何在扩展区域中部署已启用 Arc 的 ContainerApp。 请查看 什么是 Azure 扩展区域?| 服务 以了解当前支持的 PaaS 工作负荷。 随时可浏览 Azure Arc 上的容器应用概述 | Microsoft Learn,更详细了解 Azure Arc 上的容器应用。

先决条件

注释

使用预期的扩展位置作为位置变量。

入门指南

如果你已经熟悉了主题,则可以跳过此段落。 下面是在继续创建之前可能需要阅读的重要主题:

在扩展区域中通过已启用 Arc 的 AKS 创建容器应用

创建已启用 Arc 的 AKS 群集后,可以继续使用以下 PowerShell 脚本在扩展区域中的 AKS 群集上创建容器应用,并将其连接到已启用 Azure Arc 的 Kubernetes。

注释

请确保将已启用 Arc 的 AKS 步骤中的参数正确传输到脚本中。

# . "./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"

清理资源

如果不再需要,请使用 az group delete 命令删除 my-aks-cluster-group 资源组及其包含的所有资源。

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