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

设置启用了 Azure Arc 的 Kubernetes 群集,以便运行应用服务、Functions 和逻辑应用(预览版)

重要

已启用 Arc 的 Kubernetes 上的 Azure 应用服务将于 2026 年 3 月 31 日停用。 从 2025 年 9 月 30 日开始,客户将无法再安装扩展。 我们建议你迁移到启用 Arc 的 Kubernetes 上的 Azure 容器应用等解决方案,迁移还允许你利用混合逻辑应用来处理集成工作负载。

如果有启用了 Azure Arc 的 Kubernetes 群集,可使用它创建启用了应用服务的自定义位置,并部署 Web 应用、函数应用和逻辑应用。

启用了 Azure Arc 的 Kubernetes 可让本地或云 Kubernetes 群集对 Azure 中的应用服务、Functions 和逻辑应用可见。 你可像在另一个 Azure 区域中那样创建应用并进行部署。

先决条件

添加 Azure CLI 扩展

Azure Cloud Shell 中启动 Bash 环境。

由于这些 CLI 命令尚未成为核心 CLI 集的一部分,因此请通过以下命令添加它们。

az extension add --upgrade --yes --name connectedk8s
az extension add --upgrade --yes --name k8s-extension
az extension add --upgrade --yes --name customlocation
az provider register --namespace Microsoft.ExtendedLocation --wait
az provider register --namespace Microsoft.Web --wait
az provider register --namespace Microsoft.KubernetesConfiguration --wait
az extension remove --name appservice-kube
az extension add --upgrade --yes --name appservice-kube

创建已连接的群集

注意

本教程使用 Azure Kubernetes 服务 (AKS) 提供从头开始设置环境的具体说明。 但是,对于生产工作负载,你可能不希望在 AKS 群集上启用 Azure Arc,因为它已在 Azure 中进行管理。 这些步骤将帮助你开始了解服务,但对于生产部署,应将它们视为说明性的,而不是规范性的。 请参阅快速入门:将现有 Kubernetes 群集连接到 Azure Arc,了解有关如何创建启用了 Azure Arc 的 Kubernetes 群集的常规说明。

若要创建连接的群集,请执行以下作:

  1. 在 Azure Kubernetes 服务中使用公共 IP 创建群集。 将 <group-name> 替换为所需的资源组名称。

    AKS_CLUSTER_GROUP_NAME="<group-name>" # Name of resource group for the AKS cluster
    AKS_NAME="${aksClusterGroupName}-aks" # Name of the AKS cluster
    RESOURCE_LOCATION="eastus" # "eastus" or "westeurope"
    
    az group create -g $AKS_CLUSTER_GROUP_NAME -l $RESOURCE_LOCATION
    az aks create --resource-group $AKS_CLUSTER_GROUP_NAME --name $AKS_NAME --enable-aad --generate-ssh-keys
    
  2. 获取 kubeconfig 文件并测试与群集的连接。 默认情况下,kubeconfig 文件保存到 ~/.kube/config

    az aks get-credentials --resource-group $AKS_CLUSTER_GROUP_NAME --name $AKS_NAME --admin
    
    kubectl get ns
    
  3. 创建用于包含 Azure Arc 资源的资源组。 将 <group-name> 替换为所需的资源组名称。

    GROUP_NAME="<group-name>" # Name of resource group for the connected cluster
    
    az group create -g $GROUP_NAME -l $RESOURCE_LOCATION
    
  4. 将创建的群集连接到 Azure Arc。

    CLUSTER_NAME="${GROUP_NAME}-cluster" # Name of the connected cluster resource
    
    az connectedk8s connect --resource-group $GROUP_NAME --name $CLUSTER_NAME
    
  5. 通过以下命令验证连接。 它应显示 provisioningState 属性处于 Succeeded 状态。 如果不是,请在一分钟后再次运行该命令。

    az connectedk8s show --resource-group $GROUP_NAME --name $CLUSTER_NAME
    

创建 Log Analytics 工作区

