Creación de un clúster de Azure Kubernetes Service (AKS) aislado de red

Las organizaciones suelen tener estrictos requisitos de seguridad y cumplimiento para regular el tráfico de red de salida (saliente) desde un clúster para eliminar riesgos de filtración de datos. De forma predeterminada, los clústeres estándar de SKU de Azure Kubernetes Service (AKS) tienen acceso a Internet saliente sin restricciones. Este nivel de acceso a la red permite que los nodos y servicios que ejecuta accedan a recursos externos según sea necesario. Si desea restringir el tráfico de salida, es necesario el acceso a un número limitado de puertos y direcciones para mantener las tareas de mantenimiento del clúster en buen estado. En el documento conceptual sobre las reglas de FQDN y de red de salida para clústeres de AKS se proporciona una lista de los puntos de conexión necesarios para el clúster de AKS y sus complementos y características opcionales.

Una solución común para restringir el tráfico saliente del clúster es usar un dispositivo de firewall para restringir el tráfico en función de las reglas de firewall. El firewall es aplicable cuando la aplicación requiere acceso saliente, pero cuando se deben inspeccionar y proteger las solicitudes salientes. La configuración manual de un firewall con reglas de salida necesarias y FQDN es un proceso complicado, especialmente si el único requisito es crear un clúster de AKS aislado sin dependencias salientes para el arranque del clúster.

Para reducir el riesgo de filtración de datos, el clúster aislado de red permite arrancar el clúster de AKS sin dependencias de red salientes, incluso para capturar componentes o imágenes del clúster de Microsoft Artifact Registry (MAR). El operador de clúster podría configurar incrementalmente el tráfico saliente permitido para cada escenario que quiera habilitar. En este artículo se describen los pasos para crear un clúster aislado de red.

Antes de empezar

Nota:

El tipo de salida none está disponible con carácter general. El tipo de salida block está en versión preliminar.

Importante

Las características en versión preliminar de AKS están disponibles como opción de participación y autoservicio. Las versiones preliminares se proporcionan "tal cual" y "como están disponibles", y están excluidas de los Acuerdos de nivel de servicio y la garantía limitada. Las versiones preliminares de AKS reciben cobertura parcial del soporte al cliente en la medida de lo posible. Por lo tanto, estas características no están diseñadas para su uso en producción. Para más información, consulte los siguientes artículos de soporte:

  • Este artículo requiere la versión 2.73.0 o posterior de la CLI de Azure. Si usa Azure Cloud Shell, ya está instalada allí la versión más reciente.
  • Debe instalar la versión aks-preview9.0.0b2 o posterior de la extensión CLI de Azureblock si utiliza el tipo de salida (versión preliminar).
    • Si aún no tiene la aks-preview extensión, instálela mediante el az extension add comando.
      az extension add --name aks-preview
      
    • Si ya tiene la aks-preview extensión, actualícela para asegurarse de que tiene la versión más reciente mediante el az extension update comando.
      az extension update --name aks-preview
      

Establecimiento de variables de entorno

Establezca las variables de entorno que se usan en este artículo. El nombre de ACR debe ser único globalmente y contener solo caracteres alfanuméricos en minúsculas.

RESOURCE_GROUP="myResourceGroup"
LOCATION="eastus"
AKS_NAME="myAKSCluster"
VNET_NAME="myVNet"
AKS_SUBNET_NAME="aksSubnet"
ACR_SUBNET_NAME="acrSubnet"
APISERVER_SUBNET_NAME="apiServerSubnet"
REGISTRY_NAME="myregistry${RANDOM}"
CLUSTER_IDENTITY_NAME="clusterIdentity"
KUBELET_IDENTITY_NAME="kubeletIdentity"

