Aceda a clusters privados do Google Kubernetes Engine com node pools privados do Cloud Build


Este tutorial descreve como aceder a um cluster privado do Google Kubernetes Engine (GKE) usando pools privados do Cloud Build. Este acesso permite-lhe usar o Cloud Build para implementar a sua aplicação num cluster do GKE privado. Este tutorial destina-se a administradores de rede e aplica-se a todas as situações em que os pools privados do Cloud Build precisam de comunicar com serviços em execução numa rede de nuvem virtual privada (VPC) com intercâmbio. Por exemplo, os trabalhadores da piscina privada podem comunicar com os seguintes serviços:

  • Cluster do GKE privado
  • Base de dados do Cloud SQL
  • Instância do Memorystore
  • Instância do Compute Engine em execução numa rede da VPC diferente da que está em intercâmbio com o pool privado do Cloud Build
  • Instância do Cloud SQL, com IP privado, em execução numa rede VPC diferente da usada pelo conjunto privado do Cloud Build.

Os pools privados do Cloud Build e os planos de controlo do cluster do GKE são executados em redes VPC pertencentes à Google. Estas redes da VPC têm intercâmbio com a sua própria rede da VPC no Google Cloud. No entanto, o peering de redes VPC não suporta o peering transitivo, o que pode ser uma restrição quando usa pools privados do Cloud Build. Este tutorial apresenta uma solução que usa a Cloud VPN para permitir que os trabalhadores num pool privado do Cloud Build acedam ao plano de controlo de um cluster privado do GKE.

Este tutorial pressupõe que tem conhecimentos do Google Kubernetes Engine, do Cloud Build, do comando gcloud, do intercâmbio da rede da VPC e da Cloud VPN.

Vista geral da arquitetura

Quando cria um cluster do GKE privado sem acesso de cliente ao ponto final público, os clientes só podem aceder ao plano de controlo do cluster do GKE através do respetivo endereço IP privado. Os clientes, como kubectl, só podem comunicar com o plano de controlo se forem executados numa instância que tenha acesso à rede VPC e esteja numa rede autorizada.

Se quiser usar o Cloud Build para implementar a sua aplicação neste cluster do GKE privado, tem de usar pools privadas do Cloud Build para aceder aos clusters do GKE. Os pools privados são um conjunto de instâncias de trabalho que são executadas num Google Cloud projeto pertencente à Google e que têm intercâmbio com a sua rede VPC através de uma ligação de intercâmbio de redes VPC. Nesta configuração, as instâncias de trabalho podem comunicar com o endereço IP privado do plano de controlo do cluster do GKE.

No entanto, o plano de controlo do cluster do GKE também é executado num projeto pertencente à Google e liga-se à sua rede VPC através do Private Service Connect (PSC). O VPC Network Peering não suporta o peering transitivo, pelo que não é possível encaminhar pacotes diretamente entre o pool privado do Cloud Build e o plano de controlo do cluster do GKE.

Para permitir que as instâncias de worker do Cloud Build acedam ao plano de controlo do cluster do GKE, pode estabelecer uma relação de interconexão com o pool privado e usar o PSC para ligar o plano de controlo do cluster do GKE a duas redes VPC que lhe pertencem e, em seguida, ligar estas duas redes VPC através do Cloud VPN. Esta interligação e ligação permitem que cada lado do túnel de VPC anuncie as redes privadas do pool e do plano de controlo do cluster do GKE, o que conclui o trajeto.

O diagrama de arquitetura seguinte mostra os recursos usados neste tutorial:

Túnel de VPN que conclui o trajeto entre o pool privado do Cloud Build e o plano de controlo do cluster do GKE.

Recomendamos que crie todos os recursos usados neste tutorial na mesma Google Cloud região para ter uma latência baixa. O túnel VPN pode atravessar duas regiões diferentes se esta comunicação entre regiões for necessária para a sua própria implementação. As duas redes VPC que detém também podem pertencer a projetos diferentes.

Objetivos

  • Crie um cluster do GKE privado.
  • Configure um conjunto privado do Cloud Build.
  • Crie uma ligação de VPN de alta disponibilidade entre duas redes da VPC.
  • Ativar o encaminhamento de pacotes em duas interligações de redes VPC e uma ligação VPC.

