Limitare il traffico in uscita da SQL Server 2019 dei cluster Big Data nel cluster privato del servizio Azure Kubernetes

Importante

Il componente aggiuntivo per i cluster Big Data di Microsoft SQL Server 2019 verrà ritirato. Il supporto per i cluster Big Data di SQL Server 2019 terminerà il 28 febbraio 2025. Tutti gli utenti esistenti di SQL Server 2019 con Software Assurance saranno completamente supportati nella piattaforma e fino a quel momento il software continuerà a ricevere aggiornamenti cumulativi di SQL Server. Per altre informazioni, vedere il post di blog relativo all'annuncio e Opzioni per i Big Data nella piattaforma Microsoft SQL Server.

È possibile limitare il traffico in uscita dei cluster Big Data con il servizio Azure Kubernetes (AKS). Il servizio effettua il provisioning di uno SKU standard Load Balancer. Questa impostazione viene configurata e usata per l'uscita in modo predefinito. A questo punto, la configurazione predefinita potrebbe non soddisfare tutti gli scenari e i requisiti. Ciò accade, ad esempio, se gli indirizzi IP pubblici non sono consentiti o se sono necessari hop per l'uscita. È possibile definire una tabella di route definita dall'utente se il cluster non consente gli indirizzi IP pubblici e segue un'appliance virtuale di rete.

I cluster del servizio Azure Kubernetes hanno accesso a Internet in uscita senza restrizioni. Ciò a scopo di gestione e operativo. I nodi di lavoro in un cluster del servizio Azure Kubernetes devono essere in grado di accedere a porte e nomi di dominio completo (FQDN). Di seguito sono riportati alcuni esempi:

  • il cluster deve eseguire il pull delle immagini del contenitore di sistema di base da Registro Container di Microsoft durante gli aggiornamenti di sicurezza del sistema operativo del nodo di lavoro.
  • i nodi di lavoro del servizio Azure Kubernetes abilitati per GPU devono accedere agli endpoint da Nvidia per installare il driver.
  • i clienti usano il servizio Azure Kubernetes insieme ai servizi di Azure, come i criteri di Azure per la conformità di livello aziendale, Monitoraggio di Azure (con informazioni dettagliate sul contenitore).
  • abilitazione di uno spazio di sviluppo e altri scenari simili.

Nota

Quando si distribuisce un cluster Big Data (BDC) nel cluster privato del servizio Azure Kubernetes, non esistono dipendenze in ingresso, ad eccezione di quelle indicate in questo articolo. È possibile trovare tutte le dipendenze in uscita nel controllo del traffico in uscita per i nodi del cluster nel servizio Azure Kubernetes.

Questo articolo descrive come distribuire i cluster Big Data nel cluster privato del servizio Azure Kubernetes con funzionalità di rete avanzate e route definite dall'utente. L'articolo analizza anche un'ulteriore integrazione dei cluster Big Data con ambienti di rete di livello aziendale.

Limitare il traffico in uscita con il firewall di Azure

Firewall di Azure fornisce un tag FQDN del servizio Azure Kubernetes (AzureKubernetesService) per semplificare la configurazione.

Per informazioni complete sul tag FQDN, vedere Limitare il traffico in uscita con il firewall di Azure.

L'immagine seguente mostra come il traffico viene limitato in un cluster privato del servizio Azure Kubernetes.

Screenshot that shows AKS private cluster firewall egress traffic.

Sviluppare l'architettura di base per un cluster Big Data con Firewall di Azure:

  1. Creare il gruppo di risorse e VNet
  2. Creare e configurare il firewall di Azure
  3. Creare una tabella di route definita dall'utente
  4. Configurare le regole del firewall
  5. Creare un'entità servizio (SP)
  6. Creare un cluster privato AKS
  7. Creare un profilo di distribuzione BDC
  8. Distribuire BDC

Creare il gruppo di risorse e VNet

  1. Definire un set di variabili di ambiente per la creazione di risorse.

    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. Creare il gruppo di risorse

    az group create -n $RESOURCE_GROUP -l $REGION_NAME
    
  3. Creare la rete virtuale

    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)
    

Creare e configurare il firewall di Azure

  1. Definire un set di variabili di ambiente per la creazione di risorse.

    export FWNAME=bdcaksazfw
    export FWPUBIP=$FWNAME-ip
    export FWIPCONFIG_NAME=$FWNAME-config
    
    az extension add --name azure-firewall
    
  2. Creare una subnet dedicata per il firewall

    Nota

    Non è possibile modificare il nome del firewall dopo la creazione

    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 effettua il routing automatico del traffico tra subnet di Azure, reti virtuali e reti locali.

Creare una tabella di route definita dall'utente

È possibile creare una tabella di route definita dall'utente con un hop per Firewall di Azure.


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

Impostare le regole del firewall

# 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

È possibile associare una route definita dall'utente a un cluster del servizio Azure Kubernetes in cui è stato distribuito in precedenza un cluster Big Data usando il comando seguente:

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

Creare e configurare l'entità servizio

In questo passaggio è necessario creare l'entità servizio e assegnare l'autorizzazione alla rete virtuale.

Vedere l'esempio seguente:

# 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"

Creare un cluster del servizio Azure Kubernetes

Creare quindi il cluster del servizio Azure Kubernetes con userDefinedRouting come tipo in uscita.

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

Compilare il profilo di distribuzione del cluster Big Data

È possibile creare un cluster Big Data con un profilo personalizzato:

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

Generare e configurare un profilo di distribuzione di cluster Big Data personalizzato:

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"

Distribuire un cluster Big Data in un cluster privato del servizio Azure Kubernetes

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

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

È possibile usare firewall di terze parti per limitare il traffico in uscita?

È possibile usare firewall di terze parti per limitare il traffico in uscita con un cluster Big Data e con un cluster privato del servizio Azure Kubernetes distribuito. Per visualizzare un esempio, vedere Firewall di Azure Marketplace. È possibile usare firewall di terze parti nelle soluzioni di distribuzione privata con configurazioni più conformi. Il firewall deve fornire le seguenti regole di rete:

Vedere come gestire il cluster Big Data nel cluster privato del servizio Azure Kubernetes. Il passaggio successivo è la connessione al cluster Big Data.

Per questo scenario, vedere gli script di automazione nel repository di esempi SQL Server su GitHub.