教程:使用 Azure CLI 创建流量管理器链接记录

在这个教程中,你要用 Azure CLI 在 Azure DNS 中创建一个流量管理器关联记录。 流量管理器关联记录将一个DNS记录直接连接到Azure 流量管理器配置文件,向没有中间CNAME解析的客户端返回IP地址。

Important

流量管理器关联记录当前处于预览阶段。 有关适用于 beta 版、预览版或尚未正式发布的 Azure 功能的法律条款,请参阅 Azure 预览补充使用条款

关于基于门户的攻略,请参见使用 Azure 门户创建流量管理器链接记录。 有关概念概述,请参见 交通管理链接记录概述

本教程中,您将学习如何:

  • 建立网络和虚拟机基础设施。
  • 创建一个带端点的流量管理器配置文件。
  • 使用 Azure CLI 创建 Traffic Manager 关联记录。
  • 测试流量管理器的关联记录。

如果没有 Azure 订阅,可在开始前创建一个试用帐户

Prerequisites

  • 拥有有效订阅的 Azure 帐户。

  • 在本地安装 Azure CLI 2.60 或更高版本。 请运行 az --version 以查看版本。 若要安装或升级,请参阅安装 Azure CLI

  • 托管在 Azure DNS 中的域名。 如果你没有 Azure DNS 区域,创建一个委托你的域名给 Azure DNS。

    Note

    在本教程中,contoso.com 用作示例域名。 将 contoso.com 替换为你自己的域名。

  • 如需在本地运行 CLI 参考命令,请安装 Azure CLI。 如果在 Windows 或 macOS 上运行,请考虑在 Docker 容器中运行 Azure CLI。 有关详细信息,请参阅如何在 Docker 容器中运行 Azure CLI

    • 如果使用本地安装,请使用 az login 命令登录到Azure CLI。 若要完成身份验证过程,请遵循终端中显示的步骤。 有关其他登录选项,请参阅使用 Azure CLI 登录

    • 出现提示时,请在首次使用时安装 Azure CLI 扩展。 有关扩展的详细信息,请参阅 将扩展与 Azure CLI 配合使用

    • 运行az version命令,以查看已安装的版本和依赖库。 若要升级到最新版本,请运行az upgrade

设置环境变量。

请为本教程中使用的资源名称和位置设置变量,以避免在每个命令中重复使用。

RESOURCE_GROUP="test-rg"
LOCATION="chinanorth3"
VNET_NAME="vnet-1"
TM_PROFILE_NAME="tm-profile"
DNS_ZONE="contoso.com"

创建资源组

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

创建虚拟网络

az network vnet create \
    --resource-group $RESOURCE_GROUP \
    --name $VNET_NAME \
    --address-prefix 10.10.0.0/16 \
    --subnet-name subnet-1 \
    --subnet-prefix 10.10.0.0/24

创建 Web 服务器虚拟机

创建两台带有公共IP地址的Ubuntu虚拟机作为流量管理器端点。

创建公共IP地址

az network public-ip create \
    --resource-group $RESOURCE_GROUP \
    --name public-ip-1 \
    --sku Standard \
    --dns-name vm-1-tmlink

az network public-ip create \
    --resource-group $RESOURCE_GROUP \
    --name public-ip-2 \
    --sku Standard \
    --dns-name vm-2-tmlink

创建网络安全组

az network nsg create \
    --resource-group $RESOURCE_GROUP \
    --name nsg-1

az network nsg rule create \
    --resource-group $RESOURCE_GROUP \
    --nsg-name nsg-1 \
    --name AllowHTTP \
    --protocol tcp \
    --priority 100 \
    --destination-port-range 80

az network nsg rule create \
    --resource-group $RESOURCE_GROUP \
    --nsg-name nsg-1 \
    --name AllowHTTPS \
    --protocol tcp \
    --priority 110 \
    --destination-port-range 443

创建虚拟机网卡

az network nic create \
    --resource-group $RESOURCE_GROUP \
    --name nic-1 \
    --vnet-name $VNET_NAME \
    --subnet subnet-1 \
    --network-security-group nsg-1 \
    --public-ip-address public-ip-1

az network nic create \
    --resource-group $RESOURCE_GROUP \
    --name nic-2 \
    --vnet-name $VNET_NAME \
    --subnet subnet-1 \
    --network-security-group nsg-1 \
    --public-ip-address public-ip-2

创建虚拟机

Note

用你的SSH公钥文件内容替换 <your-ssh-public-key> ,或者用 --generate-ssh-keys 它创建一个新的密钥对。

az vm create \
    --resource-group $RESOURCE_GROUP \
    --name vm-1 \
    --nics nic-1 \
    --image Ubuntu2404 \
    --admin-username azureuser \
    --generate-ssh-keys \
    --no-wait

az vm create \
    --resource-group $RESOURCE_GROUP \
    --name vm-2 \
    --nics nic-2 \
    --image Ubuntu2404 \
    --admin-username azureuser \
    --generate-ssh-keys

最后一个命令等待 vm-2 的创建。 命令返回时,两个虚拟机都已准备好。

在两个虚拟机上安装 NGINX

az vm run-command invoke \
    --resource-group $RESOURCE_GROUP \
    --name vm-1 \
    --command-id RunShellScript \
    --scripts "sudo apt-get update && sudo apt-get install -y nginx && echo 'Hello World from vm-1' | sudo tee /var/www/html/index.html"

