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

将专用终结点用于 Azure 容器应用环境

本文介绍如何使用专用终结点安全地访问 Azure 容器应用,而不会将其公开到公共 Internet。

专用终结点使用虚拟网络 (VNet) 中的专用 IP 地址。 此终结点可以通过私密且安全的方式连接到由 Azure 专用链接提供支持的服务。

先决条件

创建容器应用

首先请登录到 Azure 门户

  1. 在顶部搜索栏中搜索“容器应用”。

  2. 在搜索结果中选择“容器应用”。

  3. 选择“创建”按钮。

  4. 在“创建容器应用”页中的“基本信息”选项卡上,输入以下值。

    设置 操作
    订阅 选择 Azure 订阅。
    资源组 选择“新建”,并输入“my-container-apps” 。
    容器应用名称 输入“my-container-app”。
    部署源 选择“容器映像”
    区域 选择“美国中部”。
  5. 在“创建容器应用环境”字段中,选择“新建”链接。

  6. 在“创建容器应用环境”页中的“基本信息”选项卡上,输入以下值:

    设置
    环境名称 输入“my-environment”。
    区域冗余 选择“已禁用”
  7. 选择“网络”选项卡以创建虚拟网络 (VNet)。 公用网络访问默认已启用,这意味着专用终结点处于禁用状态。

  8. 禁用公用网络访问。

  9. 将“使用自己的虚拟网络”设置为“否”。 可以使用现有的 VNet,但专用终结点仅受工作负载配置文件环境支持,这就需要一个最小 CIDR 范围为 /27 或更大的子网。 若要详细了解子网大小调整,请参阅网络体系结构概述

  10. 将“启用专用终结点”设置为“是”。

  11. 将“专用终结点名称”设置为“my-private-endpoint”。

  12. 在“专用终结点虚拟网络”字段中,选择“新建”链接。

  13. 在“创建虚拟网络”页中,将“虚拟网络”设置为“my-private-endpoint-vnet”。 选择“确定”

  14. 在“专用终结点虚拟网络子网”字段中,选择“新建”链接。

  15. 在“创建子网”页中,将“子网名称”设置为“my-private-endpoint-vnet-subnet”。 选择“确定”

  16. 将“DNS”设置为“Azure 专用 DNS 区域”。

  17. 选择创建

  18. 在“创建容器应用”页中的“基本信息”选项卡上,选择“下一步: 容器 >”。

  19. 在“创建容器应用”页中的“容器”选项卡上,选择“使用快速入门映像”。

  20. 选择页面底部的“查看和创建”。

    如果未找到任何错误,则会启用“创建”按钮。

    如果存在错误,则包含错误的任何选项卡都标有红点。 导航到相应的选项卡。包含错误的字段以红色突出显示。 修复所有错误后,再次选择“查看并创建”。

  21. 选择“创建”。

    此时会显示包含消息“部署正在进行”的页面。 部署成功完成后,会看到消息:“部署已完成”。

    浏览到容器应用终结点时,你会收到“ERR_CONNECTION_CLOSED”,因为容器应用环境已禁用公共访问。 需要使用专用终结点访问容器应用。

先决条件

  • 具有活动订阅的 Azure 帐户。

  • 最新版本的 Azure CLI。 为确保运行的是最新版本,请运行以下命令。

    az upgrade
    
  • 适用于 Azure CLI 的 Azure 容器应用扩展的最新版本。 为确保运行的是最新版本,请运行以下命令。

    az extension add --name containerapp --upgrade --allow-preview true
    

    注意

    从 2024 年 5 月开始,Azure CLI 扩展不再默认启用预览功能。 要访问容器应用预览功能,请使用 --allow-preview true 安装容器应用扩展。

有关先决条件和设置的详细信息,请参阅快速入门:使用 containerapp up 部署第一个容器应用

设置环境变量。

设置以下环境变量。

RESOURCE_GROUP="my-container-apps"
LOCATION="centralus"
ENVIRONMENT_NAME="my-environment"
CONTAINERAPP_NAME="my-container-app"
VNET_NAME="my-custom-vnet"
SUBNET_NAME="my-custom-subnet"
PRIVATE_ENDPOINT="my-private-endpoint"
PRIVATE_ENDPOINT_CONNECTION="my-private-endpoint-connection"
PRIVATE_DNS_ZONE="privatelink.${LOCATION}.azurecontainerapps.io"
DNS_LINK="my-dns-link"