az group create --name ${RESOURCE_GROUP} --location ${LOCATION}
  • Una cuenta de Azure con una suscripción activa. Si no tienes una, crea una cuenta gratuita antes de empezar.
  • Instale y configure Terraform.
  • CLI de Azure instalado e iniciado sesión con az login, se usa para comprobar la implementación y conectarse al clúster. Instale CLI de Azure si aún no lo tiene.
  • kubectl instalado para conectarse al clúster. Si usa Azure Cloud Shell, kubectl ya está instalado. Para instalarlo localmente, use el az aks install-cli comando .
  • jq instalado, utilizado para analizar el estado de Terraform al verificar la implementación. Azure Cloud Shell ya tiene jq instalado.

Implementación de un clúster aislado de red con ACR administrado por AKS

AKS crea, administra y reconcilia un recurso de ACR en esta opción. No es necesario asignar permisos ni administrar el ACR. AKS administra las reglas de caché, el vínculo privado y el punto de conexión privado que se usan en el clúster aislado de red.

Creación de un clúster aislado de red

Al crear un clúster de AKS con aislamiento de red, elija uno de los siguientes modos de clúster privado: basado en vínculo privado o integración de red virtual del servidor de API.

Establezca el origen del artefacto y el tipo de salida en función de los requisitos de aislamiento de red.

Parameter Valores aceptados/efecto
--bootstrap-artifact-source Directextrae imágenes directamente de Microsoft Artifact Registry (MAR) y no está aislada de la red. Cache extrae imágenes de un ACR privado y está aislada de la red.
--outbound-type none no configura las conexiones salientes para el clúster, por lo que puede configurarlas. block (versión preliminar) bloquea todas las conexiones salientes.

Cree un clúster de red aislada basada en vínculos privados mediante la ejecución del comando az aks create con los parámetros --bootstrap-artifact-source, --enable-private-cluster y --outbound-type.

az aks create --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --bootstrap-artifact-source Cache --outbound-type none --network-plugin azure --enable-private-cluster

Integración con red virtual de un servidor de API

Cree un clúster de AKS aislado de red configurado con la integración con red virtual del servidor de API ejecutando el comando az aks create con los parámetros --bootstrap-artifact-source, --enable-private-cluster, --enable-apiserver-vnet-integration y --outbound-type.

az aks create --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --bootstrap-artifact-source Cache --outbound-type none --network-plugin azure --enable-private-cluster --enable-apiserver-vnet-integration

Actualización de un clúster de AKS existente al tipo aislado de red

Si prefiere habilitar el aislamiento de red en un clúster de AKS existente en lugar de crear un nuevo clúster, use el comando az aks update.

Para habilitar la característica aislada de red en un clúster de AKS existente, ejecute primero el siguiente comando para actualizar bootstrap-artifact-source:

az aks update --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --bootstrap-artifact-source Cache

A continuación, debe volver a crear una imagen manual de todos los grupos de nodos existentes:

az aks upgrade --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --node-image-only

Nota:

Debe asegurarse de que el saliente existe hasta que se complete la primera imagen de nuevo. Para comprobar si se completa la imagen de nuevo, ejecute:

NODEPOOLS=$(az aks nodepool list \
--resource-group "${RESOURCE_GROUP}" \
--cluster-name "${AKS_NAME}" \
--query "[].name" -o tsv)
for NODEPOOL in $NODEPOOLS; do
echo "Waiting for node pool $NODEPOOL to finish upgrading..."
az aks nodepool wait \
--resource-group "${RESOURCE_GROUP}" \
--cluster-name "${AKS_NAME}" \
--name "$NODEPOOL" \
--updated
echo "Node pool $NODEPOOL upgrade succeeded."
done

Espere y asegúrese de que se completa la imagen de imagen y, a continuación, ejecute el siguiente comando para actualizar outbound-type:

az aks update --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --outbound-type none

Importante

Recuerde volver a generar la imagen de los grupos de nodos del clúster al instante después de actualizar el origen del artefacto en la Caché. De lo contrario, la característica no surtirá efecto para el clúster.

Implementación de un clúster aislado de red con BYO ACR