虽然不需要 Log Analytic 工作区即可在 Azure Arc 中运行应用服务,但开发人员可通过它来获得在启用了 Azure Arc 的 Kubernetes 群集中运行的应用的应用程序日志。

  1. 为简单起见,接下来请创建工作区。

    WORKSPACE_NAME="$GROUP_NAME-workspace" # Name of the Log Analytics workspace
    
    az monitor log-analytics workspace create \
        --resource-group $GROUP_NAME \
        --workspace-name $WORKSPACE_NAME
    
  2. 运行以下命令,获取现有 Log Analytics 工作区的编码工作区 ID 和共享密钥。 下一步需要用到它们。

    LOG_ANALYTICS_WORKSPACE_ID=$(az monitor log-analytics workspace show \
        --resource-group $GROUP_NAME \
        --workspace-name $WORKSPACE_NAME \
        --query customerId \
        --output tsv)
    LOG_ANALYTICS_WORKSPACE_ID_ENC=$(printf %s $LOG_ANALYTICS_WORKSPACE_ID | base64 -w0) # Needed for the next step
    LOG_ANALYTICS_KEY=$(az monitor log-analytics workspace get-shared-keys \
        --resource-group $GROUP_NAME \
        --workspace-name $WORKSPACE_NAME \
        --query primarySharedKey \
        --output tsv)
    LOG_ANALYTICS_KEY_ENC=$(printf %s $LOG_ANALYTICS_KEY | base64 -w0) # Needed for the next step
    

安装应用服务扩展

安装应用服务扩展:

  1. 应用服务扩展的所需名称、应在其中预配资源的群集命名空间以及应用服务 Kubernetes 环境的名称设置以下环境变量。 为 <kube-environment-name> 选择唯一名称,因为它是应用服务 Kubernetes 环境中创建的应用的域名中的一部分。

    EXTENSION_NAME="appservice-ext" # Name of the App Service extension
    NAMESPACE="appservice-ns" # Namespace in your cluster to install the extension and provision resources
    KUBE_ENVIRONMENT_NAME="<kube-environment-name>" # Name of the App Service Kubernetes environment resource
    
  2. 在启用 Log Analytics 的情况下将应用服务扩展安装到连接了 Azure Arc 的群集。 同样,虽然 Log Analytics 不是必需的,但之后无法把其添加到扩展中,所以现在添加更加容易。

    az k8s-extension create \
        --resource-group $GROUP_NAME \
        --name $EXTENSION_NAME \
        --cluster-type connectedClusters \
        --cluster-name $CLUSTER_NAME \
        --extension-type 'Microsoft.Web.Appservice' \
        --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=${KUBE_ENVIRONMENT_NAME}" \
        --configuration-settings "keda.enabled=true" \
        --configuration-settings "buildService.storageClassName=default" \
        --configuration-settings "buildService.storageAccessMode=ReadWriteOnce" \
        --configuration-settings "customConfigMap=${NAMESPACE}/kube-environment-config" \
        --configuration-settings "envoy.annotations.service.beta.kubernetes.io/azure-load-balancer-resource-group=${aksClusterGroupName}" \
        --configuration-settings "logProcessor.appLogs.destination=log-analytics" \
        --config-protected-settings "logProcessor.appLogs.logAnalyticsConfig.customerId=${LOG_ANALYTICS_WORKSPACE_ID_ENC}" \
        --config-protected-settings "logProcessor.appLogs.logAnalyticsConfig.sharedKey=${LOG_ANALYTICS_KEY_ENC}"
    

    注意

    若要在不集成 Log Analytics 的情况下安装扩展,请从命令中删除最后三个 --configuration-settings 参数。

    下表描述了运行命令时的各种 --configuration-settings 参数:

    参数 说明
    Microsoft.CustomLocation.ServiceAccount 应为创建的自定义位置创建的服务帐户。 建议将此值设置为值 default
    appsNamespace 用于预配应用定义和 Pod 的命名空间。 必须与扩展版本命名空间匹配。
    clusterName 针对此扩展创建的应用服务 Kubernetes 环境的名称。
    keda.enabled 是否应在 Kubernetes 群集上安装 KEDA。 接受“覆盖”或“跳过”truefalse
    buildService.storageClassName 生成服务用于存储项目的存储类的名称。 像 default 这样的值指定了名为 default 的类,而不是被标记为默认值的任何类。 Default 是 AKS 和 Azure Local 上的 AKS 的一个有效存储类,但可能不适用于其他分发/平台。
    buildService.storageAccessMode 与命名存储类一起使用的访问模式。 接受“覆盖”或“跳过”ReadWriteOnceReadWriteMany
    customConfigMap 将由应用服务 Kubernetes 环境设置的 ConfigMap 的名称。 目前,它必须是 <namespace>/kube-environment-config,其中 <namespace> 应替换为 appsNamespace 的值。
    envoy.annotations.service.beta.kubernetes.io/azure-load-balancer-resource-group Azure Kubernetes 服务群集所在的资源组的名称。 仅当基础群集是 Azure Kubernetes 服务时才有效并且需要。
    logProcessor.appLogs.destination 可选。 接受 log-analyticsnone,选择“none”将禁用平台日志。
    logProcessor.appLogs.logAnalyticsConfig.customerId 仅当 logProcessor.appLogs.destination 设置为 log-analytics 时才需要。 base64 编码的 Log Analytics 工作区 ID。 此参数应配置为受保护的设置。
    logProcessor.appLogs.logAnalyticsConfig.sharedKey 仅当 logProcessor.appLogs.destination 设置为 log-analytics 时才需要。 base64 编码的 Log Analytics 工作区共享密钥。 此参数应配置为受保护的设置。
  3. 保存应用服务扩展的 id 属性以备后用。

    EXTENSION_ID=$(az k8s-extension show \
        --cluster-type connectedClusters \
        --cluster-name $CLUSTER_NAME \
        --resource-group $GROUP_NAME \
        --name $EXTENSION_NAME \
        --query id \
        --output tsv)
    
  4. 等待扩展完全安装后再继续。 你可运行以下命令,让终端会话等待安装过程完成:

    az resource wait --ids $EXTENSION_ID --custom "properties.installState!='Pending'" --api-version "2020-07-01-preview"
    

