Acceder de forma remota a un clúster privado mediante un host bastion

.

En este tutorial se muestra cómo acceder a un clúster privado de Google Kubernetes Engine (GKE) a través de Internet mediante un host bastión.

Puedes crear clústeres privados de GKE sin acceso de cliente al endpoint público. Esta opción de acceso mejora la seguridad del clúster, ya que impide que se acceda al plano de control a través de Internet. Sin embargo, si inhabilitas el acceso al endpoint público, no podrás interactuar con tu clúster de forma remota, a menos que añadas la dirección IP de tu cliente remoto como red autorizada.

En este tutorial se explica cómo configurar un host bastion, que es un host de propósito especial diseñado para resistir ataques. El host bastion usa Tinyproxy para reenviar el tráfico del cliente al clúster. Utilizas Identity-Aware Proxy (IAP) para acceder de forma segura al host bastion desde tu cliente remoto.

Objetivos

  • Crea un clúster privado sin acceso al endpoint público.
  • Despliega una máquina virtual de Compute Engine para que actúe como host bastion en la subred del clúster.
  • Usa IAP para conectar un cliente remoto al clúster a través de Internet.

Costes

En este documento, se utilizan los siguientes componentes facturables de Google Cloud:

Para generar una estimación de costes basada en el uso previsto, utiliza la calculadora de precios.

Los usuarios nuevos Google Cloud pueden disfrutar de una prueba gratuita.

Cuando termines las tareas que se describen en este documento, puedes evitar que se te siga facturando eliminando los recursos que has creado. Para obtener más información, consulta la sección Limpiar.

