限制 Azure Kubernetes 服务 (AKS) 专用群集中的 SQL Server 2019 大数据群集的出口流量

重要

Microsoft SQL Server 2019 大数据群集附加产品将停用。 对 SQL Server 2019 大数据群集的支持将于 2025 年 2 月 28 日结束。 具有软件保障的 SQL Server 2019 的所有现有用户都将在平台上获得完全支持,在此之前,该软件将继续通过 SQL Server 累积更新进行维护。 有关详细信息,请参阅公告博客文章Microsoft SQL Server 平台上的大数据选项

可以使用 Azure Kubernetes 服务 (AKS) 限制来自大数据群集的出口流量。 该服务预配标准 SKU 负载均衡器。 默认情况下,设置就位并用于流出量。 现在,默认设置可能不满足所有场景和要求。 例如,如果不允许公共 IP,或者流出量需要其他跃点。 如果群集不允许使用公共 IP,并且位于网络虚拟设备 (NVA) 后面,可以定义用户定义的路由 (UDR) 表。

AKS 群集具有不受限制的出站(流出量)internet 访问权限。 这是出于管理和操作目的。 AKS 群集中的工作器节点需要访问某些端口和完全限定的域名 (FQDN)。 下面是相关示例:

  • 当群集需要在工作器节点 OS 安全更新期间从 Microsoft 容器注册表 (MCR) 中拉取基础系统容器映像时。
  • 当启用了 GPU 的 AKS 工作器节点需要访问 Nvidia 中的终结点来安装驱动程序时。
  • 当客户结合使用 AKS 与 Azure 服务时,例如用于实现企业级合规性的 Azure Policy,以及包含容器见解的 Azure Monitor。
  • 启用开发空间时,以及其他类似的场景。

注意

在 Azure Kubernetes 服务 (AKS) 专用群集中部署大数据群集 (BDC) 时,没有入站依赖项(本文中所提到的除外)。 可以在 Azure Kubernetes 服务 (AKS) 中控制群集节点的出口流量中找到所有出站依赖项。

本文介绍如何使用高级网络和 UDR 在 AKS 专用群集中部署 BDC。 它还探讨了 BDC 与企业级网络环境的进一步集成。

如何使用 Azure 防火墙限制出口流量

Azure 防火墙提供了 Azure Kubernetes 服务 (AzureKubernetesService) FQDN 标记来简化配置。

如需了解有关 FQDN 标记的完整信息,请访问使用 Azure 防火墙限制出口流量

下图展示了如何在 AKS 专用群集上限制流量。

Screenshot that shows AKS private cluster firewall egress traffic.

开发使用 Azure 防火墙的大数据群集的基本体系结构:

  1. 创建资源组和 VNet
  2. 创建和设置 Azure 防火墙
  3. 创建用户定义的路由表
  4. 设置防火墙规则
  5. 创建服务主体 (SP)
  6. 创建 AKS 专用群集
  7. 创建 BDC 部署配置文件
  8. 部署 BDC

创建资源组和 VNet

  1. 定义一组用于创建资源的环境变量。

    export REGION_NAME=<region>
    export RESOURCE_GROUP=private-bdc-aksudr-rg
    export SUBNET_NAME=aks-subnet
    export VNET_NAME=bdc-vnet
    export AKS_NAME=bdcaksprivatecluster
    
  2. 创建资源组

    az group create -n $RESOURCE_GROUP -l $REGION_NAME
    
  3. 创建 VNET

    az network vnet create \
      --resource-group $RESOURCE_GROUP \
      --location $REGION_NAME \
      --name $VNET_NAME \
      --address-prefixes 10.0.0.0/8 \
      --subnet-name $SUBNET_NAME \
      --subnet-prefix 10.1.0.0/16
    
    SUBNET_ID=$(az network vnet subnet show \
      --resource-group $RESOURCE_GROUP \
      --vnet-name $VNET_NAME \
      --name $SUBNET_NAME \
      --query id -o tsv)
    

