Acceder a clústeres privados de Google Kubernetes Engine con grupos privados de Cloud Build


En este tutorial se describe cómo acceder a un clúster privado de Google Kubernetes Engine (GKE) mediante grupos privados de Cloud Build. Este acceso te permite usar Cloud Build para desplegar tu aplicación en un clúster de GKE privado. Este tutorial está dirigido a administradores de redes y se aplica a todas las situaciones en las que los grupos privados de Cloud Build necesitan comunicarse con servicios que se ejecutan en una red de nube privada virtual (VPC) emparejada. Por ejemplo, los trabajadores de la piscina privada podrían comunicarse con los siguientes servicios:

  • Clúster de GKE privado
  • Base de datos de Cloud SQL
  • Instancia de Memorystore
  • Instancia de Compute Engine que se ejecuta en una red VPC distinta de la que está emparejada con el grupo privado de Cloud Build
  • Instancia de Cloud SQL con IP privada que se ejecuta en una red VPC distinta de la que usa el grupo privado de Cloud Build.

Los grupos privados de Cloud Build y los planos de control de clústeres de GKE se ejecutan en redes de VPC propiedad de Google. Estas redes de VPC se emparejan con tu red de VPC en Google Cloud. Sin embargo, el emparejamiento entre redes de VPC no admite el emparejamiento transitivo, lo que puede ser una restricción al usar grupos privados de Cloud Build. En este tutorial se presenta una solución que usa Cloud VPN para permitir que los trabajadores de un grupo privado de Cloud Build accedan al plano de control de un clúster de GKE privado.

En este tutorial se da por hecho que conoces Google Kubernetes Engine, Cloud Build, el comando gcloud, el peering de redes de VPC y Cloud VPN.

Información general sobre la arquitectura

Cuando creas un clúster de GKE privado sin acceso de cliente al endpoint público, los clientes solo pueden acceder al plano de control del clúster de GKE mediante su dirección IP privada. Los clientes, como kubectl, solo pueden comunicarse con el plano de control si se ejecutan en una instancia que tenga acceso a la red de VPC y que esté en una red autorizada.

Si quieres usar Cloud Build para desplegar tu aplicación en este clúster privado de GKE, debes usar grupos privados de Cloud Build para acceder a los clústeres de GKE. Los grupos privados son un conjunto de instancias de trabajador que se ejecutan en un proyecto propiedad de Google y que se emparejan con tu red de VPC mediante una conexión de emparejamiento entre redes de VPC. Google Cloud En esta configuración, las instancias de trabajador pueden comunicarse con la dirección IP privada del plano de control del clúster de GKE.

Sin embargo, el plano de control del clúster de GKE también se ejecuta en un proyecto propiedad de Google y se conecta a tu red de VPC mediante Private Service Connect (PSC). El emparejamiento de redes de VPC no admite el emparejamiento transitivo, por lo que los paquetes no se pueden enrutar directamente entre el grupo privado de Cloud Build y el plano de control del clúster de GKE.

Para permitir que las instancias de trabajador de Cloud Build accedan al plano de control del clúster de GKE, puedes emparejar el grupo privado y usar PSC para conectar el plano de control del clúster de GKE con dos redes de VPC de tu propiedad. A continuación, conecta estas dos redes de VPC mediante Cloud VPN. Este peering y esta conexión permiten que cada lado del túnel de VPC anuncie la red privada y la red del plano de control del clúster de GKE, lo que completa la ruta.

En el siguiente diagrama de arquitectura se muestran los recursos que se usan en este tutorial:

Túnel VPN que completa la ruta entre el grupo privado de Cloud Build y el plano de control del clúster de GKE.

Para reducir la latencia, te recomendamos que crees todos los recursos que se usan en este tutorial en la misma Google Cloud región. El túnel VPN puede atravesar dos regiones diferentes si necesitas esta comunicación entre regiones para tu implementación. Las dos redes de VPC de tu propiedad también pueden pertenecer a proyectos diferentes.