创建 Azure 资源组

创建一个资源组来组织与你的容器应用部署相关的服务。

az group create \
    --name $RESOURCE_GROUP \
    --location $LOCATION

创建虚拟网络

Azure 容器应用中的环境围绕一组容器应用创建安全边界。 部署到相同环境的容器应用部署在同一虚拟网络中,并将日志写入同一个 Log Analytics 工作区。

  1. 创建一个 Azure 虚拟网络 (VNet) 与容器应用环境相关联。 该 VNet 必须具有可用于环境部署的子网。 可以使用现有的 VNet,但专用终结点仅受工作负载配置文件环境支持,这就需要一个最小 CIDR 范围为 /27 或更大的子网。 若要详细了解子网大小调整,请参阅网络体系结构概述

    az network vnet create \
        --resource-group $RESOURCE_GROUP \
        --name $VNET_NAME \
        --location $LOCATION \
        --address-prefix 10.0.0.0/16
    
  2. 创建一个子网与 VNet 相关联并包含专用终结点。

    az network vnet subnet create \
        --resource-group $RESOURCE_GROUP \
        --vnet-name $VNET_NAME \
        --name $SUBNET_NAME \
        --address-prefixes 10.0.0.0/21
    
  3. 检索子网 ID。 你将使用此 ID 创建专用终结点。

    SUBNET_ID=$(az network vnet subnet show \
        --resource-group $RESOURCE_GROUP \
        --vnet-name $VNET_NAME \
        --name $SUBNET_NAME \
        --query "id" \
        --output tsv)
    

创建环境

  1. 使用在前面步骤中部署的 VNet 创建容器应用环境。 专用终结点仅受工作负载配置文件环境支持,这是新环境的默认类型。

    az containerapp env create \
        --name $ENVIRONMENT_NAME \
        --resource-group $RESOURCE_GROUP \
        --location $LOCATION
    
  2. 检索环境 ID。 你将使用此 ID 配置环境。

    ENVIRONMENT_ID=$(az containerapp env show \
        --resource-group $RESOURCE_GROUP \
        --name $ENVIRONMENT_NAME \
        --query "id" \
        --output tsv)
    
  3. 禁用环境的公用网络访问。 这是启用专用终结点所必需的。

    az containerapp env update \
        --id $ENVIRONMENT_ID \
        --public-network-access Disabled
    

创建专用终结点

在之前创建的环境和子网中创建专用终结点。

az network private-endpoint create \
    --resource-group $RESOURCE_GROUP \
    --location $LOCATION \
    --name $PRIVATE_ENDPOINT \
    --subnet $SUBNET_ID \
    --private-connection-resource-id $ENVIRONMENT_ID \
    --connection-name $PRIVATE_ENDPOINT_CONNECTION \
    --group-id managedEnvironments

配置专用 DNS 区域

  1. 检索专用终结点 IP 地址。 你将使用此地址将 DNS 记录添加到专用 DNS 区域。

    PRIVATE_ENDPOINT_IP_ADDRESS=$(az network private-endpoint show \
        --name $PRIVATE_ENDPOINT \
        --resource-group $RESOURCE_GROUP \
        --query 'customDnsConfigs[0].ipAddresses[0]' \
        --output tsv)
    
  2. 检索环境默认域。 你将使用此地址将 DNS 记录添加到专用 DNS 区域。

    DNS_RECORD_NAME=$(az containerapp env show \
        --id $ENVIRONMENT_ID \
        --query 'properties.defaultDomain' \
        --output tsv | sed 's/\..*//')
    
  3. 创建专用 DNS 区域。

    az network private-dns zone create \
        --resource-group $RESOURCE_GROUP \
        --name $PRIVATE_DNS_ZONE
    
  4. 在 VNet 与专用 DNS 区域之间创建链接。

    az network private-dns link vnet create \
        --resource-group $RESOURCE_GROUP \
        --zone-name $PRIVATE_DNS_ZONE \
        --name $DNS_LINK \
        --virtual-network $VNET_NAME \
        --registration-enabled false
    
  5. 将专用终结点的记录添加到专用 DNS 区域。

    az network private-dns record-set a add-record \
        --resource-group $RESOURCE_GROUP \
        --zone-name $PRIVATE_DNS_ZONE \
        --record-set-name $DNS_RECORD_NAME \
        --ipv4-address $PRIVATE_ENDPOINT_IP_ADDRESS
    

部署容器应用