AKS admite la incorporación de su propio ACR (BYO ACR). Para admitir el escenario de BYO ACR, debe configurar un punto de conexión privado de ACR y una zona DNS privada antes de crear el clúster de AKS.

Los pasos siguientes muestran cómo preparar estos recursos:

  • Red virtual personalizada y subredes para AKS y ACR.
  • ACR, regla de caché de ACR, punto de conexión privado y zona DNS privada.
  • Identidad del plano de control personalizado e identidad de kubelet.

Paso 1: Crear la red virtual y las subredes

az network vnet create  --resource-group ${RESOURCE_GROUP} --name ${VNET_NAME} --address-prefixes 192.168.0.0/16

az network vnet subnet create --name ${AKS_SUBNET_NAME} --vnet-name ${VNET_NAME} --resource-group ${RESOURCE_GROUP} --address-prefixes 192.168.1.0/24

SUBNET_ID=$(az network vnet subnet show --name ${AKS_SUBNET_NAME} --vnet-name ${VNET_NAME} --resource-group ${RESOURCE_GROUP} --query 'id' --output tsv)

az network vnet subnet create --name ${ACR_SUBNET_NAME} --vnet-name ${VNET_NAME} --resource-group ${RESOURCE_GROUP} --address-prefixes 192.168.2.0/24 --private-endpoint-network-policies Disabled

Paso 2: Deshabilitar la conectividad saliente de red virtual (opcional)

Por ejemplo, haga que la subred de AKS sea privada estableciendo su acceso de salida predeterminado a false.

az network vnet subnet update --resource-group ${RESOURCE_GROUP} --vnet-name ${VNET_NAME} --name ${AKS_SUBNET_NAME} --default-outbound false

Para conocer otros métodos admitidos y consideraciones de transición, consulte Deshabilitación de la conectividad saliente de red virtual.

Paso 3: Crear el ACR y habilitación de la caché de artefactos

  1. Cree el ACR con el acceso a la red pública deshabilitado.

    az acr create --resource-group ${RESOURCE_GROUP} --name ${REGISTRY_NAME} --sku Premium --public-network-enabled false
    
    REGISTRY_ID=$(az acr show --name ${REGISTRY_NAME} -g ${RESOURCE_GROUP}  --query 'id' --output tsv)
    
  2. Crea una regla de caché de ACR mediante el siguiente comando para permitir a los usuarios almacenar en caché imágenes de contenedor MAR y binarios en el nuevo ACR. El nombre de la regla de caché y los nombres de repositorio deben seguir las instrucciones de la sección siguiente.

    az acr cache create -n aks-managed-mcr -r ${REGISTRY_NAME} -g ${RESOURCE_GROUP} --source-repo "mcr.microsoft.com/*" --target-repo "aks-managed-repository/*"
    

Nota:

Con BYO ACR, es su responsabilidad asegurarse de que la regla de caché de ACR se crea y mantiene correctamente como se indicó anteriormente. Este paso es fundamental para la creación, el funcionamiento y la actualización del clúster. Esta regla de caché NO debe modificarse.

Paso 4: Crear un punto de conexión privado para ACR

az network private-endpoint create --name myPrivateEndpoint --resource-group ${RESOURCE_GROUP} --vnet-name ${VNET_NAME} --subnet ${ACR_SUBNET_NAME} --private-connection-resource-id ${REGISTRY_ID} --group-id registry --connection-name myConnection

NETWORK_INTERFACE_ID=$(az network private-endpoint show --name myPrivateEndpoint --resource-group ${RESOURCE_GROUP} --query 'networkInterfaces[0].id' --output tsv)

REGISTRY_PRIVATE_IP=$(az network nic show --ids ${NETWORK_INTERFACE_ID} --query "ipConfigurations[?privateLinkConnectionProperties.requiredMemberName=='registry'].privateIPAddress" --output tsv)

