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

教程:在已启用 Azure Arc 的 Kubernetes 上启用 Azure 容器应用(预览版)


借助已启用 Azure Arc 的 Kubernetes 群集,可以在本地或云 Kubernetes 群集中创建支持容器应用的自定义位置,以便像在任何其他区域中一样部署 Azure 容器应用应用程序。

本教程介绍如何在已启用 Arc 的 Kubernetes 群集上启用 Azure 容器应用。 在本教程中,将:

  • 创建已连接的群集。
  • 创建 Log Analytics 工作区。
  • 安装容器应用扩展。
  • 创建自定义位置。
  • 创建 Azure 容器应用连接环境。

注意

在预览期间,生产配置中不支持 Arc 上的 Azure 容器应用。 本文提供了一个仅供评估的示例配置。

本教程使用 Azure Kubernetes 服务 (AKS) 提供从头开始设置环境的具体说明。 但是,对于生产工作负载,你可能不希望在 AKS 群集上启用 Azure Arc,因为它已在 Azure 中进行管理。

先决条件

设置

安装以下 Azure CLI 扩展。

az extension add --name connectedk8s  --upgrade --yes
az extension add --name k8s-extension --upgrade --yes
az extension add --name customlocation --upgrade --yes
az extension remove --name containerapp
az extension add --source https://aka.ms/acaarccli/containerapp-latest-py2.py3-none-any.whl --yes

注册所需的命名空间。

az provider register --namespace Microsoft.ExtendedLocation --wait
az provider register --namespace Microsoft.KubernetesConfiguration --wait
az provider register --namespace Microsoft.App --wait
az provider register --namespace Microsoft.OperationalInsights --wait

根据 Kubernetes 群集部署设置环境变量。

GROUP_NAME="my-arc-cluster-group"
AKS_CLUSTER_GROUP_NAME="my-aks-cluster-group"
AKS_NAME="my-aks-cluster"
LOCATION="eastus"

创建已连接的群集

以下步骤将帮助你开始了解服务,但对于生产部署,应将它们视为说明性的,而不是规范性的。 请参阅快速入门:将现有 Kubernetes 群集连接到 Azure Arc,了解有关如何创建启用了 Azure Arc 的 Kubernetes 群集的常规说明。

  1. 在 Azure Kubernetes 服务中创建群集。

    az group create --name $AKS_CLUSTER_GROUP_NAME --location $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 资源的资源组。

    az group create --name $GROUP_NAME --location $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 Analytics 工作区提供对已启用 Azure Arc 的 Kubernetes 群集中运行的容器应用应用程序日志的访问。 Log Analytics 工作区是可选的,但建议使用。

  1. 创建 Log Analytics 工作区。

    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. 将以下环境变量设置为所需的容器应用扩展名称、应在其中预配资源的群集命名空间,以及 Azure 容器应用连接环境的名称。 为 <connected-environment-name> 选择唯一的名称。 连接环境名称将成为在 Azure 容器应用连接环境中创建的应用域名的一部分。

    EXTENSION_NAME="appenv-ext"
    NAMESPACE="appplat-ns"
    CONNECTED_ENVIRONMENT_NAME="<connected-environment-name>"
    
  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.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=${AKS_CLUSTER_GROUP_NAME}" \
        --configuration-settings "logProcessor.appLogs.destination=log-analytics" \
        --configuration-protected-settings "logProcessor.appLogs.logAnalyticsConfig.customerId=${LOG_ANALYTICS_WORKSPACE_ID_ENC}" \
        --configuration-protected-settings "logProcessor.appLogs.logAnalyticsConfig.sharedKey=${LOG_ANALYTICS_KEY_ENC}"
    

    注意

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

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

    参数 说明
    Microsoft.CustomLocation.ServiceAccount 为自定义位置创建的服务帐户。 建议将其设置为值 default
    appsNamespace 用于创建应用定义和修订的命名空间。 它必须与扩展版本命名空间匹配。
    clusterName 将针对此扩展创建的容器应用扩展 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 工作区共享密钥。 此参数应配置为受保护的设置。
    envoy.annotations.service.beta.kubernetes.io/azure-load-balancer-resource-group Azure Kubernetes 服务群集所在的资源组的名称。 仅当基础群集是 Azure Kubernetes 服务时才有效并且需要。
  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.provisioningState!='Pending'" --api-version "2020-07-01-preview"
    

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

kubectl get pods -n $NAMESPACE

若要详细了解这些 Pod 及其在系统中的角色,请参阅 Azure Arc 概述

创建自定义位置

自定义位置是分配给 Azure 容器应用连接环境的 Azure 位置。

  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)
    

创建 Azure 容器应用连接环境

开始在自定义位置创建应用之前,需要一个 Azure 容器应用连接环境

  1. 创建容器应用连接环境:

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

    az containerapp connected-env show --resource-group $GROUP_NAME --name $CONNECTED_ENVIRONMENT_NAME
    

后续步骤