Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Aunque puede enrutar el tráfico de salida a través de una instancia de Azure Load Balancer, hay limitaciones en el número de flujos de tráfico de salida que puede tener. Azure NAT Gateway permite hasta 64 512 flujos de tráfico UDP y TCP de salida por dirección IP con un máximo de 16 direcciones IP.
En este artículo se muestra cómo crear un clúster de Azure Kubernetes Service (AKS) con una puerta de enlace NAT administrada y asignada por el usuario para el tráfico de salida. También se muestra cómo deshabilitar OutboundNAT en Windows.
Antes de empezar
- Asegúrese de usar la versión más reciente de la CLI de Azure.
- Asegúrese de que usa la versión 1.20.x o posterior de Kubernetes.
- La puerta de enlace NAT administrada no es compatible con las redes virtuales personalizadas.
Importante
En clústeres no privados, el tráfico del clúster del servidor de API se enruta y procesa a través del tipo de salida de clústeres. Para evitar que el tráfico del servidor de API se procese como tráfico público, considere la posibilidad de usar un clúster privado o consulte la característica Integración con red virtual del servidor de API.
Creación de un clúster de AKS con puerta de enlace NAT administrada
- Cree un clúster de AKS con una nueva puerta de enlace NAT administrada mediante el comando
az aks createcon los parámetros--outbound-type managedNATGateway,--nat-gateway-managed-outbound-ip-county--nat-gateway-idle-timeout. Si desea que la puerta de enlace NAT funcione fuera de una zona de disponibilidad específica, especifique la zona mediante--zones. - Si no se especifica ninguna zona al crear una puerta de enlace NAT administrada, la puerta de enlace NAT se implementa en "ninguna zona" de manera predeterminada. Cuando la puerta de enlace NAT se coloca en ninguna zona, Azure coloca el recurso en una zona automáticamente. Para más información sobre el modelo de implementación no zonal, consulte Puerta de enlace NAT no zonal.
- Un recurso de puerta de enlace NAT administrado no se puede usar en varias zonas de disponibilidad.
Los comandos siguientes crean primero el grupo de recursos necesario y, a continuación, el clúster de AKS con una puerta de enlace NAT administrada.
export RANDOM_SUFFIX=$(openssl rand -hex 3)
export MY_RG="myResourceGroup$RANDOM_SUFFIX"
export MY_AKS="myNatCluster$RANDOM_SUFFIX"
az group create --name $MY_RG --location "eastus2"
Resultados:
{
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroupxxx",
"location": "eastus2",
"managedBy": null,
"name": "myResourceGroupxxx",
"properties": {
"provisioningState": "Succeeded"
},
"tags": null,
"type": "Microsoft.Resources/resourceGroups"
}
az aks create \
--resource-group $MY_RG \
--name $MY_AKS \
--node-count 3 \
--outbound-type managedNATGateway \
--nat-gateway-managed-outbound-ip-count 2 \
--nat-gateway-idle-timeout 4 \
--generate-ssh-keys
Resultados:
{
"aadProfile": null,
"agentPoolProfiles": [
{
...
"name": "nodepool1",
...
"provisioningState": "Succeeded",
...
}
],
"dnsPrefix": "myNatClusterxxx-dns-xxx",
"fqdn": "myNatClusterxxx-dns-xxx.xxxxx.xxxxxx.cloudapp.azure.com",
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/myResourceGroupxxx/providers/Microsoft.ContainerService/managedClusters/myNatClusterxxx",
"name": "myNatClusterxxx",
...
"resourceGroup": "myResourceGroupxxx",
...
"provisioningState": "Succeeded",
...
"type": "Microsoft.ContainerService/ManagedClusters"
}
- Actualice la dirección IP de salida o el tiempo de espera de inactividad mediante el comando
az aks updatecon el parámetro--nat-gateway-managed-outbound-ip-counto--nat-gateway-idle-timeout.
En el ejemplo siguiente se actualiza el recuento de direcciones IP de salida administradas de la puerta de enlace NAT para el clúster de AKS a 5.
az aks update \
--resource-group $MY_RG \
--name $MY_AKS \
--nat-gateway-managed-outbound-ip-count 5
Resultados:
{
"aadProfile": null,
"agentPoolProfiles": [
{
...
"name": "nodepool1",
...
"provisioningState": "Succeeded",
...
}
],
"dnsPrefix": "myNatClusterxxx-dns-xxx",
"fqdn": "myNatClusterxxx-dns-xxx.xxxxx.xxxxxx.cloudapp.azure.com",
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/myResourceGroupxxx/providers/Microsoft.ContainerService/managedClusters/myNatClusterxxx",
"name": "myNatClusterxxx",
...
"resourceGroup": "myResourceGroupxxx",
...
"provisioningState": "Succeeded",
...
"type": "Microsoft.ContainerService/ManagedClusters"
}
Creación de un clúster de AKS con una puerta de enlace NAT asignada por el usuario
Esta configuración requiere traer sus propias redes (mediante Kubenet o Azure CNI) y que la puerta de enlace NAT esté preconfigurada en la subred. Los siguientes comandos crean los recursos necesarios para este escenario.
Cree un grupo de recursos con el comando
az group create.export RANDOM_SUFFIX=$(openssl rand -hex 3) export MY_RG="myResourceGroup$RANDOM_SUFFIX" az group create --name $MY_RG --location southcentralusResultados:
{ "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroupxxx", "location": "southcentralus", "managedBy": null, "name": "myResourceGroupxxx", "properties": { "provisioningState": "Succeeded" }, "tags": null, "type": "Microsoft.Resources/resourceGroups" }Cree una identidad administrada para los permisos de red y almacene el identificador en
$IDENTITY_IDpara su uso posterior.export IDENTITY_NAME="myNatClusterId$RANDOM_SUFFIX" export IDENTITY_ID=$(az identity create \ --resource-group $MY_RG \ --name $IDENTITY_NAME \ --location southcentralus \ --query id \ --output tsv)Resultados:
/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myNatClusterIdxxxCree una IP pública para la puerta de enlace de NAT mediante el comando
az network public-ip create.export PIP_NAME="myNatGatewayPip$RANDOM_SUFFIX" az network public-ip create \ --resource-group $MY_RG \ --name $PIP_NAME \ --location southcentralus \ --sku standardResultados:
{ "publicIp": { "ddosSettings": null, "dnsSettings": null, "etag": "W/\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\"", "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Network/publicIPAddresses/myNatGatewayPipxxx", "ipAddress": null, "ipTags": [], "location": "southcentralus", "name": "myNatGatewayPipxxx", ... "provisioningState": "Succeeded", ... "sku": { "name": "Standard", "tier": "Regional" }, "type": "Microsoft.Network/publicIPAddresses", ... } }Cree la puerta de enlace NAT mediante el comando
az network nat gateway create.export NATGATEWAY_NAME="myNatGateway$RANDOM_SUFFIX" az network nat gateway create \ --resource-group $MY_RG \ --name $NATGATEWAY_NAME \ --location southcentralus \ --public-ip-addresses $PIP_NAMEResultados:
{ "etag": "W/\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\"", "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Network/natGateways/myNatGatewayxxx", "location": "southcentralus", "name": "myNatGatewayxxx", "provisioningState": "Succeeded", "publicIpAddresses": [ { "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Network/publicIPAddresses/myNatGatewayPipxxx" } ], ... "type": "Microsoft.Network/natGateways" }Importante
No se puede usar un único recurso de puerta de enlace NAT en varias zonas de disponibilidad. Para garantizar la resistencia de zona, se recomienda implementar un recurso de puerta de enlace de NAT en cada zona de disponibilidad y asignar a subredes que contienen clústeres de AKS en cada zona. Para más información sobre este modelo de implementación, consulte Puerta de enlace de NAT para cada zona. Si no hay ninguna zona configurada para la puerta de enlace de NAT, la selección de ubicación de la zona predeterminada es "sin zona", en la que Azure coloca la puerta de enlace de NAT en una zona automáticamente.
Cree una red virtual mediante el comando
az network vnet create.export VNET_NAME="myVnet$RANDOM_SUFFIX" az network vnet create \ --resource-group $MY_RG \ --name $VNET_NAME \ --location southcentralus \ --address-prefixes 172.16.0.0/20Resultados:
{ "newVNet": { "addressSpace": { "addressPrefixes": [ "172.16.0.0/20" ] }, ... "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Network/virtualNetworks/myVnetxxx", "location": "southcentralus", "name": "myVnetxxx", "provisioningState": "Succeeded", ... "type": "Microsoft.Network/virtualNetworks", ... } }Cree una subred en la red virtual mediante la instancia de NAT Gateway y almacene el identificador en
$SUBNET_IDpara su uso posterior.export SUBNET_NAME="myNatCluster$RANDOM_SUFFIX" export SUBNET_ID=$(az network vnet subnet create \ --resource-group $MY_RG \ --vnet-name $VNET_NAME \ --name $SUBNET_NAME \ --address-prefixes 172.16.0.0/22 \ --nat-gateway $NATGATEWAY_NAME \ --query id \ --output tsv)Resultados:
/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.Network/virtualNetworks/myVnetxxx/subnets/myNatClusterxxxCree un clúster de AKS mediante la subred con la puerta de enlace NAT y la identidad administrada mediante el comando
az aks create.export AKS_NAME="myNatCluster$RANDOM_SUFFIX" az aks create \ --resource-group $MY_RG \ --name $AKS_NAME \ --location southcentralus \ --network-plugin azure \ --vnet-subnet-id $SUBNET_ID \ --outbound-type userAssignedNATGateway \ --assign-identity $IDENTITY_ID \ --generate-ssh-keysResultados:
{ "aadProfile": null, "agentPoolProfiles": [ { ... "name": "nodepool1", ... "provisioningState": "Succeeded", ... } ], "dnsPrefix": "myNatClusterxxx-dns-xxx", "fqdn": "myNatClusterxxx-dns-xxx.xxxxx.xxxxxx.cloudapp.azure.com", "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/myResourceGroupxxx/providers/Microsoft.ContainerService/managedClusters/myNatClusterxxx", "name": "myNatClusterxxx", ... "resourceGroup": "myResourceGroupxxx", ... "provisioningState": "Succeeded", ... "type": "Microsoft.ContainerService/ManagedClusters" }
Deshabilitación de OutboundNAT para Windows
OutboundNAT de Windows puede causar ciertos problemas de conexión y comunicación con los pods de AKS. Un problema de ejemplo es la reutilización del puerto de nodo. En este ejemplo, Windows OutboundNAT usa puertos para traducir la dirección IP del pod a la dirección IP del host del nodo de Windows, lo que puede provocar una conexión inestable al servicio externo debido a un problema de agotamiento de puertos.
Windows habilita OutboundNAT de forma predeterminada. Ahora puede deshabilitar manualmente OutboundNAT al crear nuevos grupos de agentes de Windows.
Requisitos previos
- Clúster de AKS existente con v1.26 o superior. Si usa la versión 1.25 o anterior de Kubernetes, debe actualizar la configuración de implementación.
Limitaciones
- No se puede establecer el tipo de salida de clúster en LoadBalancer. Puede establecerlo en NAT Gateway o UDR:
- NAT Gateway: NAT Gateway puede controlar automáticamente la conexión NAT y es más eficaz que Standard Load Balancer. Puede incurrir en cargos adicionales con esta opción.
- UDR (UserDefinedRouting):debe tener en cuenta las limitaciones de puerto al configurar reglas de enrutamiento.
- Si necesita cambiar de un equilibrador de carga a una puerta de enlace NAT, puede agregar una puerta de enlace NAT a la red virtual o ejecutar
az aks upgradepara actualizar el tipo de salida.
Nota
UserDefinedRouting tiene las siguientes limitaciones:
- SNAT por Load Balancer (debe usar OutboundNAT predeterminado) tiene "64 puertos en la dirección IP del host".
- SNAT de Azure Firewall (deshabilitar OutboundNAT) tiene 2496 puertos por IP pública.
- SNAT por NAT Gateway (deshabilitar OutboundNAT) tiene 64512 puertos por dirección IP pública.
- Si el intervalo de puertos de Azure Firewall no es suficiente para la aplicación, debe usar NAT Gateway.
- Azure Firewall no SNAT con reglas de red cuando la dirección IP de destino está en un intervalo de direcciones IP privadas por IANA RFC 1918 o espacio de direcciones compartido por IANA RFC 6598.
Deshabilitación manual de OutboundNAT para Windows
Deshabilite manualmente OutboundNAT para Windows al crear nuevos grupos de agentes de Windows mediante el comando
az aks nodepool addcon la marca--disable-windows-outbound-nat.Nota
Puede usar un clúster de AKS existente, pero es posible que tenga que actualizar el tipo de salida y agregar un grupo de nodos para habilitar
--disable-windows-outbound-nat.El siguiente comando agrega un grupo de nodos de Windows a un clúster de AKS existente, deshabilitando OutboundNAT.
export WIN_NODEPOOL_NAME="win$(head -c 1 /dev/urandom | xxd -p)" az aks nodepool add \ --resource-group $MY_RG \ --cluster-name $MY_AKS \ --name $WIN_NODEPOOL_NAME \ --node-count 3 \ --os-type Windows \ --disable-windows-outbound-natResultados:
{ "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroupxxx/providers/Microsoft.ContainerService/managedClusters/myNatClusterxxx/agentPools/mynpxxx", "name": "mynpxxx", "osType": "Windows", "provisioningState": "Succeeded", "resourceGroup": "myResourceGroupxxx", "type": "Microsoft.ContainerService/managedClusters/agentPools" }
Pasos siguientes
Para obtener más información sobre Azure NAT Gateway, consulte Azure NAT Gateway.