DATA_ENDPOINT_PRIVATE_IP=$(az network nic show --ids ${NETWORK_INTERFACE_ID} --query "ipConfigurations[?privateLinkConnectionProperties.requiredMemberName=='registry_data_$LOCATION'].privateIPAddress" --output tsv)

Paso 5: Crear una zona DNS privada y agregar registros

Cree una zona DNS privada denominada privatelink.azurecr.io. Agregue los registros del punto de conexión REST del registro {REGISTRY_NAME}.azurecr.io y el punto de conexión de datos del registro {REGISTRY_NAME}.{LOCATION}.data.azurecr.io.

az network private-dns zone create --resource-group ${RESOURCE_GROUP} --name "privatelink.azurecr.io"

az network private-dns link vnet create --resource-group ${RESOURCE_GROUP} --zone-name "privatelink.azurecr.io" --name MyDNSLink --virtual-network ${VNET_NAME} --registration-enabled false

az network private-dns record-set a create --name ${REGISTRY_NAME} --zone-name "privatelink.azurecr.io" --resource-group ${RESOURCE_GROUP}

az network private-dns record-set a add-record --record-set-name ${REGISTRY_NAME} --zone-name "privatelink.azurecr.io" --resource-group ${RESOURCE_GROUP} --ipv4-address ${REGISTRY_PRIVATE_IP}

az network private-dns record-set a create --name ${REGISTRY_NAME}.${LOCATION}.data --zone-name "privatelink.azurecr.io" --resource-group ${RESOURCE_GROUP}

az network private-dns record-set a add-record --record-set-name ${REGISTRY_NAME}.${LOCATION}.data --zone-name "privatelink.azurecr.io" --resource-group ${RESOURCE_GROUP} --ipv4-address ${DATA_ENDPOINT_PRIVATE_IP}

Paso 6: Crear identidades del plano de control y de kubelet

Identidad del plano de control

az identity create --name ${CLUSTER_IDENTITY_NAME} --resource-group ${RESOURCE_GROUP}

CLUSTER_IDENTITY_RESOURCE_ID=$(az identity show --name ${CLUSTER_IDENTITY_NAME} --resource-group ${RESOURCE_GROUP} --query 'id' -o tsv)

CLUSTER_IDENTITY_PRINCIPAL_ID=$(az identity show --name ${CLUSTER_IDENTITY_NAME} --resource-group ${RESOURCE_GROUP} --query 'principalId' -o tsv)

Identidad de kubelet

az identity create --name ${KUBELET_IDENTITY_NAME} --resource-group ${RESOURCE_GROUP}

KUBELET_IDENTITY_RESOURCE_ID=$(az identity show --name ${KUBELET_IDENTITY_NAME} --resource-group ${RESOURCE_GROUP} --query 'id' -o tsv)

KUBELET_IDENTITY_PRINCIPAL_ID=$(az identity show --name ${KUBELET_IDENTITY_NAME} --resource-group ${RESOURCE_GROUP} --query 'principalId' -o tsv)

Si va a actualizar un clúster de AKS existente, omita los comandos de creación de identidades anteriores y recupere el identificador de objeto de identidad kubelet existente:

KUBELET_IDENTITY_PRINCIPAL_ID=$(az aks show --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --query identityProfile.kubeletidentity.objectId -o tsv)

Conceder permisos de extracción de ACR a la identidad del kubelet

Compruebe el modo de permisos de asignación de roles del registro y seleccione el rol de extracción correspondiente. Los registros habilitados para ABAC usan el rol Container Registry Repository Reader. Los registros no habilitados para ABAC usan el AcrPull rol .

ROLE_ASSIGNMENT_MODE=$(az acr show --name ${REGISTRY_NAME} --resource-group ${RESOURCE_GROUP} --query roleAssignmentMode -o tsv)

if [[ "${ROLE_ASSIGNMENT_MODE}" == "rbac-abac" ]]; then
  ACR_PULL_ROLE="Container Registry Repository Reader"
