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

En este instructivo, 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 implementar tu aplicación en un clúster privado de GKE. Este instructivo está dirigido a los administradores de red y es aplicable 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) de intercambio de tráfico. Por ejemplo, los trabajadores de la piscina privada podrían comunicarse con los siguientes servicios:

  • Clúster privado de GKE
  • Base de datos de Cloud SQL
  • Instancia de Memorystore
  • Instancia de Compute Engine que se ejecuta en una red de VPC diferente a la que intercambia tráfico con el grupo privado Cloud Build

Los grupos privados de Cloud Build y los planos de control del clúster de GKE se ejecutan en las redes de VPC de Google. Estas redes de VPC intercambian tráfico con tu propia red de VPC en Google Cloud. Sin embargo, el intercambio de tráfico entre redes de VPC no admite el intercambio de tráfico transitivo, que puede ser una restricción cuando se usan grupos privados de Cloud Build. En este instructivo, 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 privado de GKE.

En este instructivo, se supone que estás familiarizado con Google Kubernetes Engine, Cloud Build, el comando gcloud, el intercambio de tráfico entre redes de VPC y Cloud VPN.

Descripción general de la arquitectura

Cuando creas un clúster privado de GKE sin acceso de clientes al extremo 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 pueden comunicarse con el plano de control solo si se ejecutan en una instancia que tiene acceso a la red de VPC y que está en una red autorizada.

Si deseas usar Cloud Build para implementar 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 de Google Cloud y pertenecen a Google, y que intercambian tráfico con tu red de VPC mediante una conexión de intercambio de tráfico entre redes de VPC. 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 de Google y realiza un intercambio de tráfico con tu red de VPC mediante una conexión de intercambio de tráfico. El intercambio de tráfico entre redes de VPC no admite el intercambio de tráfico 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 intercambiar tráfico entre el grupo privado y el plano de control del clúster de GKE con dos redes de VPC de tu propiedad y, luego, conectar estas dos redes de VPC que usan Cloud VPN. Este intercambio de tráfico y conexión permite que cada lado del túnel VPC anuncie el grupo privado y las redes del plano de control del clúster de GKE, lo que completa la ruta.

En el siguiente diagrama arquitectónico, se muestran los recursos que se usan en este instructivo:

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

Recomendamos crear todos los recursos usados en este instructivo en la misma región de Google Cloud para una latencia baja. El túnel VPN puede recorrer dos regiones diferentes si esta comunicación entre regiones es necesaria para tu propia implementación. Las dos redes de VPC que posees también pueden pertenecer a proyectos diferentes.

Objetivos

  • Crear un clúster privado de GKE
  • Configurar un grupo privado de Cloud Build
  • Crear una conexión de VPN con alta disponibilidad entre dos redes de VPC
  • Habilitar el enrutamiento de paquetes en dos intercambios de tráfico de red de VPC y una conexión de VPC

Costos

En este instructivo, se usan los siguientes componentes facturables de Google Cloud:

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios. Es posible que los usuarios nuevos de Google Cloud sean aptos para obtener una prueba gratuita.

Cuando finalices este instructivo, podrás borrar los recursos creados para evitar que se te siga facturando. Para obtener más información, consulta cómo hacer una limpieza.

Antes de comenzar

  1. En la página del selector de proyectos de Google Cloud Console, selecciona o crea un proyecto de Google Cloud.

    Ir al selector de proyectos

  2. Asegúrate de que la facturación esté habilitada para tu proyecto de Cloud. Descubre cómo confirmar que tienes habilitada la facturación en un proyecto.

  3. Habilita las API de Cloud Build, Google Kubernetes Engine, and Service Networking.

    Habilita las API

  4. En Cloud Console, activa Cloud Shell.

    Activar Cloud Shell

    En la parte inferior de Cloud Console, se inicia una sesión de Cloud Shell en la que se muestra una ventana de línea de comandos. Cloud Shell es un entorno de shell que tiene el SDK de Cloud preinstalado, incluida la herramienta de línea de comandos de gcloud, y valores ya establecidos para el proyecto actual. La inicialización de la sesión puede tomar unos minutos.