可使用 kubectl 查看在 Kubernetes 群集中创建的 Pod:

kubectl get pods -n $NAMESPACE

你可从应用服务扩展创建的 Pod 中详细了解这些 Pod 及其在系统中的作用。

创建自定义位置

Azure 中的自定义位置用于分配应用服务 Kubernetes 环境。

  1. 为自定义位置的预期名称和连接到 Azure Arc 群集的 ID 设置以下环境变量。

    CUSTOM_LOCATION_NAME="my-custom-location" # Name of the custom location
    
    CONNECTED_CLUSTER_ID=$(az connectedk8s show --resource-group $GROUP_NAME --name $CLUSTER_NAME --query id --output tsv)
    
  2. 创建自定义位置:

    az customlocation create \
        --resource-group $GROUP_NAME \
        --name $CUSTOM_LOCATION_NAME \
        --host-resource-id $CONNECTED_CLUSTER_ID \
        --namespace $NAMESPACE \ 
        --cluster-extension-ids $EXTENSION_ID
    

    注意

    如果在群集上创建自定义位置时遇到问题,可能需要在群集上启用自定义位置功能。 如果使用服务主体登录到 CLI,或者使用对群集资源具有受限权限的 Microsoft Entra 用户登录,则这是必需的。

  3. 通过以下命令验证自定义位置是否成功创建。 输出应显示 provisioningState 属性处于 Succeeded 状态。 如果不是,请在一分钟后再次运行该命令。

    az customlocation show --resource-group $GROUP_NAME --name $CUSTOM_LOCATION_NAME
    
  4. 保存自定义位置 ID,供下一步使用。

    CUSTOM_LOCATION_ID=$(az customlocation show \
        --resource-group $GROUP_NAME \
        --name $CUSTOM_LOCATION_NAME \
        --query id \
        --output tsv)
    

创建应用服务 Kubernetes 环境

开始在自定义位置创建应用之前,需要应用服务 Kubernetes 环境

  1. 创建应用服务 Kubernetes 环境:

    az appservice kube create \
        --resource-group $GROUP_NAME \
        --name $KUBE_ENVIRONMENT_NAME \
        --custom-location $CUSTOM_LOCATION_ID 
    
  2. 通过以下命令验证应用服务 Kubernetes 环境是否成功创建。 输出应显示 provisioningState 属性处于 Succeeded 状态。 如果不是,请在一分钟后再次运行该命令。

    az appservice kube show --resource-group $GROUP_NAME --name $KUBE_ENVIRONMENT_NAME