Usa NAT pública con GKE

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

Requisitos previos

Debes hacer lo siguiente antes de configurar la NAT pública.

Obtén permisos de IAM

La función roles/compute.networkAdmin te da permisos para crear una puerta de enlace NAT en Cloud Router, reservar y asignar direcciones IP de NAT y especificar subredes cuyo tráfico debería usar la traducción de direcciones de red a través de la puerta de enlace NAT.

Configura Google Cloud

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

  1. Accede a tu cuenta de Google Cloud. Si eres nuevo en Google Cloud, crea una cuenta para evaluar el rendimiento de nuestros productos en situaciones reales. Los clientes nuevos también obtienen $300 en créditos gratuitos para ejecutar, probar y, además, implementar cargas de trabajo.
  2. En la página del selector de proyectos de la consola de Google Cloud, selecciona o crea un proyecto de Google Cloud.

    Ir al selector de proyectos

  3. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.

  4. Instala Google Cloud CLI.
  5. Para inicializar la CLI de gcloud, ejecuta el siguiente comando:

    gcloud init
  6. En la página del selector de proyectos de la consola de Google Cloud, selecciona o crea un proyecto de Google Cloud.

    Ir al selector de proyectos

  7. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.

  8. Instala Google Cloud CLI.
  9. Para inicializar la CLI de gcloud, ejecuta el siguiente comando:

    gcloud init

Configura el ejemplo de GKE

Usa este ejemplo si deseas ver una configuración de NAT pública simple que funciona con GKE.

Paso 1: Crea una subred y una red de VPC

Si ya tienes una red y una subred, puedes omitir este paso.

Console

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

    Ir a la página Redes de VPC

  2. Haz clic en Crear red de VPC

  3. En Nombre ingresa custom-network1.

  4. En Subredes, establece Modo de creación de subred como Personalizado.

  5. En Subred nueva, ingresa el nombre subnet-us-east-192.

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

  7. Ingresa un rango de direcciones IP de 192.168.1.0/24.

  8. Haga clic en Listo y, luego, en Crear.

gcloud

  1. Crea una nueva red de nube privada virtual (VPC) de 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 para tu primera región. En este ejemplo, se asigna 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 subred de nube privada virtual personalizada.

module "test-vpc-module" {
  source       = "terraform-google-modules/network/google"
  version      = "~> 9.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: Crea un clúster privado

Console

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

    Ir a la página Clústeres de Kubernetes

  2. Haz clic en Crear clúster.

  3. En Name (Nombre), ingresa nat-test-cluster.

  4. Configura Tipo de ubicación como Zonal.

  5. Configura Zona como us-east4-c.

  6. En el panel de navegación, haga clic en Herramientas de redes.

  7. Selecciona Clúster privado.

  8. Desmarca la casilla de verificación Permitir el acceso al plano de control mediante su dirección IP externa.

  9. Ingresa un Rango de IP del plano de control de 172.16.0.0/28.

  10. Configura Red como custom-network1.

  11. Para crear y, luego, 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 firewall que admita conexiones SSH

Console

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

    Ir a la página Políticas de firewall

  2. Haz clic en Crear regla de firewall.

  3. Ingresa un Nombre de allow-ssh.

  4. En Red, especifica custom-network1.

  5. Configura Dirección del tráfico como Entrada.

  6. Establece Acción en caso de coincidencia en Permitir.

  7. Configura Destinos como Todas las instancias de la red.

  8. Configura Filtro de fuente como Rangos de IPv4.

  9. Configura Rangos de IP de origen como 35.235.240.0/20.

  10. Configura Protocolos y puertos como Protocolos y puertos especificados.

  11. Selecciona la casilla de verificación tcp y, luego, ingresa 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 firewall.

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 de SSH para IAP para uno de tus nodos

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

Console

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

    Ir a la página de Identity-Aware Proxy

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

  3. Selecciona la casilla de verificación junto al primer nodo en la lista, en Todos los recursos del túnel > us-east4-c. Su nombre será similar a gke-nat-test-cluster-default-pool-b50db58d-075t.

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

  5. En el panel de la derecha, haz clic en Agregar principal.

  6. Para otorgar a los usuarios, grupos o cuentas de servicio acceso a los recursos, en el campo Nuevas principales, especifica sus direcciones de correo electrónico.

    Si solo estás probando esta función, puedes ingresar tu propia dirección de correo electrónico.

  7. Para otorgar a las principales acceso a los recursos a través de la función de redireccionamiento de TCP de Cloud IAP, en la lista desplegable Función, selecciona Cloud IAP > Usuario de túnel protegido con IAP.

  8. Haz clic en Guardar.

gcloud

Para este paso, usa las instrucciones de Console.

Paso 5: Accede al nodo y confirma que no pueda acceder a Internet

Console

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

    Ir a la página Instancias de VM

  2. Busca el nodo para el que creaste permisos de SSH para IAP. En la columna Conectar, haz clic en la flecha desplegable SSH y, luego, selecciona Abrir en otra ventana del navegador.

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

  3. En el símbolo del sistema de nodo, busca el ID del 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 lo haces, es posible que no hayas creado tu clúster como privado o que exista otro problema. Para solucionar problemas, consulta Las VM pueden acceder a Internet de forma inesperada sin NAT pública.

    Para finalizar el comando, es posible que debas ingresar Ctrl+C.

gcloud

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

    gcloud compute instances list

    El nombre de un nodo tiene un aspecto similar a gke-nat-test-cluster-default-pool-1a4cbd06-3m8v. Anótalo y usa ese nombre en cualquier lugar donde veas NODE_NAME en los comandos siguientes.

  2. Conéctate al nodo:

    gcloud compute ssh NODE_NAME \
        --zone us-east4-c \
        --tunnel-through-iap
  3. En el símbolo del sistema de nodo, busca el ID del 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, es posible que debas ingresar 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 VM. No se usa como parte de la puerta de enlace NAT.

Esta configuración permite que todas las instancias de la región usen NAT pública para todos los rangos de IP de alias principales y de alias. También asigna de forma automática las direcciones IP externas de la puerta de enlace NAT. Para obtener más opciones, consulta la documentación de Google Cloud CL.

Console

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

    Ir a la página de Cloud NAT

  2. Haz clic en Comenzar o Crear puerta de enlace de NAT.

  3. En Nombre de la puerta de enlace, ingresa nat-config.

  4. Establece Red de VPC en custom-network1.

  5. Establece Región en us-east4.

  6. En Cloud Router, seleccione Crear router nuevo.

    1. En Nombre ingresa nat-router.
    2. Haz clic en Crear.
  7. Haz clic en Crear.

gcloud

  1. Crea un Cloud Router:

    gcloud compute routers create nat-router \
        --network custom-network1 \
        --region us-east4
  2. Agrega 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: Vuelve a conectarte a Internet

La configuración de NAT puede tardar hasta tres minutos en propagarse, por lo que deberás esperar al menos un minuto antes de intentar acceder a Internet.

Si aún no accediste a kube-dns, vuelve a conectarte con el procedimiento que se indica en el Paso 5. Después de acceder, vuelve a ejecutar el comando curl:

curl example.com

Deberías ver un resultado con el siguiente contenido:


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

¿Qué sigue?