Objetivos

  • Crea un clúster privado de GKE.
  • Configura un grupo privado de Cloud Build.
  • Crea una conexión VPN de alta disponibilidad entre dos redes VPC.
  • Habilita el enrutamiento de paquetes a través de dos emparejamientos de redes de VPC y una conexión de VPC.

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. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

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

  3. Enable the Cloud Build, Google Kubernetes Engine, and Service Networking APIs.

    Enable the APIs

  4. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    Crear dos redes de VPC en tu proyecto

    En esta sección, crearás dos redes de VPC y una subred para los nodos del clúster de GKE.

    1. En Cloud Shell, crea la primera red de VPC (llamada "Private pool peering VPC network" en el diagrama anterior). No es necesario que crees subredes en esta red.

      gcloud compute networks create PRIVATE_POOL_PEERING_VPC_NAME \
          --subnet-mode=CUSTOM
      

      Sustituye PRIVATE_POOL_PEERING_VPC_NAME por el nombre de tu red de VPC que se va a emparejar con la red del grupo privado de Cloud Build.

    2. Crea la segunda red de VPC (llamada "GKE cluster VPC network" en el diagrama anterior):

      gcloud compute networks create GKE_CLUSTER_VPC_NAME \
          --subnet-mode=CUSTOM
      

      Sustituye GKE_CLUSTER_VPC_NAME por el nombre de tu red VPC para emparejarla con el plano de control del clúster de GKE.

    3. Crea una subred para los nodos del clúster de GKE:

      gcloud compute networks subnets create GKE_SUBNET_NAME \
          --network=GKE_CLUSTER_VPC_NAME \
          --range=GKE_SUBNET_RANGE \
          --region=REGION
      

      Haz los cambios siguientes:

      • GKE_SUBNET_NAME: el nombre de la subred que se va a usar para alojar los nodos del clúster de GKE.
      • GKE_CLUSTER_VPC_NAME: el nombre de tu red VPC para conectarte con el plano de control del clúster de GKE.
      • GKE_SUBNET_RANGE: el intervalo de direcciones IP de GKE_SUBNET_NAME. En este tutorial, puedes usar 10.244.252.0/22.
      • REGION: la Google Cloud región que aloja el clúster de GKE. En este tutorial, puedes usar us-central1.

    Ahora has configurado dos redes de VPC en tu proyecto y están listas para emparejarse con otros servicios.

    Crear un clúster de GKE privado

    En esta sección, creará el clúster de GKE privado.

    1. En Cloud Shell, crea un clúster de GKE sin acceso de cliente al endpoint público del plano de control.

      gcloud container clusters create PRIVATE_CLUSTER_NAME \
          --region=REGION \
          --enable-master-authorized-networks \
          --network=GKE_CLUSTER_VPC_NAME \
          --subnetwork=GKE_SUBNET_NAME \
          --enable-private-nodes \
          --enable-private-endpoint \
          --enable-ip-alias \
          --master-ipv4-cidr=CLUSTER_CONTROL_PLANE_CIDR
      

      Haz los cambios siguientes:

      • PRIVATE_CLUSTER_NAME: el nombre del clúster de GKE privado.
      • REGION: la región del clúster de GKE. En este tutorial, usa us-central1 para la región, la misma que usaste para las redes de VPC.
      • GKE_CLUSTER_VPC_NAME: el nombre de tu red VPC para conectarte al plano de control del clúster de GKE.
      • GKE_SUBNET_RANGE: el intervalo de direcciones IP de GKE_SUBNET_NAME. En este tutorial, puedes usar 10.244.252.0/22.
      • CLUSTER_CONTROL_PLANE_CIDR: el intervalo de direcciones IP del plano de control del clúster de GKE. Debe tener el prefijo /28. En este tutorial, usaremos 172.16.0.32/28.

      Ya has creado un clúster privado de GKE.

    Configurar el emparejamiento entre redes de VPC para GKE 1.28 y versiones anteriores

    Si estás siguiendo este tutorial para configurar un clúster que ya tenga la versión 1.28 o una anterior de GKE, tu red de VPC privada usará el emparejamiento entre redes de VPC para conectarse al clúster de GKE. Sigue estos pasos:

    1. Recupera el nombre del emparejamiento de redes VPC del clúster de GKE. Este emparejamiento de redes VPC se ha creado automáticamente al crear el clúster de GKE.

      export GKE_PEERING_NAME=$(gcloud container clusters describe PRIVATE_CLUSTER_NAME \
          --region=REGION \
          --format='value(privateClusterConfig.peeringName)')
      

      Haz los cambios siguientes:

      • PRIVATE_CLUSTER_NAME: el nombre del clúster de GKE privado.
      • REGION: la región del clúster de GKE. En este tutorial, usa us-central1 para la región, la misma que usaste para las redes de VPC.
    2. Habilita la exportación de rutas personalizadas para anunciar la red del grupo privado al plano de control del clúster de GKE:

      gcloud compute networks peerings update $GKE_PEERING_NAME \
          --network=GKE_CLUSTER_VPC_NAME \
          --export-custom-routes \
          --no-export-subnet-routes-with-public-ip
      

      Sustituye GKE_CLUSTER_VPC_NAME por el nombre de tu red VPC para conectarte al plano de control del clúster de GKE.

      Para obtener más información sobre las rutas personalizadas, consulta el artículo Importar y exportar rutas personalizadas.

    Crear un grupo privado de Cloud Build

    En esta sección, creará el grupo privado de Cloud Build.

    1. En Cloud Shell, asigna un intervalo de direcciones IP con nombre en la red de VPC PRIVATE_POOL_PEERING_VPC_NAMEpara el grupo privado de Cloud Build:

      gcloud compute addresses create RESERVED_RANGE_NAME \
          --global \
          --purpose=VPC_PEERING \
          --addresses=PRIVATE_POOL_NETWORK \
          --prefix-length=PRIVATE_POOL_PREFIX \
          --network=PRIVATE_POOL_PEERING_VPC_NAME
      

      Haz los cambios siguientes:

      • RESERVED_RANGE_NAME: el nombre del intervalo de direcciones IP privadas que aloja el grupo privado de Cloud Build.
      • PRIVATE_POOL_NETWORK: la primera dirección IP de RESERVED_RANGE_NAME. En este tutorial, puedes usar 192.168.0.0.
      • PRIVATE_POOL_PREFIX: el prefijo de RESERVED_RANGE_NAME. Cada grupo privado que se cree usará /24 de este intervalo. En este tutorial, puedes usar 20, que te permite crear hasta dieciséis grupos.
      • PRIVATE_POOL_PEERING_VPC_NAME: el nombre de tu red de VPC con la que se emparejará la red del grupo privado de Cloud Build.
      • El intervalo de direcciones IP es global porque, cuando --purpose es VPC_PEERING, el intervalo de direcciones IP con nombre debe ser global.
    2. Crea una conexión privada entre la red de VPC que contiene el grupo privado de Cloud Build y PRIVATE_POOL_PEERING_VPC_NAME:

      gcloud services vpc-peerings connect \
          --service=servicenetworking.googleapis.com \
          --ranges=RESERVED_RANGE_NAME \
          --network=PRIVATE_POOL_PEERING_VPC_NAME
      

      Haz los cambios siguientes:

      • RESERVED_RANGE_NAME: el nombre del intervalo de direcciones IP privadas que aloja el grupo privado de Cloud Build.
      • PRIVATE_POOL_PEERING_VPC_NAME: el nombre de tu red de VPC con la que se emparejará la red del grupo privado de Cloud Build.
    3. Habilita la exportación de rutas personalizadas para anunciar la red del plano de control del clúster de GKE al grupo privado:

      gcloud compute networks peerings update servicenetworking-googleapis-com \
          --network=PRIVATE_POOL_PEERING_VPC_NAME \
          --export-custom-routes \
          --no-export-subnet-routes-with-public-ip
      

      Sustituye PRIVATE_POOL_PEERING_VPC_NAME por el nombre de tu red de VPC con la que se emparejará la red del grupo privado de Cloud Build.

    4. Crea un grupo privado de Cloud Build emparejado con PRIVATE_POOL_PEERING_VPC_NAME:

      gcloud builds worker-pools create PRIVATE_POOL_NAME \
         --region=REGION \
         --peered-network=projects/$GOOGLE_CLOUD_PROJECT/global/networks/PRIVATE_POOL_PEERING_VPC_NAME
      

      Haz los cambios siguientes:

      • PRIVATE_POOL_NAME: nombre del grupo privado de Cloud Build.
      • REGION: la región del clúster de GKE. En este tutorial, usa us-central1 para la región, la misma que usaste para las redes de VPC.

    Ya has creado un grupo privado de Cloud Build y lo has emparejado con la red de VPC de tu proyecto.

    Crear una conexión Cloud VPN entre tus dos redes de VPC

    En tu proyecto, ahora tienes una red de VPC emparejada con el grupo privado de Cloud Build y una segunda red de VPC emparejada con el clúster privado de GKE.

    En esta sección, crearás una conexión Cloud VPN entre las dos redes de VPC de tu proyecto. Esta conexión completa la ruta y permite que los grupos privados de Cloud Build accedan al clúster de GKE.

    1. En Cloud Shell, crea dos pasarelas de VPN de alta disponibilidad que se conecten entre sí. Para crear estas pasarelas, sigue las instrucciones que se indican en el artículo sobre cómo crear dos pasarelas de VPN de alta disponibilidad totalmente configuradas que se conecten entre sí. La configuración se completa después de crear las sesiones de BGP. Mientras sigues estas instrucciones, usa los siguientes valores:

      • PRIVATE_POOL_PEERING_VPC_NAME para NETWORK_1
      • GKE_CLUSTER_VPC_NAME para NETWORK_2
      • REGION para REGION_1 y REGION_2
    2. Configura cada una de las cuatro sesiones de BGP que has creado para anunciar las rutas a la red de VPC del grupo privado y a la red de VPC del plano de control del clúster de GKE:

      gcloud compute routers update-bgp-peer ROUTER_NAME_1 \
          --peer-name=PEER_NAME_GW1_IF0 \
          --region=REGION \
          --advertisement-mode=CUSTOM \
          --set-advertisement-ranges=PRIVATE_POOL_NETWORK/PRIVATE_POOL_PREFIX
      
      gcloud compute routers update-bgp-peer ROUTER_NAME_1 \
          --peer-name=PEER_NAME_GW1_IF1 \
          --region=REGION \
          --advertisement-mode=CUSTOM \
          --set-advertisement-ranges=PRIVATE_POOL_NETWORK/PRIVATE_POOL_PREFIX
      
      gcloud compute routers update-bgp-peer ROUTER_NAME_2 \
          --peer-name=PEER_NAME_GW2_IF0 \
          --region=REGION \
          --advertisement-mode=CUSTOM \
          --set-advertisement-ranges=CLUSTER_CONTROL_PLANE_CIDR
      
      gcloud compute routers update-bgp-peer ROUTER_NAME_2 \
          --peer-name=PEER_NAME_GW2_IF1 \
          --region=REGION \
          --advertisement-mode=CUSTOM \
          --set-advertisement-ranges=CLUSTER_CONTROL_PLANE_CIDR
      

      Donde los siguientes valores son los mismos nombres que usó cuando creó las dos puertas de enlace de VPN de alta disponibilidad:

      • ROUTER_NAME_1
      • PEER_NAME_GW1_IF0
      • PEER_NAME_GW1_IF1
      • ROUTER_NAME_2
      • PEER_NAME_GW2_IF0
      • PEER_NAME_GW2_IF1

    Habilitar el acceso de Cloud Build al plano de control del clúster de GKE

    Ahora que tienes una conexión VPN entre las dos redes de VPC de tu proyecto, habilita el acceso de Cloud Build al plano de control del clúster de GKE.

    1. En Cloud Shell, añade el intervalo de red del grupo privado a las redes autorizadas del plano de control en GKE:

      gcloud container clusters update PRIVATE_CLUSTER_NAME \
          --enable-master-authorized-networks \
          --region=REGION \
          --master-authorized-networks=PRIVATE_POOL_NETWORK/PRIVATE_POOL_PREFIX
      

      Haz los cambios siguientes:

      • PRIVATE_CLUSTER_NAME: el nombre del clúster de GKE privado.
      • REGION: la región del clúster de GKE. En este tutorial, usa us-central1 para la región, la misma que usaste para las redes de VPC.
      • PRIVATE_POOL_NETWORK: la primera dirección IP de RESERVED_RANGE_NAME. En este tutorial, puedes usar 192.168.0.0.
      • PRIVATE_POOL_PREFIX: el prefijo de RESERVED_RANGE_NAME. Cada grupo privado que se cree usará /24 de este intervalo. En este tutorial, puedes usar 20, que te permite crear hasta dieciséis grupos.
    2. Permite que la cuenta de servicio que usas para la compilación acceda al plano de control del clúster de GKE:

      export PROJECT_NUMBER=$(gcloud projects describe $GOOGLE_CLOUD_PROJECT --format 'value(projectNumber)')
      
      gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
          --member=serviceAccount:SERVICE_ACCOUNT \
          --role=roles/container.developer
      

    Los grupos privados de Cloud Build ahora pueden acceder al plano de control del clúster de GKE.

    Verificar la solución

    En esta sección, comprobarás que la solución funciona ejecutando el comando kubectl get nodes en un paso de compilación que se ejecuta en el grupo privado.

    1. En Cloud Shell, crea una carpeta temporal con un archivo de configuración de Cloud Build que ejecute el comando kubectl get nodes:

      mkdir private-pool-test && cd private-pool-test
      
      cat > cloudbuild.yaml <<EOF
      steps:
      - name: "gcr.io/cloud-builders/kubectl"
        args: ['get', 'nodes']
        env:
        - 'CLOUDSDK_COMPUTE_REGION=REGION'
        - 'CLOUDSDK_CONTAINER_CLUSTER=PRIVATE_CLUSTER_NAME'
      options:
        workerPool:
          'projects/$GOOGLE_CLOUD_PROJECT/locations/REGION/workerPools/PRIVATE_POOL_NAME'
      EOF
      

      Haz los cambios siguientes:

      • REGION: la región del clúster de GKE. En este tutorial, usa us-central1 para la región, la misma que usaste para las redes de VPC.
      • PRIVATE_CLUSTER_NAME: el nombre del clúster de GKE privado.
      • PRIVATE_POOL_NAME: nombre del grupo privado de Cloud Build.
    2. Inicia la tarea de compilación:

      gcloud builds submit --config=cloudbuild.yaml
      
    3. Verifica que la salida sea la lista de nodos del clúster de GKE. El registro de compilación que se muestra en la consola incluye una tabla similar a esta:

      NAME                                     STATUS   ROLES    AGE   VERSION
      gke-private-default-pool-3ec34262-7lq9   Ready    <none>   9d    v1.19.9-gke.1900
      gke-private-default-pool-4c517758-zfqt   Ready    <none>   9d    v1.19.9-gke.1900
      gke-private-default-pool-d1a885ae-4s9c   Ready    <none>   9d    v1.19.9-gke.1900
      

    Ahora has verificado que los trabajadores del grupo privado pueden acceder al clúster de GKE. Este acceso te permite usar Cloud Build para desplegar tu aplicación en este clúster privado de GKE.

    Solución de problemas

    Si tienes problemas con este tutorial, consulta los siguientes documentos:

    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 los recursos concretos

    1. En Cloud Shell, elimina el clúster de GKE:

      gcloud container clusters delete PRIVATE_CLUSTER_NAME \
          --region=REGION \
          --async
      

      Cuando ejecutes este comando, el emparejamiento de redes de VPC se eliminará automáticamente.

    2. Elimina el grupo privado de Cloud Build:

      gcloud builds worker-pools delete PRIVATE_POOL_NAME \
          --region=REGION
      
    3. Elimina la conexión privada entre la red de VPC del productor de servicios y PRIVATE_POOL_PEERING_VPC_NAME:

      gcloud services vpc-peerings delete \
         --network=PRIVATE_POOL_PEERING_VPC_NAME \
         --async
      
    4. Elimina el intervalo de direcciones IP con nombre que se usa en el grupo privado:

      gcloud compute addresses delete RESERVED_RANGE_NAME \
          --global
      
    5. Elimina los cuatro túneles VPN. Usa los mismos nombres que especificaste en Crear túneles VPN.

      gcloud compute vpn-tunnels delete \
          TUNNEL_NAME_GW1_IF0 \
          TUNNEL_NAME_GW1_IF1 \
          TUNNEL_NAME_GW2_IF0 \
          TUNNEL_NAME_GW2_IF1 \
          --region=REGION
      
    6. Elimina los dos Cloud Routers. Usa los mismos nombres que especificaste en Crear routers de Cloud Router.

      gcloud compute routers delete \
          ROUTER_NAME_1 \
          ROUTER_NAME_2 \
          --region=REGION
      
    7. Elimina las dos pasarelas VPN. Use los mismos nombres que especificó en la sección Crear las pasarelas de VPN de alta disponibilidad.

      gcloud compute vpn-gateways delete \
          GW_NAME_1 \
          GW_NAME_2 \
          --region=REGION
      
    8. Elimina GKE_SUBNET_NAME, que es la subred que aloja los nodos del clúster de GKE:

      gcloud compute networks subnets delete GKE_SUBNET_NAME \
          --region=REGION
      
    9. Elimina las dos redes de VPC PRIVATE_POOL_PEERING_VPC_NAME y GKE_CLUSTER_VPC_NAME:

      gcloud compute networks delete \
          PRIVATE_POOL_PEERING_VPC_NAME \
          GKE_CLUSTER_VPC_NAME
      

    Siguientes pasos