Antes de empezar

  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. Enable the GKE, Compute Engine, Identity-Aware Proxy APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  5. Install the Google Cloud CLI.

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

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

    gcloud init
  8. Después de inicializar gcloud CLI, actualízala e instala los componentes necesarios:

    gcloud components update
    gcloud components install alpha beta
  9. 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

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

  11. Enable the GKE, Compute Engine, Identity-Aware Proxy APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  12. Install the Google Cloud CLI.

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

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

    gcloud init
  15. Después de inicializar gcloud CLI, actualízala e instala los componentes necesarios:

    gcloud components update
    gcloud components install alpha beta
  16. Crear un clúster privado

    Crea un clúster privado sin acceso de cliente al endpoint público. Coloca el clúster en su propia subred. Puedes hacerlo con la CLI de Google Cloud o con la Google Cloud consola.

    gcloud

    Ejecuta el siguiente comando:

    gcloud container clusters create-auto CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --create-subnetwork=name=SUBNET_NAME \
        --enable-master-authorized-networks \
        --enable-private-nodes \
        --enable-private-endpoint
    

    Haz los cambios siguientes:

    • CLUSTER_NAME: el nombre del nuevo clúster.
    • CONTROL_PLANE_LOCATION: la región de Compute Engine del plano de control de tu clúster.
    • SUBNET_NAME: el nombre de la nueva subred en la que quieres colocar el clúster.

    Consola

    Crear una subred de nube privada virtual

    1. Ve a la página Redes de VPC de la consola de Google Cloud .

      Ir a redes de VPC

    2. Haz clic en la red predeterminada.

    3. En la sección Subredes, haz clic en Añadir subred.

    4. En el cuadro de diálogo Añadir una subred, especifica lo siguiente:

      1. Nombre: nombre de la nueva subred.
      2. Región: región de la subred. Debe ser la misma que la región del clúster.
      3. Intervalo de direcciones IP: especifica 10.2.204.0/22 u otro intervalo que no entre en conflicto con otros intervalos de la red VPC.
      4. En Acceso privado de Google, selecciona la opción Activado.
    5. Haz clic en Añadir.

    Crear un clúster privado

    1. Ve a la página Google Kubernetes Engine en la Google Cloud consola.

      Ir a Google Kubernetes Engine

    2. Haz clic en Crear.

    3. Haz clic en Configurar en Autopilot de GKE.

    4. Especifica un nombre y una región para el nuevo clúster. La región debe ser la misma que la de la subred.

    5. En la sección Redes, selecciona la opción Clúster privado.

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

    7. En la lista desplegable Subred de nodo, selecciona la subred que has creado.

    8. También puede configurar otros ajustes del clúster.

    9. Haz clic en Crear.

    También puedes usar un clúster Estándar de GKE con la marca --master-ipv4-cidr especificada.

    Crear una VM de host bastion

    Crea una VM de Compute Engine en la red interna del clúster privado para que actúe como host bastion que pueda gestionar el clúster.

    gcloud

    Crea una VM de Compute Engine:

    gcloud compute instances create INSTANCE_NAME \
        --zone=COMPUTE_ZONE \
        --machine-type=e2-micro \
        --network-interface=no-address,network-tier=PREMIUM,subnet=SUBNET_NAME
    

    Haz los cambios siguientes:

    • INSTANCE_NAME: el nombre de la VM.
    • COMPUTE_ZONE: la zona de Compute Engine de la VM. Colócalo en la misma región que el clúster.
    • SUBNET_NAME: la subred en la que quieras colocar la VM.

    Consola

    1. Ve a la página Instancias de VM de la Google Cloud consola.

      Ir a instancias de VM

    2. Haz clic en Crear instancia.

    3. Especifica lo siguiente:

      1. Nombre: el nombre de tu VM.
      2. Región y Zona: la región y la zona de tu VM. Usa la misma región que tu clúster.
      3. Tipo de máquina: un tipo de máquina. Elige un tipo de máquina pequeño, como e2-micro.
      4. En Interfaces de red, selecciona la misma red VPC y subred que el clúster.
      5. También puede configurar otros ajustes de la instancia.
    4. Haz clic en Crear.

    Crear regla de cortafuegos

    Para permitir que IAP se conecte a tu VM de host bastion, crea una regla de cortafuegos.

    Implementar el proxy

    Una vez configurados el host bastion y el clúster privado, debes implementar un daemon proxy en el host para reenviar el tráfico al plano de control del clúster. En este tutorial, instalarás Tinyproxy.

    1. Inicia una sesión en tu VM:

      gcloud compute ssh INSTANCE_NAME --tunnel-through-iap --project=PROJECT_ID
      
    2. Instala Tinyproxy:

      sudo apt install tinyproxy
      
    3. Abre el archivo de configuración de Tinyproxy:

      sudo vi /etc/tinyproxy/tinyproxy.conf
      
    4. En el archivo, haz lo siguiente:

      1. Comprueba que el puerto sea 8888.
      2. Busca la sección Allow:

          /Allow 127
        
      3. Añade la siguiente línea a la sección Allow:

          Allow localhost
        
    5. Guarda el archivo y reinicia Tinyproxy:

      sudo service tinyproxy restart
      
    6. Salir de la sesión:

      exit
      

    Conectarse al clúster desde el cliente remoto

    Después de configurar Tinyproxy, debes configurar el cliente remoto con las credenciales del clúster y especificar el proxy. Haz lo siguiente en el cliente remoto:

    1. Obtén las credenciales del clúster:

      gcloud container clusters get-credentials CLUSTER_NAME \
          --location=CONTROL_PLANE_LOCATION \
          --project=PROJECT_ID
      

      Haz los cambios siguientes:

      • CLUSTER_NAME: el nombre del clúster privado.
      • CONTROL_PLANE_LOCATION: la ubicación de Compute Engine del plano de control de tu clúster. Proporciona una región para los clústeres regionales o una zona para los clústeres zonales.
      • PROJECT_ID: el ID del Google Cloud proyecto del clúster.
    2. Crea un túnel a la pasarela de aplicaciones mediante IAP:

      gcloud compute ssh INSTANCE_NAME \
          --tunnel-through-iap \
          --project=PROJECT_ID \
          --zone=COMPUTE_ZONE \
          --ssh-flag="-4 -L8888:localhost:8888 -N -q -f"
      
    3. Especifica el proxy:

      export HTTPS_PROXY=localhost:8888
      kubectl get ns
      

      El resultado es una lista de espacios de nombres del clúster privado.

    Dejar de escuchar en el cliente remoto

    Si quieres deshacer el cambio en el cliente remoto en cualquier momento, debes finalizar el proceso de escucha en el puerto TCP 8888. El comando para hacerlo varía en función del sistema operativo del cliente.

    netstat -lnpt | grep 8888 | awk '{print $7}' | grep -o '[0-9]\+' | sort -u | xargs sudo kill
    

    Solución de problemas

    Restricciones de cortafuegos en redes empresariales

    Si te encuentras en una red empresarial con un firewall estricto, es posible que no puedas completar este tutorial sin solicitar una excepción. Si solicitas una excepción, el intervalo de IPs de origen del host bastion es 35.235.240.0/20 de forma predeterminada.

    Limpieza

    Para evitar que los recursos utilizados en este tutorial se cobren en tu cuenta de Google Cloud, elimina el proyecto que contiene los recursos o conserva el proyecto y elimina los recursos.

    Eliminar el proyecto

    1. In the Google Cloud console, go to the Manage resources page.

      Go to Manage resources

    2. In the project list, select the project that you want to delete, and then click Delete.
    3. In the dialog, type the project ID, and then click Shut down to delete the project.

    Eliminar recursos concretos

    1. Elimina el host bastion que has implementado en este tutorial:

      gcloud compute instances delete INSTANCE_NAME \
          --zone=COMPUTE_ZONE
      
    2. Elimina el clúster:

      gcloud container clusters delete CLUSTER_NAME \
          --location=CONTROL_PLANE_LOCATION
      
    3. Elimina la subred:

      gcloud compute networks subnets delete SUBNET_NAME \
          --region=CONTROL_PLANE_LOCATION