else
  ACR_PULL_ROLE="AcrPull"
fi

az role assignment create --role "${ACR_PULL_ROLE}" --scope ${REGISTRY_ID} --assignee-object-id ${KUBELET_IDENTITY_PRINCIPAL_ID} --assignee-principal-type ServicePrincipal

Después de configurar estos recursos, puede continuar con la creación del clúster de AKS aislado de red con BYO ACR.

Paso 7: Creación de un clúster aislado de red mediante BYO ACR

Al crear un clúster con aislamiento de red, elija uno de los siguientes modos de clúster privado: basado en Private Link o Integración de VNet del servidor de API.

Establezca el origen del artefacto y el tipo de salida en función de los requisitos de aislamiento de red.

Parameter Valores aceptados/efecto
--bootstrap-artifact-source Directextrae imágenes directamente de Microsoft Artifact Registry (MAR) y no está aislada de la red. Cache extrae imágenes de un ACR privado y está aislada de la red.
--outbound-type none no configura las conexiones salientes para el clúster, por lo que puede configurarlas. block (versión preliminar) bloquea todas las conexiones salientes.

Cree un clúster aislado de red basado en vínculo privado que acceda a ACR mediante la ejecución del comando az aks create con los parámetros necesarios.

az aks create --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --vnet-subnet-id ${SUBNET_ID} --assign-identity ${CLUSTER_IDENTITY_RESOURCE_ID} --assign-kubelet-identity ${KUBELET_IDENTITY_RESOURCE_ID} --bootstrap-artifact-source Cache --bootstrap-container-registry-resource-id ${REGISTRY_ID} --outbound-type none --network-plugin azure --enable-private-cluster

Integración con red virtual de un servidor de API

En el caso de un clúster aislado de red configurado con la integración con red virtual del servidor de API, cree primero una subred y asigne el rol correcto con los siguientes comandos:

az network vnet subnet create --name ${APISERVER_SUBNET_NAME} --vnet-name ${VNET_NAME} --resource-group ${RESOURCE_GROUP} --address-prefixes 192.168.3.0/24 --delegations Microsoft.ContainerService/managedClusters

export APISERVER_SUBNET_ID=$(az network vnet subnet show --resource-group ${RESOURCE_GROUP} --vnet-name ${VNET_NAME} --name ${APISERVER_SUBNET_NAME} --query id -o tsv)
az role assignment create --scope ${APISERVER_SUBNET_ID} --role "Network Contributor" --assignee-object-id ${CLUSTER_IDENTITY_PRINCIPAL_ID} --assignee-principal-type ServicePrincipal

az role assignment create --scope ${SUBNET_ID} --role "Network Contributor" --assignee-object-id ${CLUSTER_IDENTITY_PRINCIPAL_ID} --assignee-principal-type ServicePrincipal

Cree un clúster aislado en una red privada configurado con la integración de red virtual del servidor de API y acceda a su ACR ejecutando el comando az aks create con los parámetros necesarios.

az aks create --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --vnet-subnet-id ${SUBNET_ID} --assign-identity ${CLUSTER_IDENTITY_RESOURCE_ID} --assign-kubelet-identity ${KUBELET_IDENTITY_RESOURCE_ID} --bootstrap-artifact-source Cache --bootstrap-container-registry-resource-id ${REGISTRY_ID} --outbound-type none --network-plugin azure --enable-private-cluster --enable-apiserver-vnet-integration --apiserver-subnet-id ${APISERVER_SUBNET_ID}

Actualización de un clúster de AKS ya existente

Si prefiere habilitar el aislamiento de red en un clúster de AKS existente en lugar de crear un nuevo clúster, use el comando az aks update.

Al crear el punto de conexión privado y la zona DNS privada para BYO ACR, use la red virtual y las subredes existentes del clúster de AKS existente. Al asignar el rol de extracción de ACR adecuado a la identidad de kubelet, use la identidad existente de kubelet del clúster de AKS ya existente.

