Restricción del tráfico de salida de clústeres de macrodatos de SQL Server 2019 en el clúster privado de Azure Kubernetes Service (AKS)

Importante

El complemento Clústeres de macrodatos de Microsoft SQL Server 2019 se va a retirar. La compatibilidad con Clústeres de macrodatos de SQL Server 2019 finalizará el 28 de febrero de 2025. Todos los usuarios existentes de SQL Server 2019 con Software Assurance serán totalmente compatibles con la plataforma, y el software se seguirá conservando a través de actualizaciones acumulativas de SQL Server hasta ese momento. Para más información, consulte la entrada de blog sobre el anuncio y Opciones de macrodatos en la plataforma Microsoft SQL Server.

Puede restringir el tráfico de salida de los Clústeres de macrodatos con Azure Kubernetes Service (AKS). El servicio aprovisiona una SKU estándar Load Balancer. Se configura y se usa para la salida de manera predeterminada. Ahora, es posible que la configuración predeterminada no cumpla todos los escenarios y requisitos. Por ejemplo, si las direcciones IP públicas no están permitidas o se requieren saltos adicionales para la salida. Puede definir una tabla de rutas definidas por el usuario (UDR) si el clúster no permite IPs públicas y se encuentra detrás de una aplicación virtual de red (NVA).

Los clústeres de AKS tienen acceso de salida a Internet ilimitado. Esto es para fines operativos y de administración. Los nodos de trabajo de un clúster de AKS deben tener acceso a determinados puertos y nombres de dominio completo (FQDN). Los siguientes son ejemplos de ello:

  • Cuando el clúster necesita extraer imágenes de contenedores del sistema base desde Microsoft Container Registry (MCR) durante las actualizaciones de seguridad del sistema operativo del nodo trabajador.
  • Cuando se habilita la GPU, los nodos de trabajo de AKS necesitan acceder a los puntos de conexión desde NVIDIA para instalar un controlador.
  • Cuando los clientes usan el trabajo de AKS junto con los servicios de Azure, como Azure Policy para el cumplimiento de nivel empresarial, la acción de Azure Monitor (con información de contenedor).
  • Cuando se habilita un espacio de desarrollo y otros escenarios similares.

Nota:

Al implementar un clúster de macrodatos (BDC) en un clúster privado de Azure Kubernetes Service (AKS), no hay dependencias de entrada excepto las que se mencionan en este artículo. Puede encontrar todas las dependencias salientes en control del tráfico de salida de los nodos de clúster en Azure Kubernetes Service (AKS).

En este artículo se describe cómo implementar BDC en un clúster privado de AKS con redes avanzadas y UDR. También explora la integración adicional de BDC con entornos de red de nivel empresarial.

Restricción del tráfico de salida con Azure Firewall

Azure Firewall proporciona una etiqueta FQDN de Azure Kubernetes Service ((AzureKubernetesService)) para simplificar la configuración.

Para obtener información completa sobre la etiqueta FQDN, consulte Restricción del tráfico de salida mediante Azure firewall.

En la imagen siguiente se muestra cómo se restringe el tráfico en un clúster privado de AKS.

Screenshot that shows AKS private cluster firewall egress traffic.

Desarrolle la arquitectura básica de un clúster de macrodatos con Azure Firewall:

  1. Creación del grupo de recursos y la red virtual.
  2. Creación y configuración de Azure Firewall.
  3. Creación de una tabla de rutas definida por el usuario.
  4. Configurar reglas de firewall
  5. Creación de una entidad de servicio.
  6. Creación de un clúster privado de AKS.
  7. Creación de un perfil de implementación del clúster de macrodatos.
  8. Implementación del clúster de macrodatos.

Creación del grupo de recursos y la red virtual.

  1. Defina un conjunto de variables de entorno para crear recursos.

    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. Creación del grupo de recursos

    az group create -n $RESOURCE_GROUP -l $REGION_NAME
    
  3. Cree la red virtual.

    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)
    

Cree y configure Azure Firewall.

  1. Defina un conjunto de variables de entorno para crear recursos.

    export FWNAME=bdcaksazfw
    export FWPUBIP=$FWNAME-ip
    export FWIPCONFIG_NAME=$FWNAME-config
    
    az extension add --name azure-firewall
    
  2. Cree una subred dedicada para el firewall.

    Nota

    No se puede cambiar el nombre del firewall después de la creación.

    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 enruta automáticamente el tráfico entre redes locales, las redes virtuales y las subredes de Azure.

Cómo crear una tabla de rutas definida por el usuario

Puede crear una tabla UDR con un salto para Azure Firewall.


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

Establecimiento de reglas de 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

Puede asociar una UDR a un clúster de AKS donde implementó previamente un BDC mediante el siguiente comando:

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

Creación y configuración de la entidad de servicio (SP)

En este paso, debe crear la entidad de servicio y asignar el permiso a la red virtual.

Observe el ejemplo siguiente:

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

Creación de un clúster de AKS

Ahora puede crear el clúster de AKS con userDefinedRouting como tipo de salida.

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

Compilación de un perfil de implementación del clúster de macrodatos

Puede crear un clúster de macrodatos con un perfil personalizado:

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

Generación y configuración de un perfil de implementación de BDC personalizado

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"

Implementación de un clúster de macrodatos en el clúster privado de AKS

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

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

¿Puedo usar firewalls de terceros para restringir el tráfico de salida?

Puede usar firewalls de terceros para restringir el tráfico de salida con un clúster privado de BDC y AKS implementado. Para ver un ejemplo, consulte Azure Marketplace firewalls. Los firewalls de terceros se pueden usar en soluciones de implementación privadas con configuraciones más compatibles. El firewall debe proporcionar las siguientes reglas de red:

  • Ver todas las reglas de red de salida y los FQDN necesarios para los clústeres de AKS. Esta dirección URL también incluye todos los puntos de conexión y dependencias HTTP/HTTPS con caracteres comodín. Estos pueden variar con el clúster de AKS, en función de una serie de calificativos y de las necesidades reales.
  • Las reglas de aplicación, FQDN o reglas de red obligatorias globales de Azure mencionadas aquí.
  • Las reglas opcionales recomendadas de FQDN o aplicación para clústeres de AKS mencionadas aquí.

Compruebe cómo administrar un clúster de macrodatos en el clúster privado de AKS y, a continuación, el paso siguiente consiste en conectarse a un clúster de macrodatos.

Vea scripts de automatización para este escenario en el repositorio de ejemplos de SQL Server en GitHub.