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

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

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

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

先决条件

若没有 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 和 AKS HCI 的一个有效存储类,但可能不适用于其他分发版/平台。
    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
    

后续步骤