Ricevere eventi Pub/Sub in un endpoint HTTP privato in un cluster GKE privato


Questo tutorial mostra come creare un endpoint HTTP privato in un cluster Google Kubernetes Engine (GKE) privato che riceve eventi di messaggi Pub/Sub utilizzando Eventarc. Per scoprire di più su questa destinazione eventi, consulta Indirizzare gli eventi a un endpoint HTTP interno in una rete VPC.

I cluster GKE privati sono un tipo di cluster nativo di Virtual Private Cloud (VPC) in cui i nodi hanno solo indirizzi IP interni, il che significa che i nodi e i pod sono isolati da internet per impostazione predefinita. Puoi scegliere di non avere accesso client, accesso limitato o accesso illimitato al piano di controllo. Non puoi convertire un cluster esistente non privato in un cluster privato. Per ulteriori informazioni, consulta Informazioni sui cluster privati.

Puoi eseguire i seguenti comandi utilizzando Google Cloud CLI nel terminale o in Cloud Shell.

Obiettivi

In questo tutorial, imparerai a:

  1. Crea una subnet solo proxy nella rete VPC predefinita e crea una regola firewall VPC.
  2. Crea un cluster GKE Autopilot privato senza accesso client all'endpoint pubblico.
  3. Crea un'istanza di macchina virtuale (VM) Compute Engine in una subnet specificata della rete VPC.
  4. Stabilisci una connessione SSH all'istanza VM e implementa un servizio di ricezione eventi sull'istanza VM.
  5. Esegui il deployment di un gateway nel cluster e di un manifest HTTPRoute per configurare il routing del traffico in Kubernetes ai backend delle applicazioni.
  6. Crea un collegamento di rete che consenta a una rete VPC producer di avviare connessioni a una rete VPC consumer.
  7. Crea un trigger Eventarc che indirizza gli eventi Pub/Sub al ricevitore eventi sull'istanza VM.
  8. Pubblica un messaggio in un argomento Pub/Sub per generare un evento e visualizza il corpo dell'evento nei log del pod dell'applicazione.

Costi

In questo documento vengono utilizzati i seguenti componenti fatturabili di Google Cloud:

Per generare una stima dei costi in base all'utilizzo previsto, utilizza il calcolatore prezzi.

I nuovi utenti di Google Cloud potrebbero avere diritto a una prova senza costi.

Al termine delle attività descritte in questo documento, puoi evitare l'addebito di ulteriori costi eliminando le risorse che hai creato. Per ulteriori informazioni, vedi Pulizia.