Crea dos redes de VPC en tu propio 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 “Red de VPC de intercambio de tráfico privado en el grupo” en el diagrama anterior). No es necesario crear subredes en esta red.

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

    PRIVATE_POOL_VPC_NAME es el nombre de tu red de VPC en la que se realizará el intercambio de tráfico con la red de grupo privado de Cloud Build.

  2. Crea la segunda red de VPC (llamada “red de VPC con intercambio de tráfico de GKE” en el diagrama anterior):

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

    GKE_VPC_NAME es el nombre de tu red de VPC para intercambiar tráfico 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_VPC_NAME \
        --range=GKE_SUBNET_RANGE \
        --region=REGION
    

    Reemplaza lo siguiente:

    • GKE_SUBNET_NAME: Es el nombre de la subred que se destinó para alojar los nodos del clúster de GKE.
    • GKE_SUBNET_RANGE: Es el rango de direcciones IP de GKE_SUBNET_NAME. Para este instructivo, puedes usar 10.244.252.0/22.
    • REGION: La región de Google Cloud que aloja el clúster de GKE. Para este instructivo, puedes usar us-central1.

Ya configuraste dos redes de VPC en tu propio proyecto y están listas para intercambiar tráfico con otros servicios.

Crea un clúster privado de GKE

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

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

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

    Reemplaza lo siguiente:

    • PRIVATE_CLUSTER_NAME: Es el nombre del clúster privado de GKE.
    • CLUSTER_CONTROL_PLANE_CIDR: El rango de direcciones IP del plano de control del clúster de GKE. Debe tener un prefijo /28. En este instructivo, usa 172.16.0.32/28.
    • REGION: Es la región del clúster de GKE. En este instructivo, usa us-central1 para la región, la misma que usaste en las redes de VPC.

    Ya creaste un clúster privado de GKE que intercambia tráfico con la red de VPC de tu propio proyecto.

  2. Recupera el nombre del intercambio de tráfico entre redes de VPC del clúster de GKE. Este intercambio de tráfico entre redes de VPC se creó de forma automática cuando creaste el clúster de GKE.

    export GKE_PEERING_NAME=$(gcloud container clusters describe PRIVATE_CLUSTER_NAME \
        --region=REGION \
        --format='value(privateClusterConfig.peeringName)')
    
  3. Habilita la exportación de rutas personalizadas para anunciar la red del grupo privado en el plano de control del clúster de GKE:

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

    Para obtener más información sobre las rutas personalizadas, consulta Importa y exporta rutas personalizadas.

Crea un grupo privado de Cloud Build

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

  1. En Cloud Shell, asigna un rango de direcciones IP con nombre en la red de VPC PRIVATE_POOL_VPC_NAME para 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_VPC_NAME
    

    Reemplaza lo siguiente:

    • RESERVED_RANGE_NAME: El nombre del rango de direcciones IP privadas que aloja el grupo privado de Cloud Build.
    • PRIVATE_POOL_NETWORK: Es la primera dirección IP de RESERVED_RANGE_NAME. Para este instructivo, puedes usar 192.168.0.0.
    • PRIVATE_POOL_PREFIX: Es el prefijo de RESERVED_RANGE_NAME. Debe ser mayor que /24. Para este instructivo, puedes usar 16.
    • El rango de IP es global porque, cuando --purpose es VPC_PEERING, el rango de direcciones IP con nombre debe ser global.
  2. Crea una conexión privada entre la red de VPC del grupo privado y PRIVATE_POOL_VPC_NAME:

    gcloud services vpc-peerings connect \
        --service=servicenetworking.googleapis.com \
        --ranges=RESERVED_RANGE_NAME \
        --network=PRIVATE_POOL_VPC_NAME
    
  3. Habilita la exportación de rutas personalizadas para anunciar la red del plano de control del clúster de GKE en el grupo privado:

    gcloud compute networks peerings update servicenetworking-googleapis-com \
        --network=PRIVATE_POOL_VPC_NAME \
        --export-custom-routes \
        --no-export-subnet-routes-with-public-ip
    
  4. Crea un grupo privado de Cloud Build en el que se realice un intercambio de tráfico con PRIVATE_POOL_VPC_NAME:

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

    PRIVATE_POOL_NAME es el nombre del grupo privado de Cloud Build.

