Usar Public NAT con GKE

En esta página se muestra cómo configurar una configuración de NAT pública de ejemplo con Google Kubernetes Engine (GKE). Antes de configurar NAT público, consulta la descripción general de NAT público.

Requisitos previos

Debes hacer lo siguiente antes de configurar NAT público.

Obtener permisos de gestión de identidades y accesos

El rol roles/compute.networkAdmin te da permisos para crear una pasarela NAT en Cloud Router, reservar y asignar direcciones IP NAT, y especificar subredes cuyo tráfico debe usar la traducción de direcciones de red de la pasarela NAT.

Configurar Google Cloud

Antes de empezar, configura los siguientes elementos en Google Cloud.

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Install the Google Cloud CLI.

  5. Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

  6. Para inicializar gcloud CLI, ejecuta el siguiente comando:

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  8. Verify that billing is enabled for your Google Cloud project.

  9. Install the Google Cloud CLI.

  10. Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

  11. Para inicializar gcloud CLI, ejecuta el siguiente comando:

    gcloud init
  12. Configurar el ejemplo de GKE

    Usa este ejemplo si quieres ver una configuración sencilla de NAT público que funcione con GKE.

    Paso 1: Crea una red VPC y una subred

    Si ya tiene una red y una subred, puede saltarse este paso.

    Consola

    1. En la Google Cloud consola, ve a la página Redes de VPC.

      Ir a la página Redes de VPC

    2. Haz clic en Crear red VPC.

    3. Asigne un Nombre de custom-network1.

    4. En Subredes, selecciona Personalizado en Modo de creación de subred.

    5. En Nueva subred, introduce el Nombre subnet-us-east-192.

    6. En Región, selecciona us-east4.

    7. Introduce un intervalo de direcciones IP de 192.168.1.0/24.

    8. Haz clic en Hecho y, a continuación, en Crear.

    gcloud

    1. Crea una red de nube privada virtual (VPC) en modo personalizado en tu proyecto:

      gcloud compute networks create custom-network1 \
          --subnet-mode custom

      Resultado:

      NAME             MODE     IPV4_RANGE   GATEWAY_IPV4
      custom-network1  custom

    2. Especifica el prefijo de subred de tu primera región. En este ejemplo, asignamos 192.168.1.0/24 a la región us-east4.

      gcloud compute networks subnets create subnet-us-east-192 \
         --network custom-network1 \
         --region us-east4 \
         --range 192.168.1.0/24

      Resultado:

      NAME                REGION    NETWORK          RANGE
      subnet-us-east-192  us-east4  custom-network1  192.168.1.0/24

    Terraform

    Puedes usar un módulo de Terraform para crear una red y una subred de nube privada virtual personalizadas.

    module "test-vpc-module" {
      source       = "terraform-google-modules/network/google"
      version      = "~> 10.0"
      project_id   = var.project_id # Replace this with your project ID in quotes
      network_name = "custom-network1"
      mtu          = 1460
    
      subnets = [
        {
          subnet_name   = "subnet-us-east-192"
          subnet_ip     = "192.168.1.0/24"
          subnet_region = "us-east4"
        }
      ]
    }

    Paso 2: Crear un clúster privado

    Consola

    1. En la Google Cloud consola, ve a la página Clústeres de Kubernetes.

      Ve a la página Clústeres de Kubernetes.

    2. Haz clic en Crear clúster.

    3. En Nombre, escribe nat-test-cluster.

    4. En Tipo de ubicación, selecciona Zonal.

    5. Define Zone (Zona) como us-east4-c.

    6. En el panel de navegación, haz clic en Redes.

    7. Selecciona Clúster privado.

    8. Desmarque la casilla Acceder al plano de control con su dirección IP externa.

    9. Introduce un intervalo de IPs del plano de control de 172.16.0.0/28.

    10. Selecciona Red y, a continuación, custom-network1.

    11. Para crear e iniciar el clúster, haz clic en Crear.

    gcloud

    gcloud container clusters create "nat-test-cluster" \
        --zone "us-east4-c" \
        --username "admin" \
        --cluster-version "latest" \
        --machine-type "e2-medium" \
        --disk-type "pd-standard" \
        --disk-size "100" \
        --scopes "https://www.googleapis.com/auth/compute","https://www.googleapis.com/auth/devstorage.read_only","https://www.googleapis.com/auth/logging.write","https://www.googleapis.com/auth/monitoring","https://www.googleapis.com/auth/servicecontrol","https://www.googleapis.com/auth/service.management.readonly","https://www.googleapis.com/auth/trace.append" \
        --num-nodes "3" \
        --enable-private-nodes \
        --enable-private-endpoint \
        --master-ipv4-cidr "172.16.0.0/28" \
        --enable-ip-alias \
        --network "projects/PROJECT_ID/global/networks/custom-network1" \
        --subnetwork "projects/PROJECT_ID/regions/us-east4/subnetworks/subnet-us-east-192" \
        --max-nodes-per-pool "110" \
        --enable-master-authorized-networks \
        --addons HorizontalPodAutoscaling,HttpLoadBalancing \
        --enable-autoupgrade \
        --enable-autorepair
    

    Terraform

    Puedes usar un recurso de Terraform para crear un clúster privado.

    resource "google_container_cluster" "primary" {
      project            = var.project_id
      name               = "nat-test-cluster"
      location           = "us-east4-c"
      initial_node_count = 3
      network            = var.network # Replace with a reference or self link to your network, in quotes
      subnetwork         = var.subnet  # Replace with a reference or self link to your subnet, in quotes
      private_cluster_config {
        master_ipv4_cidr_block  = "172.16.0.0/28"
        enable_private_endpoint = true
        enable_private_nodes    = true
      }
      ip_allocation_policy {
      }
      master_authorized_networks_config {
      }
    }

    Paso 3: Crea una regla de cortafuegos que permita las conexiones SSH

    Consola

    1. En la Google Cloud consola, ve a la página Políticas de cortafuegos.

      Ir a la página Políticas de cortafuegos

    2. Haz clic en Crear regla de cortafuegos.

    3. Asigne un Nombre de allow-ssh.

    4. Especifica una red de custom-network1.

    5. En Dirección del tráfico, seleccione Entrada.

    6. En Acción tras coincidencia, selecciona Permitir.

    7. En Destinos, selecciona Todas las instancias de la red.

    8. En Filtro de origen, elija Intervalos de IPv4.

    9. Defina Intervalos de IP de origen como 35.235.240.0/20.

    10. En Protocolos y puertos, selecciona Protocolos y puertos especificados.

    11. Selecciona la casilla tcp e introduce el puerto 22.

    12. Haz clic en Crear.

    gcloud

    gcloud compute firewall-rules create allow-ssh \
        --network custom-network1 \
        --source-ranges 35.235.240.0/20 \
        --allow tcp:22

    Terraform

    Puedes usar un recurso de Terraform para crear una regla de cortafuegos.

    resource "google_compute_firewall" "rules" {
      project = var.project_id
      name    = "allow-ssh"
      network = var.network
      allow {
        protocol = "tcp"
        ports    = ["22"]
      }
      source_ranges = ["35.235.240.0/20"]
    }

    Paso 4: Crea permisos SSH de IAP para uno de tus nodos

    En un paso posterior, usa IAP para conectarte a tu nodo.

    Consola

    1. En la Google Cloud consola, ve a la página Identity-Aware Proxy.

      Ir a la página Identity-Aware Proxy

    2. Selecciona la pestaña Recursos SSH y TCP.

    3. Marca la casilla situada junto al primer nodo de la lista de Todos los recursos de túnel > us-east4-c. Su nombre será similar a gke-nat-test-cluster-default-pool-b50db58d-075t.

    4. Anota el nombre del nodo. Más adelante, lo usarás para probar la conectividad.

    5. En el panel de la derecha, haz clic en Añadir principal.

    6. Para conceder acceso a los recursos a usuarios, grupos o cuentas de servicio, especifica sus direcciones de correo en el campo Principales nuevas.

      Si solo quieres probar esta función, puedes introducir tu propia dirección de correo.

    7. Para conceder a las entidades acceso a los recursos mediante la función de reenvío TCP de Cloud IAP, selecciona Cloud IAP > Usuario de túneles protegidos mediante IAP en la lista desplegable Rol.

    8. Haz clic en Guardar.

    gcloud

    Para este paso, sigue las instrucciones de la consola.

    Paso 5: Inicia sesión en el nodo y confirma que no puede acceder a Internet

    Consola

    1. En la consola de Google Cloud , ve a la página Instancias de VM.

      Ve a la página Instancias de VM.

    2. Busca el nodo para el que has creado permisos de IAP SSH. En la columna Conectar, haz clic en la flecha desplegable SSH y, a continuación, selecciona Abrir en ventana del navegador.

      Si es la primera vez que te conectas a la instancia,Google Cloud generará las claves SSH por ti.

    3. En la petición del nodo, busca el ID de proceso del contenedor kube-dns:

      pgrep '^kube-dns$'
    4. Accede al contenedor:

      sudo nsenter --target PROCESS_ID --net /bin/bash
    5. Desde kube-dns, intenta conectarte a Internet:

      curl example.com

      No deberías obtener ningún resultado. Si es así, es posible que no hayas creado el clúster como privado o que haya algún otro problema. Para solucionar problemas, consulta Las VMs pueden acceder a Internet inesperadamente sin NAT público.

      Para finalizar el comando, puede que tengas que introducir Ctrl+C.

    gcloud

    1. Busca el nombre de uno de los nodos del clúster:

      gcloud compute instances list

      El nombre de un nodo tiene un formato similar a este: gke-nat-test-cluster-default-pool-1a4cbd06-3m8v. Anota el nombre del nodo y úsalo en lugar de NODE_NAME en los siguientes comandos.

    2. Conéctate al nodo:

      gcloud compute ssh NODE_NAME \
          --zone us-east4-c \
          --tunnel-through-iap
    3. En la petición del nodo, busca el ID de proceso del contenedor kube-dns:

      pgrep '^kube-dns$'
    4. Accede al contenedor:

      sudo nsenter --target PROCESS_ID --net /bin/bash
    5. Desde kube-dns, intenta conectarte a Internet:

      curl example.com

      No deberías obtener ningún resultado.Para finalizar el comando, puede que tengas que introducir Ctrl+C.

    Paso 6: Crea una configuración de NAT con Cloud Router

    Debes crear el Cloud Router en la misma región que las instancias que usan NAT pública. La NAT pública solo se usa para colocar información de NAT en las VMs. No se usa como parte de la pasarela NAT real.

    Esta configuración permite que todas las instancias de la región usen NAT pública para todos los intervalos de IP de alias y principales. También asigna automáticamente las direcciones IP externas a la pasarela de NAT. Para ver más opciones, consulta la documentación de Google Cloud CLI.

    Consola

    1. En la Google Cloud consola, ve a la página Cloud NAT.

      Ve a la página Cloud NAT.

    2. Haz clic en Empezar o en Crear pasarela NAT.

    3. Introduzca un nombre de pasarela de nat-config.

    4. Define la red de VPC como custom-network1.

    5. En Region (Región), selecciona us-east4.

    6. En Cloud Router, selecciona Crear router.

      1. Asigne un Nombre de nat-router.
      2. Haz clic en Crear.
    7. Haz clic en Crear.

    gcloud

    1. Crea un router de Cloud Router:

      gcloud compute routers create nat-router \
          --network custom-network1 \
          --region us-east4
    2. Añade una configuración al router:

      gcloud compute routers nats create nat-config \
          --router-region us-east4 \
          --router nat-router \
          --nat-all-subnet-ip-ranges \
          --auto-allocate-nat-external-ips

    Terraform

    Puedes usar un recurso de Terraform para crear un Cloud Router.

    resource "google_compute_router" "router" {
      project = var.project_id
      name    = "nat-router"
      network = var.network
      region  = "us-east4"
    }

    Puedes usar un módulo de Terraform para crear una configuración de NAT.

    module "cloud-nat" {
      source                             = "terraform-google-modules/cloud-nat/google"
      version                            = "~> 5.0"
      project_id                         = var.project_id
      region                             = "us-east4"
      router                             = google_compute_router.router.name
      name                               = "nat-config"
      source_subnetwork_ip_ranges_to_nat = "ALL_SUBNETWORKS_ALL_IP_RANGES"
    }

    Paso 7: Intenta conectarte a Internet de nuevo

    La configuración NAT puede tardar hasta tres minutos en propagarse, así que espera al menos un minuto antes de intentar acceder a Internet de nuevo.

    Si aún no has iniciado sesión en kube-dns, vuelve a conectarte siguiendo el procedimiento del paso 5. Una vez que hayas iniciado sesión, vuelve a ejecutar el comando curl:

    curl example.com

    Debería ver un resultado que contenga lo siguiente:

    
    <html>
    <head>
    <title>Example Domain</title>
    ...
    ...
    ...
    </head>
    
    <body>
    <div>
        <h1>Example Domain</h1>
        <p>This domain is established to be used for illustrative examples in documents. You can use this
        domain in examples without prior coordination or asking for permission.</p>
        <p><a href="http://www.iana.org/domains/example">More information...</a></p>
    </div>
    </body>
    </html>
    

    Siguientes pasos