Share via


限制 Azure Kubernetes Service (AKS) 私人叢集中 SQL Server 2019 巨量資料叢集的輸出流量

重要

Microsoft SQL Server 2019 巨量資料叢集附加元件將會淘汰。 SQL Server 2019 巨量資料叢集的支援將於 2025 年 2 月 28 日結束。 平台上將完全支援含軟體保證 SQL Server 2019 的所有現有使用者,而且軟體將會持續透過 SQL Server 累積更新來維護,直到該時間為止。 如需詳細資訊,請參閱公告部落格文章Microsoft SQL Server 平台上的巨量資料選項

您可以限制 Azure Kubernetes Service (AKS) 巨量資料叢集中的輸出流量。 服務會佈建標準 SKU Load Balancer。 預設會設定此功能並將其用於輸出。 現在,預設設定可能不符合所有案例和需求。 例如,如果不允許公用 IP,或輸出需要額外的躍點。 如果叢集不允許使用公用 IP,且位於網路虛擬設備 (NVA) 後方,您可以定義使用者定義的路由 (UDR) 表。

AKS 叢集具有不受限制的輸出 (連出) 網際網路存取。 這是為了管理和操作目的。 AKS 叢集中的背景工作角色節點需要存取特定連接埠與完整網域名稱 (FQDN)。 以下是範例:

  • 當叢集在背景工作角色節點 OS 安全性更新,必須從 Microsoft 容器登錄 (MCR) 提取基礎系統容器映像時。
  • 當已啟用 GPU 的 AKS 背景工作角色節點需要從 Nvidia 存取端點,才能安裝驅動程式時。
  • 當客戶使用 AKS 工作搭配 Azure 服務,例如,適用於企業級合規性的 Azure 原則、Azure 監視 (含容器見解) 時。
  • 當啟用開發人員空間時,以及其他類似的案例。

注意

當您在 Azure Kubernetes Service (AKS) 私人叢集中 (BDC) 部署巨量資料叢集 (BDC) 時,除了本文所述的相依性之外,沒有輸入相依性。 您可以在 Azure Kubernetes Service (AKS) 中控制叢集節點的輸出流量,找到所有輸出相依性。

本文說明如何在使用進階網路和 UDR 的 AKS 私人叢集中部署 BDC。 其也會探索 BDC 與企業級網路環境的進一步整合。

如何使用 Azure 防火牆限制輸出流量

Azure 防火牆提供 Azure Kubernetes Service ((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 Marketplace 防火牆。 第三方防火牆可在具有更符合規範之設定的私人部署解決方案中使用。 防火牆應該提供下列網路規則:

  • 檢視所有 AKS 叢集所需的輸出網路規則和 FQDN。 此 URL 也包含所有萬用字元 HTTP/HTTPS 端點和相依性。 根據限定詞的數量和您的實際需求,這些可能會隨您的 AKS 叢集而有所不同。
  • 這裡所提及的 Azure 全球必要網路規則/FQDN/應用程式規則。
  • 這裡所提及的 AKS 叢集的選用建議 FQDN/應用程式規則。

請查看如何在 AKS 私人叢集中管理巨量資料叢集,然後下一個步驟是連線到巨量資料叢集

請參閱 GitHub 上的 SQL Server 範例存放庫中適用於此案例的自動化指令碼。