Custos

Neste documento, usa os seguintes componentes faturáveis do Google Cloud:

Para gerar uma estimativa de custos com base na sua utilização projetada, use a calculadora de preços.

Os novos Google Cloud utilizadores podem ser elegíveis para uma avaliação gratuita.

Quando terminar as tarefas descritas neste documento, pode evitar a faturação contínua eliminando os recursos que criou. Para mais informações, consulte o artigo Limpe.

Antes de começar

  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

    Criar duas redes VPC no seu próprio projeto

    Nesta secção, cria duas redes VPC e uma sub-rede para os nós do cluster do GKE.

    1. No Cloud Shell, crie a primeira rede VPC (denominada "Rede VPC de intercâmbio de pool privado" no diagrama anterior). Não precisa de criar sub-redes nesta rede.

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

      Substitua PRIVATE_POOL_PEERING_VPC_NAME pelo nome da sua rede VPC a ser interligada com a rede do pool privado do Cloud Build.

    2. Crie a segunda rede VPC (denominada "GKE cluster VPC network" no diagrama anterior):

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

      Substitua GKE_CLUSTER_VPC_NAME pelo nome da sua rede VPC para estabelecer peering com o plano de controlo do cluster do GKE.

    3. Crie uma sub-rede para os nós do cluster do GKE:

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

      Substitua o seguinte:

      • GKE_SUBNET_NAME: o nome da sub-rede que se destina a alojar os nós do cluster do GKE.
      • GKE_CLUSTER_VPC_NAME: o nome da sua rede VPC para estabelecer ligação ao plano de controlo do cluster do GKE.
      • GKE_SUBNET_RANGE: o intervalo de endereços IP de GKE_SUBNET_NAME. Para este tutorial, pode usar 10.244.252.0/22.
      • REGION: a Google Cloud região que aloja o cluster do GKE. Para este tutorial, pode usar us-central1.

    Configurou duas redes VPC no seu próprio projeto e estão prontas para o intercâmbio com outros serviços.

    Criar um cluster do GKE privado

    Nesta secção, cria o cluster privado do GKE.

    1. No Cloud Shell, crie um cluster do GKE sem acesso de cliente ao ponto final público do plano de controlo.

      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
      

      Substitua o seguinte:

      • PRIVATE_CLUSTER_NAME: o nome do cluster do GKE privado.
      • REGION: a região do cluster do GKE. Neste tutorial, use us-central1 para a região, a mesma região que usou para as redes VPC.
      • GKE_CLUSTER_VPC_NAME: o nome da sua rede VPC para estabelecer ligação ao plano de controlo do cluster do GKE.
      • GKE_SUBNET_RANGE: o intervalo de endereços IP de GKE_SUBNET_NAME. Para este tutorial, pode usar 10.244.252.0/22.
      • CLUSTER_CONTROL_PLANE_CIDR: o intervalo de endereços IP do plano de controlo do cluster do GKE. Tem de ter o prefixo /28. Para este tutorial, use 172.16.0.32/28.

      Criou um cluster do GKE privado.

    Configure o intercâmbio da rede da VPC para o GKE 1.28 e versões inferiores

    Se estiver a usar este tutorial para configurar um cluster existente com a versão 1.28 ou anterior do GKE, a sua rede VPC privada usa o peering de redes VPC para se ligar ao cluster do GKE. Conclua os seguintes passos:

    1. Recupere o nome do VPC Network Peering do cluster do GKE. Esta interligação de redes VPC foi criada automaticamente quando criou o cluster do GKE.

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

      Substitua o seguinte:

      • PRIVATE_CLUSTER_NAME: o nome do cluster do GKE privado.
      • REGION: a região do cluster do GKE. Neste tutorial, use us-central1 para a região, a mesma região que usou para as redes VPC.
    2. Ative a exportação de encaminhamentos personalizados para anunciar a rede do pool privado ao plano de controlo do cluster do GKE:

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

      Substitua GKE_CLUSTER_VPC_NAME pelo nome da sua rede VPC para estabelecer ligação ao plano de controlo do cluster do GKE.

      Para mais informações sobre rotas personalizadas, pode ler o artigo Importar e exportar rotas personalizadas.

    Criar um grupo privado do Cloud Build

    Nesta secção, cria o pool privado do Cloud Build.

    1. No Cloud Shell, atribua um intervalo de endereços IP com nome na rede VPC para o conjunto privado do Cloud Build:PRIVATE_POOL_PEERING_VPC_NAME

      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
      

      Substitua o seguinte:

      • RESERVED_RANGE_NAME: o nome do intervalo de endereços IP privados que aloja o pool privado do Cloud Build.
      • PRIVATE_POOL_NETWORK: o primeiro endereço IP de RESERVED_RANGE_NAME. Para este tutorial, pode usar 192.168.0.0.
      • PRIVATE_POOL_PREFIX: o prefixo de RESERVED_RANGE_NAME. Cada conjunto privado criado usa /24 deste intervalo. Para este tutorial, pode usar 20; isto permite-lhe criar até dezasseis conjuntos.
      • PRIVATE_POOL_PEERING_VPC_NAME: o nome da sua rede VPC a ser interligada com a rede privada do pool do Cloud Build.
      • O intervalo de IP é global porque quando --purpose é VPC_PEERING, o intervalo de endereços IP com nome tem de ser global.
    2. Crie uma ligação privada entre a rede VPC que contém o pool privado do Cloud Build e PRIVATE_POOL_PEERING_VPC_NAME:

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

      Substitua o seguinte:

      • RESERVED_RANGE_NAME: o nome do intervalo de endereços IP privados que aloja o pool privado do Cloud Build.
      • PRIVATE_POOL_PEERING_VPC_NAME: o nome da sua rede VPC a ser interligada com a rede privada do pool do Cloud Build.
    3. Ative a exportação de encaminhamentos personalizados para anunciar a rede do plano de controlo do cluster do GKE ao pool 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
      

      Substitua PRIVATE_POOL_PEERING_VPC_NAME pelo nome da rede VPC a ser interligada com a rede privada do pool do Cloud Build.

    4. Crie um grupo privado do Cloud Build com peering com 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
      

      Substitua o seguinte:

      • PRIVATE_POOL_NAME: o nome do conjunto privado do Cloud Build.
      • REGION: a região do cluster do GKE. Neste tutorial, use us-central1 para a região, a mesma região que usou para as redes VPC.

    Criou um conjunto privado do Cloud Build e estabeleceu um intercâmbio com a rede VPC no seu próprio projeto.

    Criar uma ligação Cloud VPN entre as duas redes VPC

    No seu próprio projeto, tem agora uma rede VPC com intercâmbio com o pool privado do Cloud Build e uma segunda rede VPC com intercâmbio com o cluster privado do GKE.

    Nesta secção, cria uma ligação do Cloud VPN entre as duas redes da VPC no seu projeto. Esta ligação conclui a rota e permite que os pools privados do Cloud Build acedam ao cluster do GKE.

    1. No Cloud Shell, crie dois gateways de VPN de alta disponibilidade que se ligam entre si. Para criar estes gateways, siga as instruções em Criar dois gateways de VPN de HA totalmente configurados que se ligam entre si. A configuração fica concluída depois de criar as sessões BGP. Ao seguir estas instruções, use os seguintes valores:

      • PRIVATE_POOL_PEERING_VPC_NAME para NETWORK_1
      • GKE_CLUSTER_VPC_NAME para NETWORK_2
      • REGION para REGION_1 e REGION_2
    2. Configure cada uma das quatro sessões BGP que criou para anunciar as rotas à rede VPC do conjunto privado e à rede VPC do plano de controlo do cluster do 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
      

      Em que os seguintes valores são os mesmos nomes que usou quando criou os dois gateways de VPN de alta disponibilidade:

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

    Ativar o acesso do Cloud Build ao plano de controlo do cluster do GKE

    Agora que tem uma ligação VPN entre as duas redes VPC no seu projeto, ative o acesso do Cloud Build ao plano de controlo do cluster do GKE.

    1. No Cloud Shell, adicione o intervalo de rede do pool privado às redes autorizadas do plano de controlo no GKE:

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

      Substitua o seguinte:

      • PRIVATE_CLUSTER_NAME: o nome do cluster do GKE privado.
      • REGION: a região do cluster do GKE. Neste tutorial, use us-central1 para a região, a mesma região que usou para as redes VPC.
      • PRIVATE_POOL_NETWORK: o primeiro endereço IP de RESERVED_RANGE_NAME. Para este tutorial, pode usar 192.168.0.0.
      • PRIVATE_POOL_PREFIX: o prefixo de RESERVED_RANGE_NAME. Cada conjunto privado criado usa /24 deste intervalo. Para este tutorial, pode usar 20; isto permite-lhe criar até dezasseis conjuntos.
    2. Permita que a conta de serviço que está a usar para a compilação aceda ao plano de controlo do cluster do 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
      

    As pools privadas do Cloud Build podem agora aceder ao plano de controlo do cluster do GKE.

    Validar a solução

    Nesta secção, verifica se a solução está a funcionar executando o comando kubectl get nodes num passo de compilação que está a ser executado no conjunto privado.

    1. No Cloud Shell, crie uma pasta temporária com um ficheiro de configuração do Cloud Build que execute o 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
      

      Substitua o seguinte:

      • REGION: a região do cluster do GKE. Neste tutorial, use us-central1 para a região, a mesma região que usou para as redes VPC.
      • PRIVATE_CLUSTER_NAME: o nome do cluster do GKE privado.
      • PRIVATE_POOL_NAME: o nome do conjunto privado do Cloud Build.
    2. Inicie a tarefa de compilação:

      gcloud builds submit --config=cloudbuild.yaml
      
    3. Verifique se a saída é a lista de nós no cluster do GKE. O registo de compilação apresentado na consola inclui uma tabela semelhante 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
      

    Já validou que os trabalhadores do grupo privado podem aceder ao cluster do GKE. Este acesso permite-lhe usar o Cloud Build para implementar a sua aplicação neste cluster privado do GKE.

    Resolução de problemas

    Se encontrar problemas com este tutorial, consulte os seguintes documentos:

    Limpar

    Para evitar incorrer em custos na sua conta do Google Cloud pelos recursos usados neste tutorial, elimine o projeto que contém os recursos ou mantenha o projeto e elimine os recursos individuais.

    Elimine o projeto

    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.

    Elimine os recursos individuais

    1. No Cloud Shell, elimine o cluster do GKE:

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

      Quando executa este comando, o peering de redes VPC é eliminado automaticamente.

    2. Elimine o grupo privado do Cloud Build:

      gcloud builds worker-pools delete PRIVATE_POOL_NAME \
          --region=REGION
      
    3. Elimine a ligação privada entre a rede VPC do produtor de serviços e PRIVATE_POOL_PEERING_VPC_NAME:

      gcloud services vpc-peerings delete \
         --network=PRIVATE_POOL_PEERING_VPC_NAME \
         --async
      
    4. Elimine o intervalo de endereços IP com nome usado para o conjunto privado:

      gcloud compute addresses delete RESERVED_RANGE_NAME \
          --global
      
    5. Elimine os quatro túneis de VPN. Use os mesmos nomes que especificou em Criar túneis de 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. Elimine os dois routers na nuvem. Use os mesmos nomes que especificou em Criar routers do Cloud Router.

      gcloud compute routers delete \
          ROUTER_NAME_1 \
          ROUTER_NAME_2 \
          --region=REGION
      
    7. Elimine os dois gateways de VPN. Use os mesmos nomes que especificou em Crie os gateways de VPN de HA.

      gcloud compute vpn-gateways delete \
          GW_NAME_1 \
          GW_NAME_2 \
          --region=REGION
      
    8. Elimine GKE_SUBNET_NAME, que é a sub-rede que aloja os nós do cluster do GKE:

      gcloud compute networks subnets delete GKE_SUBNET_NAME \
          --region=REGION
      
    9. Elimine as duas redes de VPC PRIVATE_POOL_PEERING_VPC_NAME e GKE_CLUSTER_VPC_NAME:

      gcloud compute networks delete \
          PRIVATE_POOL_PEERING_VPC_NAME \
          GKE_CLUSTER_VPC_NAME
      

    O que se segue?