Para habilitar la característica aislada de red en un clúster de AKS existente, ejecute primero el siguiente comando para actualizar bootstrap-artifact-source:

az aks update --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --bootstrap-artifact-source Cache --bootstrap-container-registry-resource-id ${REGISTRY_ID}

A continuación, debe volver a crear una imagen manual de todos los grupos de nodos existentes:

az aks upgrade --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --node-image-only

Nota:

Debe asegurarse de que el saliente existe hasta que se complete la primera imagen de nuevo. Para comprobar si se completa la imagen de nuevo, ejecute:

NODEPOOLS=$(az aks nodepool list \
--resource-group "${RESOURCE_GROUP}" \
--cluster-name "${AKS_NAME}" \
--query "[].name" -o tsv)
for NODEPOOL in $NODEPOOLS; do
echo "Waiting for node pool $NODEPOOL to finish upgrading..."
az aks nodepool wait \
--resource-group "${RESOURCE_GROUP}" \
--cluster-name "${AKS_NAME}" \
--name "$NODEPOOL" \
--updated
echo "Node pool $NODEPOOL upgrade succeeded."
done

Espere y asegúrese de que se completa la imagen de imagen y, a continuación, ejecute el siguiente comando para actualizar outbound-type:

az aks update --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --outbound-type none

Importante

Recuerde volver a generar la imagen de los grupos de nodos del clúster al instante después de actualizar el origen del artefacto en la Caché. De lo contrario, la característica no surtirá efecto para el clúster.

Actualización del identificador de ACR

Puede actualizar el ACR privado que se usa con un clúster aislado de red. Para identificar el identificador de recurso de ACR, use el comando az aks show.

az aks show --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME}

Para actualizar el identificador de ACR, ejecute el comando az aks update con los parámetros --bootstrap-artifact-source y --bootstrap-container-registry-resource-id.

az aks update --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --bootstrap-artifact-source Cache --bootstrap-container-registry-resource-id <new-byo-acr-resource-id>

Al actualizar el identificador de ACR en un clúster existente, debe volver a crear una imagen manual de todos los nodos existentes.

az aks upgrade --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --node-image-only

Importante

Recuerde cambiar la imagen de los grupos de nodos del clúster después de habilitar la característica de clúster aislado de red. De lo contrario, la característica no surtirá efecto para el clúster.

Implementación de un clúster aislado de red con Terraform

En este ejemplo de Terraform se implementa un clúster aislado de red mediante la opción ACR administrada por AKS descrita anteriormente en este artículo. El proveedor de AzureRM aún no expone toda la configuración de arranque aislada de red que usa este ejemplo, por lo que el ejemplo usa el proveedor AzAPI para implementar el recurso de clúster administrado en la versión de API necesaria. Actualmente no hay disponible un ejemplo de Terraform para la opción ACR bring your own (BYO). Para usar BYO ACR, siga las instrucciones de CLI de Azure anteriores en este artículo.

En el ejemplo se implementan los siguientes recursos:

  • Un grupo de recursos (Microsoft.Resources/resourceGroups).
  • Un clúster de AKS aislado de red (Microsoft.ContainerService/managedClusters) que usa:
    • Una identidad administrada asignada por el sistema.
    • Un único grupo de nodos del sistema con un Standard_D2s_v3 nodo y el escalado automático deshabilitados.
    • El azure plugin de red, con outboundType configurado en none para que el clúster no tenga dependencias de red externas para la inicialización.
    • apiServerAccessProfile.enablePrivateCluster se establece en true, lo que crea un clúster privado basado en Private Link.
    • bootstrapProfile.artifactSource se establece en Cache, por lo que AKS crea, administra y concilia su propia caché de ACR para inicializar el clúster en lugar de extraer directamente desde Microsoft Artifact Registry (MAR). Como se ha descrito anteriormente en este artículo, no es necesario crear ni administrar este ACR usted mismo y AKS controla las reglas de caché, el vínculo privado y el punto de conexión privado que usa el clúster aislado de red.