Prima di iniziare

  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. Install the Google Cloud CLI.

  3. Se utilizzi un provider di identità (IdP) esterno, devi prima accedere a gcloud CLI con la tua identità federata.

  4. Per inizializzare gcloud CLI, esegui questo comando:

    gcloud init
  5. Create or select 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.
    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

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

  7. Enable the Cloud Resource Manager, Compute Engine, Eventarc, GKE, and Pub/Sub 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.

    gcloud services enable compute.googleapis.com container.googleapis.com cloudresourcemanager.googleapis.com eventarc.googleapis.com pubsub.googleapis.com
  8. Install the Google Cloud CLI.

  9. Se utilizzi un provider di identità (IdP) esterno, devi prima accedere a gcloud CLI con la tua identità federata.

  10. Per inizializzare gcloud CLI, esegui questo comando:

    gcloud init
  11. Create or select 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.
    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

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

  13. Enable the Cloud Resource Manager, Compute Engine, Eventarc, GKE, and Pub/Sub 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.

    gcloud services enable compute.googleapis.com container.googleapis.com cloudresourcemanager.googleapis.com eventarc.googleapis.com pubsub.googleapis.com
  14. Aggiorna i componenti di Google Cloud CLI:
    gcloud components update
  15. Accedi utilizzando il tuo account:
    gcloud auth login
  16. Se hai creato il progetto, ti viene assegnato il ruolo di base Proprietario (roles/owner). Per impostazione predefinita, questo ruolo IAM include le autorizzazioni necessarie per l'accesso completo alla maggior parte delle risorse Google Cloud e puoi saltare questo passaggio.

    Se non sei il creatore del progetto, le autorizzazioni richieste devono essere concesse al principal appropriato. Ad esempio, un'entità può essere un Account Google (per gli utenti finali) o un account di servizio (per applicazioni e carichi di lavoro di calcolo). Per saperne di più, consulta la pagina Ruoli e autorizzazioni per la destinazione eventi.

    Autorizzazioni obbligatorie

    Per ottenere le autorizzazioni necessarie per completare questa guida rapida, chiedi all'amministratore di concederti i seguenti ruoli IAM nel tuo progetto:

    Per ulteriori informazioni sulla concessione dei ruoli, consulta Gestisci l'accesso a progetti, cartelle e organizzazioni.

    Potresti anche riuscire a ottenere le autorizzazioni richieste tramite i ruoli personalizzati o altri ruoli predefiniti.

  17. Prendi nota dell'Account di servizio predefinito di Compute Engine, in quanto lo collegherai a un trigger Eventarc per rappresentare l'identità del trigger a scopo di test. Questo account di servizio viene creato automaticamente dopo l'attivazione o l'utilizzo di un servizio Google Cloud che utilizza Compute Engine e con il seguente formato email:

    PROJECT_NUMBER-compute@developer.gserviceaccount.com

    Sostituisci PROJECT_NUMBER con il numero del tuo progetto Google Cloud. Puoi trovare il numero di progetto nella pagina Benvenuto della console Google Cloud o eseguendo questo comando:

    gcloud projects describe PROJECT_ID --format='value(projectNumber)'

    Per gli ambienti di produzione, ti consigliamo vivamente di creare un nuovo service account e di concedergli uno o più ruoli IAM che contengano le autorizzazioni minime richieste e di seguire il principio del privilegio minimo.

  18. Se hai attivato l'agente di servizio Cloud Pub/Sub l'8 aprile 2021 o in una data precedente, per supportare le richieste push Pub/Sub autenticate, concedi il ruolo Creatore token account di servizio (roles/iam.serviceAccountTokenCreator) all'agente di servizio. In caso contrario, questo ruolo viene concesso per impostazione predefinita:
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \
        --role=roles/iam.serviceAccountTokenCreator
  19. Crea una subnet solo proxy

    A meno che tu non crei una policy dell'organizzazione che lo vieti, i nuovi progetti iniziano con una rete predefinita (una rete VPC in modalità automatica) che ha una subnet in ogni regione. Ogni rete VPC è composta da uno o più intervalli di indirizzi IP chiamati subnet. Le subnet sono risorse regionali a cui sono associati intervalli di indirizzi IP.

    1. Utilizza il comando gcloud compute networks subnets create per creare una subnet solo proxy nella rete predefinita.

      gcloud compute networks subnets create proxy-only-subnet \
          --purpose=REGIONAL_MANAGED_PROXY \
          --role=ACTIVE \
          --region=us-central1 \
          --network=default \
          --range=10.10.10.0/24
      

      Tieni presente che una subnet con purpose=REGIONAL_MANAGED_PROXY è riservata ai bilanciatori del carico basati su Envoy e che range deve fornire almeno 64 indirizzi IP.

    2. Crea una regola firewall che corrisponda all'intervallo della subnet solo proxy e che consenta il traffico sulla porta TCP 8080.

      gcloud compute firewall-rules create allow-proxy-connection \
          --allow tcp:8080 \
          --source-ranges 10.10.10.0/24 \
          --network=default
      

    Crea un cluster GKE privato

    Utilizza il comando gcloud container clusters create-auto per creare un cluster GKE privato in modalità Autopilot con nodi privati e senza accesso client all'endpoint pubblico.

    L'esempio seguente crea un cluster GKE privato denominato private-cluster e anche una subnet denominata my-subnet:

    gcloud container clusters create-auto private-cluster \
        --create-subnetwork name=my-subnet \
        --enable-master-authorized-networks \
        --enable-private-nodes \
        --enable-private-endpoint \
        --region=us-central1
    

    Tieni presente quanto segue:

    • --enable-master-authorized-networks specifica che l'accesso all'endpoint pubblico è limitato agli intervalli di indirizzi IP che autorizzi.
    • --enable-private-nodes indica che i nodi del cluster non hanno indirizzi IP esterni.
    • --enable-private-endpoint indica che il cluster è gestito utilizzando l'indirizzo IP interno dell'endpoint API del control plane.

    Il processo di creazione del cluster potrebbe richiedere alcuni minuti. Una volta creato il cluster, l'output dovrebbe indicare che lo stato del cluster è RUNNING.

    Crea un'istanza VM in una subnet specificata

    Un'istanza VM di Compute Engine è una macchina virtuale ospitata sull'infrastruttura di Google. I termini istanza Compute Engine, istanza VM e VM sono sinonimi e vengono utilizzati in modo intercambiabile. Le istanze VM includono cluster GKE, istanze dell'ambiente flessibile App Engine e altri prodotti Google Cloud basati su VM di Compute Engine.

    Utilizza il comando gcloud compute instances create per creare un'istanza VM di Compute Engine nella subnet che hai creato in precedenza. Collega un account di servizio e imposta l'ambito di accesso della VM su cloud-platform.

    gcloud compute instances create my-vm \
        --service-account=PROJECT_NUMBER-compute@developer.gserviceaccount.com \
        --scopes=https://www.googleapis.com/auth/cloud-platform \
        --zone=us-central1-a \
        --subnet=my-subnet
    

    Per saperne di più, consulta Crea e avvia un'istanza VM.

    Esegui il deployment di un ricevitore di eventi sulla VM

    Utilizzando un'immagine predefinita, us-docker.pkg.dev/cloudrun/container/hello, esegui il deployment di un servizio sulla tua VM che ascolta sulla porta 80 e che riceve e registra gli eventi.

    1. Stabilisci una connessione SSH alla tua istanza VM eseguendo questo comando:

      gcloud compute ssh my-vm --project=PROJECT_ID --zone=us-central1-a
      

      Una volta stabilita la connessione al server SSH, esegui i comandi rimanenti sull'istanza VM.

    2. Se necessario, installa kubectl e tutti i plug-in richiesti.

    3. Dall'istanza VM, utilizza il comando get-credentials per consentire a kubectl di funzionare con il cluster che hai creato.

      gcloud container clusters get-credentials private-cluster \
          --region=us-central1 \
          --internal-ip
      
    4. Utilizza un comando Kubernetes, kubectl create deployment, per eseguire il deployment di un'applicazione nel cluster.

      kubectl create deployment hello-app \
          --image=us-docker.pkg.dev/cloudrun/container/hello
      

      Viene creato un deployment denominato hello-app. Il pod del deployment esegue l'immagine container hello.

    5. Dopo aver eseguito il deployment dell'applicazione, puoi esporla al traffico creando un servizio Kubernetes. Esegui questo comando kubectl expose:

      kubectl expose deployment hello-app \
          --type ClusterIP \
          --port 80 \
          --target-port 8080
      

      Dovresti vedere service/hello-app exposed nell'output.

      Puoi ignorare eventuali messaggi simili al seguente:

      E0418 14:15:33.970933    1129 memcache.go:287] couldn't get resource list for metrics.k8s.io/v1beta1: the server is currently unable to handle the request
      

    Configura il routing del traffico Kubernetes

    Una risorsa Gateway rappresenta un piano dati che instrada il traffico in Kubernetes. Un gateway può rappresentare molti tipi diversi di bilanciamento del carico e routing a seconda della GatewayClass da cui deriva. Per saperne di più, consulta la sezione Deployment dei gateway. Un manifest HTTPRoute viene deployment per creare route e inviare traffico ai backend delle applicazioni.

    1. Esegui il deployment di un gateway nel cluster.

      kubectl apply -f - <<EOF
      kind: Gateway
      apiVersion: gateway.networking.k8s.io/v1beta1
      metadata:
        name: internal-http
      spec:
        gatewayClassName: gke-l7-rilb
        listeners:
        - name: http
          protocol: HTTP
          port: 80
      EOF
      

      Tieni presente quanto segue:

      • gatewayClassName: gke-l7-rilb specifica la classe Gateway da cui deriva questo gateway. gke-l7-rilb corrisponde al bilanciatore del carico delle applicazioni interno.
      • port: 80 specifica che il gateway espone solo la porta 80 per l'ascolto del traffico HTTP.
    2. Verifica che il gateway sia stato implementato correttamente. Potrebbero essere necessari alcuni minuti prima che vengano implementate tutte le risorse.

      kubectl describe gateways.gateway.networking.k8s.io internal-http
      

      L'output è simile al seguente:

      Name:         internal-http
      Namespace:    default
      ...
      API Version:  gateway.networking.k8s.io/v1beta1
      Kind:         Gateway
      ...
      Spec:
        Gateway Class Name:  gke-l7-rilb
        Listeners:
          Allowed Routes:
            Namespaces:
              From:  Same
          Name:      http
          Port:      80
          Protocol:  HTTP
      Status:
        Addresses:
          Type:   IPAddress
          Value:  10.36.172.5
      ...
      Events:
        Type    Reason  Age                From                   Message
        ----    ------  ----               ----                   -------
        Normal  ADD     80s                sc-gateway-controller  default/internal-http
        Normal  UPDATE  20s (x3 over 80s)  sc-gateway-controller  default/internal-http
        Normal  SYNC    20s                sc-gateway-controller  SYNC on default/internal-http was a success
      
    3. Esegui il deployment di un manifest HTTPRoute per instradare il traffico HTTP al servizio hello-app sulla porta 80.

      kubectl apply -f - <<EOF
      kind: HTTPRoute
      apiVersion: gateway.networking.k8s.io/v1beta1
      metadata:
        name: hello-app-route
      spec:
        parentRefs:
        - kind: Gateway
          name: internal-http
        rules:
        - backendRefs:
          - name: hello-app
            port: 80
      EOF
      

    Crea un collegamento di rete

    Un collegamento di rete è una risorsa che consente a una rete VPC producer di avviare connessioni a una rete VPC consumer tramite un'interfaccia Private Service Connect.

    Per pubblicare eventi, Eventarc utilizza il collegamento di rete per stabilire una connessione all'endpoint HTTP interno ospitato in una rete VPC.

    Puoi creare un collegamento di rete che accetta automaticamente le connessioni da qualsiasi interfaccia Private Service Connect che fa riferimento al collegamento di rete. Crea il collegamento di rete nella stessa rete e regione contenente il servizio di destinazione HTTP.

    gcloud compute network-attachments create my-network-attachment \
        --region=us-central1 \
        --subnets=my-subnet\
        --connection-preference=ACCEPT_AUTOMATIC

    Per saperne di più, consulta Informazioni sui collegamenti di rete.

    Crea un trigger Eventarc

    Crea un trigger Eventarc che crea un nuovo argomento Pub/Sub e indirizza gli eventi al ricevitore di eventi di cui è stato eseguito il deployment sulla VM quando viene pubblicato un messaggio nell'argomento Pub/Sub.

    1. Recupera l'indirizzo del gateway.

      GATEWAY_ADDRESS=$(kubectl get gateways.gateway.networking.k8s.io internal-http -o=jsonpath="{.status.addresses[0].value}")
      
    2. Crea un trigger.

      gcloud eventarc triggers create my-trigger \
          --location=us-central1 \
          --destination-http-endpoint-uri="http://$GATEWAY_ADDRESS:80/" \
          --network-attachment="projects/PROJECT_ID/regions/us-central1/networkAttachments/my-network-attachment" \
          --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
          --service-account=PROJECT_NUMBER-compute@developer.gserviceaccount.com
      

      Sostituisci PROJECT_NUMBER con il numero del tuo progetto Google Cloud. Puoi trovare il numero di progetto nella pagina Benvenuto della console Google Cloud o eseguendo questo comando:

      gcloud projects describe PROJECT_ID --format='value(projectNumber)'
      

    Per ulteriori informazioni sulla configurazione del trigger, consulta Instradare gli eventi a un endpoint HTTP interno in una rete VPC.

    Generare e visualizzare un evento dell'argomento Pub/Sub

    Puoi generare un evento pubblicando un messaggio in un argomento Pub/Sub.

    1. Trova e imposta l'argomento Pub/Sub come variabile di ambiente.

      export MY_TOPIC=$(gcloud eventarc triggers describe my-trigger \
          --location=us-central1 \
          --format='value(transport.pubsub.topic)')
      
    2. Pubblica un messaggio nell'argomento Pub/Sub per generare un evento.

      gcloud pubsub topics publish $MY_TOPIC --message "Hello World"
      

      Il trigger Eventarc indirizza l'evento all'endpoint HTTP interno nel cluster GKE privato.

    3. Controlla i log dei pod dell'applicazione e verifica la distribuzione degli eventi.

      POD_NAME=$(kubectl get pod --selector app=hello-app --output=name)
      kubectl logs $POD_NAME
      

      Il corpo dell'evento dovrebbe essere simile al seguente:

      2024/04/18 20:31:43 Hello from Cloud Run! The container started successfully and is listening for HTTP requests on $PORT
      {"severity":"INFO","eventType":"google.cloud.pubsub.topic.v1.messagePublished","message":"Received event of type google.cloud.pubsub.topic.v1.messagePublished.
      Event data: Hello World","event":{"specversion":"1.0","id":"10935738681111260","source":"//pubsub.googleapis.com/projects/my-project/topics/eventarc-us-central1-my-trigger-224","type":"google.cloud.pubsub.topic.v1.messagePublished","datacontenttype":"application/json","time":"2024-04-18T20:40:03Z","data":
      {"message":{"data":"SGVsbG8gV29ybGQ=","messageId":"10935738681111260","publishTime":"2024-04-18T20:40:03Z"}}}}
      

    Hai eseguito correttamente il deployment di un servizio di ricezione eventi in un endpoint HTTP interno in un cluster GKE privato, hai creato un trigger Eventarc, hai generato un evento da Pub/Sub e hai verificato che l'evento sia stato indirizzato come previsto dal trigger all'endpoint di destinazione.

    Esegui la pulizia

    Per evitare che al tuo Account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, elimina il progetto che contiene le risorse oppure mantieni il progetto ed elimina le singole risorse.

    Elimina il progetto

      Delete a Google Cloud project:

      gcloud projects delete PROJECT_ID

    Elimina singole risorse

    1. Elimina il trigger Eventarc:
        gcloud eventarc triggers delete my-trigger --location=us-central1
    2. Esci dalla VM ed elimina l'istanza VM:
        gcloud compute instances delete my-vm --zone=us-central1-a
    3. Elimina il collegamento di rete:
        gcloud compute network-attachments delete my-network-attachment --region=us-central1
    4. Elimina la regola firewall:
        gcloud compute firewall-rules delete allow-proxy-connection
    5. Elimina il cluster:
        gcloud container clusters delete private-cluster --region=us-central1
        
    6. Delete the subnet:
        gcloud compute networks subnets delete proxy-only-subnet --region=us-central1

    Passaggi successivi