在 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 策略和 Azure 监视(包含容器见解)。
  • 当开发空间被启用时,以及其他类似场景。

注释

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

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

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

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

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

下图显示了 AKS 专用群集上的流量限制方式。

显示 AKS 专用群集防火墙出口流量的屏幕截图。

使用 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 全局所需网络规则/FQDN/应用程序规则。
  • AKS 群集中提到的可选推荐 FQDN/应用程序规则请参见 此处

请检查如何在 AKS 专用群集中管理大数据群集 ,然后下一步是 连接到大数据群集

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