El clúster se crea con la versión predeterminada de Kubernetes admitida en la región de implementación. Para fijar una versión específica, añada kubernetesVersion al bloque properties del clúster en main.tf y confirme que la versión está disponible en la región mediante el comando az aks get-versions.

  1. Cree un directorio para probar el código de Terraform de ejemplo y convertirlo en el directorio actual.

  2. Cree un archivo denominado main.tf y copie la siguiente configuración de ejemplo probada en él.

    terraform {
      required_version = ">= 1.6.0"
    
      required_providers {
        azapi = {
          source  = "Azure/azapi"
          version = "~> 2.0"
        }
        random = {
          source  = "hashicorp/random"
          version = "~> 3.6"
        }
      }
    }
    
    provider "azapi" {}
    
    resource "random_string" "suffix" {
      length  = 6
      upper   = false
      special = false
    }
    
    locals {
      location            = "westus2"
      resource_group_name = "rg-aks-network-isolated-${random_string.suffix.result}"
      aks_name            = "aks-netisolated-${random_string.suffix.result}"
      dns_prefix          = "aksnetiso${random_string.suffix.result}"
    }
    
    resource "azapi_resource" "resource_group" {
      type     = "Microsoft.Resources/resourceGroups@2024-03-01"
      name     = local.resource_group_name
      location = local.location
    }
    
    resource "azapi_resource" "aks_cluster" {
      type      = "Microsoft.ContainerService/managedClusters@2025-08-01"
      name      = local.aks_name
      parent_id = azapi_resource.resource_group.id
      location  = local.location
    
      identity {
        type = "SystemAssigned"
      }
    
      body = {
        properties = {
          dnsPrefix = local.dns_prefix
          agentPoolProfiles = [
            {
              name              = "systempool"
              count             = 1
              vmSize            = "Standard_D2s_v3"
              mode              = "System"
              osType            = "Linux"
              type              = "VirtualMachineScaleSets"
              enableAutoScaling = false
            }
          ]
          networkProfile = {
            networkPlugin = "azure"
            outboundType  = "none"
          }
          apiServerAccessProfile = {
            enablePrivateCluster = true
          }
          bootstrapProfile = {
            artifactSource = "Cache"
          }
        }
      }
    }
    

Inicializar Terraform

Para inicializar la implementación de Terraform, ejecute terraform init. Este comando descarga los proveedores azapi y random necesarios para administrar los recursos de este ejemplo.

terraform init -upgrade

Dar formato y validar la configuración

Ejecute terraform fmt para dar formato al archivo de configuración y terraform validate para confirmar que la configuración es sintácticamente válida.

terraform fmt
terraform validate

Creación de un plan de ejecución de Terraform

Ejecute terraform plan para crear un plan de ejecución.

terraform plan -out main.tfplan

Aplicación de un plan de ejecución de Terraform

Ejecute terraform apply para aplicar el plan de ejecución a la suscripción de Azure.

terraform apply main.tfplan

La creación del grupo de recursos y el clúster de AKS privado aislado de red tarda varios minutos en completarse.

Comprobación de la implementación

En este ejemplo no se definen los outputs de Terraform, así que usa terraform show -json con jq para obtener el grupo de recursos y el nombre del clúster generados del archivo de estado después de que se complete terraform apply. Puede gestionar ambos recursos con el proveedor azapi, y el atributo name de ambos contiene el nombre del recurso resuelto.

RESOURCE_GROUP=$(terraform show -json | jq -r '.values.root_module.resources[] | select(.address=="azapi_resource.resource_group") | .values.name')
AKS_NAME=$(terraform show -json | jq -r '.values.root_module.resources[] | select(.address=="azapi_resource.aks_cluster") | .values.name')