创建和设置 Azure 防火墙

  1. 定义一组用于创建资源的环境变量。

    export FWNAME=bdcaksazfw
    export FWPUBIP=$FWNAME-ip
    export FWIPCONFIG_NAME=$FWNAME-config
    
    az extension add --name azure-firewall
    
  2. 为防火墙创建专用子网

    注意

    创建后,就无法更改防火墙名称

    az network vnet subnet create \
      --resource-group $RESOURCE_GROUP \
      --vnet-name $VNET_NAME \
      --name AzureFirewallSubnet \
      --address-prefix 10.3.0.0/24
    
     az network firewall create -g $RESOURCE_GROUP -n $FWNAME -l $REGION_NAME --enable-dns-proxy true
    
     az network public-ip create -g $RESOURCE_GROUP -n $FWPUBIP -l $REGION_NAME --sku "Standard"
    
     az network firewall ip-config create -g $RESOURCE_GROUP -f $FWNAME -n $FWIPCONFIG_NAME --public-ip-address $FWPUBIP --vnet-name $VNET_NAME
    

Azure 自动在 Azure 子网、虚拟网络与本地网络之间路由流量。

如何创建用户定义的路由表

可以创建包含 Azure 防火墙跃点的 UDR 表。


export SUBID= <your Azure subscription ID>
export FWROUTE_TABLE_NAME=bdcaks-rt
export FWROUTE_NAME=bdcaksroute
export FWROUTE_NAME_INTERNET=bdcaksrouteinet

export FWPUBLIC_IP=$(az network public-ip show -g $RESOURCE_GROUP -n $FWPUBIP --query "ipAddress" -o tsv)
export FWPRIVATE_IP=$(az network firewall show -g $RESOURCE_GROUP -n $FWNAME --query "ipConfigurations[0].privateIpAddress" -o tsv)

# Create UDR and add a route for Azure Firewall

az network route-table create -g $RESOURCE_GROUP --name $FWROUTE_TABLE_NAME

az network route-table route create -g $RESOURCE_GROUP --name $FWROUTE_NAME --route-table-name $FWROUTE_TABLE_NAME --address-prefix 0.0.0.0/0 --next-hop-type VirtualAppliance --next-hop-ip-address $FWPRIVATE_IP --subscription $SUBID

az network route-table route create -g $RESOURCE_GROUP --name $FWROUTE_NAME_INTERNET --route-table-name $FWROUTE_TABLE_NAME --address-prefix $FWPUBLIC_IP/32 --next-hop-type Internet

如何设置防火墙规则

# Add FW Network Rules

az network firewall network-rule create -g $RESOURCE_GROUP -f $FWNAME --collection-name 'aksfwnr' -n 'apiudp' --protocols 'UDP' --source-addresses '*' --destination-addresses "AzureCloud.$REGION_NAME" --destination-ports 1194 --action allow --priority 100
az network firewall network-rule create -g $RESOURCE_GROUP -f $FWNAME --collection-name 'aksfwnr' -n 'apitcp' --protocols 'TCP' --source-addresses '*' --destination-addresses "AzureCloud.$REGION_NAME" --destination-ports 9000
az network firewall network-rule create -g $RESOURCE_GROUP -f $FWNAME --collection-name 'aksfwnr' -n 'time' --protocols 'UDP' --source-addresses '*' --destination-fqdns 'ntp.ubuntu.com' --destination-ports 123

# Add FW Application Rules

az network firewall application-rule create -g $RESOURCE_GROUP -f $FWNAME --collection-name 'aksfwar' -n 'fqdn' --source-addresses '*' --protocols 'http=80' 'https=443' --fqdn-tags "AzureKubernetesService" --action allow --priority 100

可以使用以下命令将 UDR 与以前部署 BDC 的 AKS 群集相关联:

az network vnet subnet update -g $RESOURCE_GROUP --vnet-name $VNET_NAME --name $SUBNET_NAME --route-table $FWROUTE_TABLE_NAME

创建和配置服务主体 (SP)