Ya creaste un grupo privado de Cloud Build y lo intercambiaste con la red de VPC de tu propio proyecto.

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

En tu propio proyecto, ahora tienes una red de VPC que intercambia tráfico con el grupo privado de Cloud Build y otra red de VPC que intercambia tráfico con el clúster privado de GKE.

En esta sección, crearás una conexión de 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 puertas de enlace de VPN con alta disponibilidad que se conecten entre sí. Para crear estas puertas de enlace, sigue las instrucciones que aparecen en Crea dos puertas de enlace de VPN con alta disponibilidad configuradas por completo que se conecten entre sí. La configuración se completa después de crear las sesiones de BGP. Cuando sigas estas instrucciones, usa los siguientes valores:

    • PRIVATE_POOL_VPC_NAME para NETWORK_1
    • GKE_VPC_NAME para NETWORK_2
    • REGION para REGION_1 y REGION_2
  2. Configura cada una de las cuatro sesiones de BGP que creaste para anunciar las rutas a la red de VPC del grupo privado y a la 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
    

    Los siguientes valores son los mismos nombres que usaste cuando creaste las dos puertas de enlace de VPN con alta disponibilidad:

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

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

Ahora que tienes una conexión de 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, agrega el rango 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
    

    Reemplaza lo siguiente:

    • PRIVATE_POOL_NETWORK: Es la primera dirección IP de RESERVED_RANGE_NAME. Para este instructivo, puedes usar 192.168.0.0.
    • PRIVATE_POOL_PREFIX: Es el prefijo de RESERVED_RANGE_NAME. Debe ser mayor que /24. Para este instructivo, puedes usar 16.
  2. Permite que la cuenta de servicio de Cloud Build 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:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com \
        --role=roles/container.developer
    

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

Verifica la solución

En esta sección, debes ejecutar el comando kubectl get nodes en un paso de compilación que se ejecuta en el grupo privado para verificar que la solución funcione.

  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
    
  2. Inicia el trabajo de compilación:

    gcloud builds submit --config=cloudbuild.yaml
    
  3. Verifica que el resultado sea la lista de nodos en el clúster de GKE. En el registro de compilación que se muestra en la consola, se incluye una tabla similar a la que se muestra a continuación:

    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
    

Ya verificaste que los trabajadores del grupo privado puedan acceder al clúster de GKE. Este acceso te permite usar Cloud Build para implementar tu aplicación en este clúster privado de GKE.

Soluciona problemas

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

Limpia

Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos usados en este instructivo, borra el proyecto que contiene los recursos o conserva el proyecto y borra los recursos individuales.

Borra el proyecto

  1. En Cloud Console, ve a la página Administrar recursos.

    Ir a Administrar recursos

  2. En la lista de proyectos, elige el proyecto que quieres borrar y haz clic en Borrar.
  3. En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrar el proyecto.

Borra los recursos individuales

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

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

    Cuando ejecutas este comando, el intercambio de tráfico entre redes de VPC se borra de forma automática.

  2. Borra el grupo privado de Cloud Build:

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

    gcloud services vpc-peerings delete \
       --network=PRIVATE_POOL_VPC_NAME \
       --async
    
  4. Borra el rango de direcciones IP con nombre que se usa para el grupo privado:

    gcloud compute addresses delete RESERVED_RANGE_NAME \
        --global
    
  5. Borra los cuatro túneles VPN. Usa los mismos nombres que especificaste en Crea 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. Borra los dos Cloud Routers. Usa los mismos nombres que especificaste en Crea Cloud Routers.

    gcloud compute routers delete \
        ROUTER_NAME_1 \
        ROUTER_NAME_2 \
        --region=REGION
    
  7. Borra las dos puertas de enlace de VPN. Usa los mismos nombres que especificaste en Crea las puertas de enlace de VPN con alta disponibilidad.

    gcloud compute vpn-gateways delete \
        GW_NAME_1 \
        GW_NAME_2 \
        --region=REGION
    
  8. Borra 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. Borra las dos redes de VPC PRIVATE_POOL_VPC_NAME y GKE_VPC_NAME:

    gcloud compute networks delete \
        PRIVATE_POOL_VPC_NAME \
        GKE_VPC_NAME
    

¿Qué sigue?