在你的环境中部署容器应用。 此容器应用只是使用快速入门映像。

浏览到容器应用终结点时,你会收到“ERR_CONNECTION_CLOSED”,因为容器应用环境已禁用公共访问。 需要使用专用终结点访问容器应用。

az containerapp up \
    --name $CONTAINERAPP_NAME \
    --resource-group $RESOURCE_GROUP \
    --location $LOCATION \
    --environment $ENVIRONMENT_NAME \
    --image mcr.microsoft.com/k8se/quickstart:latest \
    --target-port 80 \
    --ingress external \
    --query properties.configuration.ingress.fqdn

验证专用终结点连接

在本部分中,将创建一个与 VNet 关联的虚拟机,以便访问使用专用终结点定义的容器应用。

创建虚拟机 (VM)

首先请登录到 Azure 门户

  1. 在顶部搜索栏中搜索“虚拟机”

  2. 在搜索结果中,选择“虚拟机”。

  3. 选择创建

  4. 在“创建虚拟机”页的“基本信息”选项卡中,输入以下值

    设置 操作
    订阅 选择 Azure 订阅。
    资源组 选择“my-container-apps”。
    虚拟机名称 输入“azurevm”
    区域 选择“美国中部”。
    可用性选项 选择“无需基础结构冗余”。
    安全类型 选择“标准”。
    映像 选择“Windows Server 2022 Datacenter: Azure Edition - x64 Gen2”
    用户名 输入“azureuser”。
    Password 输入密码。
    确认密码 再次输入密码。
    公共入站端口 选择
  5. 在“网络”选项卡中,输入以下值。

    设置 操作
    虚拟网络 选择“my-private-endpoint-vnet”
    子网 选择“my-private-endpoint-vnet-subnet (10.0.0.0/23)”
    公共 IP 选择
    NIC 网络安全组 选择“高级”。
  6. 选择“查看 + 创建” 。

  7. 选择“创建”。

设置环境变量。

设置以下环境变量。

VM_NAME="azurevm"
VM_ADMIN_USERNAME="azureuser"

创建虚拟机 (VM)

运行以下命令。

az vm create \
    --resource-group $RESOURCE_GROUP \
    --name $VM_NAME \
    --image Win2022Datacenter \
    --public-ip-address "" \
    --vnet-name $VNET_NAME \
    --subnet $SUBNET_NAME \
    --admin-username $VM_ADMIN_USERNAME

运行此命令后,系统会提示你输入 VM 的管理员密码。

管理员用户名长度必须为 1 到 20 个字符。

管理员密码具有以下要求:

  • 长度必须在 12 到 123 个字符之间。
  • 必须包含以下各项中的 3 个:1 个小写字符、1 个大写字符、1 个数字、1 个特殊字符。

测试连接

  1. 首先请登录到 Azure 门户

  2. 搜索在顶部搜索栏中创建的 VM,并从搜索结果中选择它。

  3. 在 VM 的“概述”页中,选择“连接”,然后选择“通过 Bastion 连接”

  4. 在“Bastion”页中,选择“部署 Bastion”。

  5. 将“用户名”和“VM 密码”设置为创建 VM 时使用的用户名和密码

  6. 选择“连接” 。

  7. 连接后,在 VM 中运行 PowerShell。

  8. 在 PowerShell 中运行以下命令。 将 <PLACEHOLDERS> 替换为你的值。

    nslookup <CONTAINER_APP_ENDPOINT>
    

    输出结果类似于下面的示例,其中的占位符替换为你的值<>。

    Server:  UnKnown
    Address:  168.63.129.16
    
    Non-authoritative answer:
    Name:    <ENVIRONMENT_DEFAULT_DOMAIN>.privatelink.<LOCATION>.azurecontainerapps.io
    
    Address:  10.0.0.4
    Aliases:  <CONTAINER_APP_ENDPOINT>
    
  9. 在 VM 中打开浏览器。

  10. 浏览到容器应用终结点。 你会看到快速入门容器应用映像的输出。

清理资源

如果不打算继续使用此应用程序,可以删除 my-container-apps 资源组。 这样会删除 Azure 容器应用实例和所有关联的服务。 还会删除容器应用服务自动创建的资源组,其中包含自定义网络组件。

注意

以下命令删除指定的资源组及其包含的所有资源。 如果指定的资源组中存在本指南范围外的资源,这些资源也会被删除。

az group delete --name $RESOURCE_GROUP