在这一步中,需要创建服务主体,并向虚拟网络分配权限。

请参阅以下示例:

# Create SP and Assign Permission to Virtual Network

az ad sp create-for-rbac -n "bdcaks-sp"

APPID=<your service principal ID >
PASSWORD=< your service principal password >
VNETID=$(az network vnet show -g $RESOURCE_GROUP --name $VNET_NAME --query id -o tsv)

# Assign SP Permission to VNET

az role assignment create --assignee $APPID --scope $VNETID --role "Network Contributor"


RTID=$(az network route-table show -g $RESOURCE_GROUP -n $FWROUTE_TABLE_NAME --query id -o tsv)
az role assignment create --assignee $APPID --scope $RTID --role "Network Contributor"

创建 AKS 群集

现在可以创建以 userDefinedRouting 作为出站类型的 AKS 群集。

az aks create \
    --resource-group $RESOURCE_GROUP \
    --location $REGION_NAME \
    --name $AKS_NAME \
    --load-balancer-sku standard \
    --outbound-type userDefinedRouting \
    --enable-private-cluster \
    --network-plugin azure \
    --vnet-subnet-id $SUBNET_ID \
    --docker-bridge-address 172.17.0.1/16 \
    --dns-service-ip 10.2.0.10 \
    --service-cidr 10.2.0.0/24 \
    --service-principal $APPID \
    --client-secret $PASSWORD \
    --node-vm-size Standard_D13_v2 \
    --node-count 2 \
    --generate-ssh-keys

生成大数据群集部署配置文件

可以使用自定义配置文件创建大数据群集:

azdata bdc config init --source aks-dev-test --target private-bdc-aks --force

生成和配置自定义 BDC 部署配置文件

azdata bdc config replace -c private-bdc-aks/control.json -j "$.spec.docker.imageTag=2019-CU6-ubuntu-16.04"
azdata bdc config replace -c private-bdc-aks/control.json -j "$.spec.storage.data.className=default"
azdata bdc config replace -c private-bdc-aks/control.json -j "$.spec.storage.logs.className=default"

azdata bdc config replace -c private-bdc-aks/control.json -j "$.spec.endpoints[0].serviceType=NodePort"
azdata bdc config replace -c private-bdc-aks/control.json -j "$.spec.endpoints[1].serviceType=NodePort"

azdata bdc config replace -c private-bdc-aks/bdc.json -j "$.spec.resources.master.spec.endpoints[0].serviceType=NodePort"
azdata bdc config replace -c private-bdc-aks/bdc.json -j "$.spec.resources.gateway.spec.endpoints[0].serviceType=NodePort"
azdata bdc config replace -c private-bdc-aks/bdc.json -j "$.spec.resources.appproxy.spec.endpoints[0].serviceType=NodePort"

在 AKS 专用群集中部署 BDC

export AZDATA_USERNAME=<your bdcadmin username>
export AZDATA_PASSWORD=< your bdcadmin password>

azdata bdc create --config-profile private-bdc-aks --accept-eula yes

是否可以使用第三方防火墙来限制出口流量?

可以使用第三方防火墙通过已部署的 BDC 和 AKS 专用群集限制出口流量。 若要查看示例,请访问 Azure 市场防火墙。 第三方防火墙可用于所含配置更兼容的专用部署解决方案。 防火墙应提供以下网络规则:

  • 查看所有 AKS 群集所需的出站网络规则和 FQDN。 此 URL 还包括所有通配符 HTTP/HTTPS 终结点和依赖项。 这些可基于限定符数目和实际要求,因 AKS 群集而异。
  • Azure Global 必需的网络规则/FQDN/应用程序规则(此处有所提及)。
  • 适用于 AKS 群集的建议的可选 FQDN/应用程序规则(此处有所提及)。

请参阅如何管理 AKS 专用群集中的大数据群集,下一步是连接到大数据群集

有关此方案的自动化脚本,请参阅 GitHub 上的 SQL Server 示例存储库