Confirme que el clúster se creó con la configuración de aislamiento de red esperada mediante el az aks show comando .

az aks show --resource-group $RESOURCE_GROUP --name $AKS_NAME --query "{outboundType:networkProfile.outboundType, artifactSource:bootstrapProfile.artifactSource, privateCluster:apiServerAccessProfile.enablePrivateCluster}"

La salida muestra outboundType establecido en artifactSource, Cache establecido en none y privateCluster establecido en true, lo que confirma que el clúster está aislado de la red y se inicia desde la caché de ACR administrada por AKS.

Conectarse al clúster

Dado que se trata de un clúster privado, conéctese desde un cliente que tenga línea de visión de red al punto de conexión privado del clúster, como una máquina virtual en la misma red virtual emparejada o Azure Cloud Shell si está conectada a la red virtual del clúster. Obtenga las credenciales del clúster mediante el az aks get-credentials comando y, a continuación, compruebe la conexión mediante el kubectl get nodes comando .

az aks get-credentials --resource-group $RESOURCE_GROUP --name $AKS_NAME
kubectl get nodes

Limpieza de recursos

Si ya no necesita los recursos creados en este artículo, quítelos para evitar incurrir en cargos adicionales.

Warning

Al ejecutar terraform destroy, se eliminan todos los recursos registrados en el archivo de estado de Terraform para esta configuración, incluido el grupo de recursos y el clúster de AKS. Revise cuidadosamente el plan antes de destruirlo y evite ejecutarlo en la infraestructura compartida o de producción.

Ejecute terraform plan con el indicador -destroy para revisar qué elimina Terraform.

terraform plan -destroy -out main.destroy.tfplan

Ejecute terraform apply para aplicar el plan de destrucción y quitar todos los recursos creados por este ejemplo.

terraform apply main.destroy.tfplan

Compruebe que el clúster aislado de red está habilitado en AKS

Para validar que la característica de clúster aislado de red está habilitada, use el az aks show comando .

az aks show --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME}

La siguiente salida muestra un clúster aislado en red configurado con el tipo de salida none. Confirme que outboundType está configurado en none o en block, y que artifactSource está configurado en Cache. El campo containerRegistryId identifica el ACR utilizado para la inicialización.

{
  "kubernetesVersion": "<major>.<minor>.<patch>",
  "name": "myAKSCluster",
  "type": "Microsoft.ContainerService/ManagedClusters",
  "properties": {
    "networkProfile": {
      "outboundType": "none"
    },
    "bootstrapProfile": {
      "artifactSource": "Cache",
      "containerRegistryId": "/subscriptions/my-subscription-id/resourceGroups/my-node-resource-group-name/providers/Microsoft.ContainerRegistry/registries/my-registry-name"
    }
  }
}

Deshabilitación del clúster aislado de red en AKS

Deshabilite la característica de clúster aislado de red ejecutando el comando az aks update con los parámetros --bootstrap-artifact-source y --outbound-type.

az aks update --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --bootstrap-artifact-source Direct --outbound-type LoadBalancer

Al deshabilitar la característica en un clúster existente, debe volver a crear una imagen manual de todos los nodos existentes.

az aks upgrade --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --node-image-only

Importante

Recuerde cambiar la imagen de los grupos de nodos del clúster después de deshabilitar la característica de clúster aislado de red. De lo contrario, la característica no surtirá efecto para el clúster.

Solución de problemas

Si tiene problemas, como errores en la extracción de imágenes, consulte Solución de problemas de clústeres de Azure Kubernetes Service (AKS) aislados de red.

Pasos siguientes

Si desea configurar la configuración de restricción de salida mediante Azure Firewall, visite Control del tráfico de salida mediante Azure Firewall en AKS.

Si quiere restringir cómo se comunican los pods entre sí y con las restricciones de tráfico horizontal de derecha a izquierda en el clúster, vea Protección del tráfico entre pods mediante directivas de red en AKS.