az vm run-command invoke \
    --resource-group $RESOURCE_GROUP \
    --name vm-2 \
    --command-id RunShellScript \
    --scripts "sudo apt-get update && sudo apt-get install -y nginx && echo 'Hello World from vm-2' | sudo tee /var/www/html/index.html"

检索公共IP地址

注意两个虚拟机的IP地址。 添加流量管理器端点时需要它们。

VM1_IP=$(az network public-ip show \
    --resource-group $RESOURCE_GROUP \
    --name public-ip-1 \
    --query ipAddress \
    --output tsv)

VM2_IP=$(az network public-ip show \
    --resource-group $RESOURCE_GROUP \
    --name public-ip-2 \
    --query ipAddress \
    --output tsv)

echo "vm-1 IP: $VM1_IP"
echo "vm-2 IP: $VM2_IP"

创建流量管理器配置文件

az network traffic-manager profile create \
    --resource-group $RESOURCE_GROUP \
    --name $TM_PROFILE_NAME \
    --routing-method Priority \
    --unique-dns-name tm-profile-$RANDOM

向流量管理器配置文件添加端点

az network traffic-manager endpoint create \
    --resource-group $RESOURCE_GROUP \
    --profile-name $TM_PROFILE_NAME \
    --name tmendpoint-1 \
    --type externalEndpoints \
    --target $VM1_IP \
    --priority 1

az network traffic-manager endpoint create \
    --resource-group $RESOURCE_GROUP \
    --profile-name $TM_PROFILE_NAME \
    --name tmendpoint-2 \
    --type externalEndpoints \
    --target $VM2_IP \
    --priority 2

获取流量管理器配置文件的完整资源ID。 创建关联记录时需要它。

TM_PROFILE_ID=$(az network traffic-manager profile show \
    --resource-group $RESOURCE_GROUP \
    --name $TM_PROFILE_NAME \
    --query id \
    --output tsv)

echo "Traffic Manager profile ID: $TM_PROFILE_ID"

创建流量管理器关联记录

使用 az network dns record-set a create 并配合 --traffic-management-profile 参数创建流量管理器链接记录。 以下命令在区域顶点()@创建一个A记录。

Note

--traffic-management-profile参数可在 Azure CLI 2.60 及以上版本中使用,并且需要 Traffic Manager Linked Records 预览 API(2024-06-01-preview或更高版本)。

az network dns record-set a create \
    --resource-group <dns-zone-resource-group> \
    --zone-name $DNS_ZONE \
    --name "@" \
    --traffic-management-profile $TM_PROFILE_ID

Note

用包含你Azure DNS区域的资源组替换<dns-zone-resource-group>。 这可能与包含流量管理器配置文件的资源组不同。

要为子域名创建流量管理器链接记录,而不是区域顶点,请用子域名替换 "@" ,例如 "www"

az network dns record-set a create \
    --resource-group <dns-zone-resource-group> \
    --zone-name $DNS_ZONE \
    --name "www" \
    --traffic-management-profile $TM_PROFILE_ID

核实链接的记录

az network dns record-set a show \
    --resource-group <dns-zone-resource-group> \
    --zone-name $DNS_ZONE \
    --name "@"

输出包含一个 trafficManagementProfile 属性,其中带有流量管理器配置文件资源 ID,确认链接已建立:

{
  "name": "@",
  "properties": {
    "trafficManagementProfile": {
      "id": "/subscriptions/.../resourceGroups/test-rg/providers/Microsoft.Network/trafficManagerProfiles/tm-profile"
    },
    "TTL": 30,
    ...
  }
}

Note

输出中显示的TTL值继承自流量管理器配置文件的DNS配置。 记录创建时指定的任何TTL值都被忽略。

测试流量管理器关联记录

要测试名称解析,可以直接查询你所在区域的 Azure DNS 名称服务器之一。 首先,列出你所在区域的名称服务器:

az network dns record-set ns show \
    --resource-group <dns-zone-resource-group> \
    --zone-name $DNS_ZONE \
    --name "@" \
    --query "nsRecords[0].nsdname" \
    --output tsv

使用返回的名称服务器和 nslookup 测试解析:

nslookup contoso.com <name-server-from-above>

响应包含最高优先级健康流量管理器端点的IP地址——答案中没有任何CNAME记录。 这确认了流量管理器关联记录直接返回IP地址。

测试故障转移

  1. 访问您的域名。 你应该看看 VM-1 的 NGINX 页面。

  2. 停止 vm-1 虚拟机:

    az vm stop --resource-group $RESOURCE_GROUP --name vm-1
    
  3. 等待几分钟,让 Traffic Manager 检测到该终结点处于不正常状态。

  4. 清除本地DNS缓存(ipconfig /flushdnsWindows和 sudo dscacheutil -flushcache macOS上),然后重新浏览你的域名。 你现在应该能看到 vm-2的页面了。

  5. 重启 vm-1 以恢复原始配置:

    az vm start --resource-group $RESOURCE_GROUP --name vm-1
    

清理资源

当你不再需要本教程中创建的资源时,删除资源组和DNS记录:

# Delete the resource group and all resources within it
az group delete --name $RESOURCE_GROUP --yes --no-wait

# Delete the Traffic Manager Linked Record from the DNS zone
az network dns record-set a delete \
    --resource-group <dns-zone-resource-group> \
    --zone-name $DNS_ZONE \
    --name "@" \
    --yes

后续步骤

在这个教程中,你用 Azure CLI 创建了一个流量管理器的链接记录。 该记录将你的 DNS 区域顶点连接到 Traffic Manager 配置文件,直接返回 IP 地址给客户端。