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

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

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

先决条件

创建容器应用

首先请登录到 Azure 门户。

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

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

  3. 选择“创建”按钮。

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

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

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

    设置 价值
    环境名称 输入“my-environment”。
    区域冗余 选择禁用
  7. 选择“网络”选项卡。

  8. 将 公用网络访问 设置为 “禁用”:阻止来自公共 Internet 的所有传入流量。 默认情况下,启用公用网络访问,这意味着禁用专用终结点。

  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. 选择“使用快速入门图像”。

部署容器应用

  1. 在页面底部,选择“ 查看 + 创建”。

    • 如果未找到任何错误,则“ 创建 ”按钮可用。
    • 如果存在错误,则包含错误的任何选项卡都标有红点。 转到每个选项卡。 包含错误的字段以红色突出显示或用红色 X 标记。修复所有错误,然后选择“ 查看 + 创建 ”。
  2. 选择 创建。

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

验证部署

  1. 选择“转到资源”,查看新的容器应用。

  2. 在 应用程序 URL 旁边,选择用于查看应用程序的链接。

  1. 浏览到容器应用终结点时,会看到以下消息:

    The public network access on this managed environment is disabled. To connect to this managed environment, please use the Private Endpoint from inside your virtual network. To learn more https://aka.ms/PrivateEndpointTroubleshooting.
    

先决条件

  • 具有有效订阅的 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="chinanorth3"
ENVIRONMENT_NAME="my-environment"
CONTAINERAPP_NAME="my-container-app"
VNET_NAME="my-vnet"
SUBNET_NAME="my-subnet"
PRIVATE_ENDPOINT="my-private-endpoint"
PRIVATE_ENDPOINT_CONNECTION="my-private-endpoint-connection"
PRIVATE_DNS_ZONE="privatelink.${LOCATION}.azurecontainerapps.cn"
DNS_LINK="my-dns-link"

创建 Azure 资源组

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

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

创建虚拟网络

  1. 创建 Azure 虚拟网络 (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. 创建容器应用环境。 专用终结点仅在工作负荷配置文件环境中受支持,这是新环境的默认类型。

    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”。
    区域 选择“中国北部 3”。
    可用性选项 选择“无需基础结构冗余”。
    安全类型 选择“标准” 。
    图像 选择“Windows Server 2022 Datacenter: Azure Edition - x64 Gen2”。
    用户名 输入“azureuser”。
    密码 输入密码。
    确认密码 再次输入密码。
    公共入站端口 选择无。
  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 个字符之间。
  • 必须具有以下三个字符:1 个小写字符、1 个大写字符、1 个数字和 1 个特殊字符。

测试连接

  1. 首先请登录到 Azure 门户。

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

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

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

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

  6. 选择 连接。

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

  8. 在 PowerShell 中运行以下命令。 将<占位符>替换成自己的值。

    nslookup <CONTAINER_APP_ENDPOINT>
    

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

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

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

清理资源

如果不打算继续使用此应用程序,可以删除 my-container-apps 资源组。 此作将删除 Azure 容器应用实例和所有关联的服务。

谨慎

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

az group delete --name $RESOURCE_GROUP