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 evento, consulta Indirizzare gli eventi a un endpoint HTTP interno in una rete VPC.
I cluster GKE privati sono un tipo di cluster nativo 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 al client, accesso limitato o accesso senza restrizioni al piano di controllo. Non puoi convertire un cluster non privato esistente in un cluster privato. Per scoprire di più, 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:
- Crea una subnet solo proxy nella rete VPC predefinita e crea una regola firewall VPC.
- Crea un cluster GKE Autopilot privato senza accesso dei client all'endpoint pubblico.
- Crea un'istanza di una macchina virtuale (VM) Compute Engine in una sottorete specificata della rete VPC.
- Stabilisci una connessione SSH all'istanza VM ed esegui il deployment di un servizio di ricezione eventi sull'istanza VM.
- Esegui il deployment di un gateway nel cluster e di un manifest
HTTPRoute
per configurare l'instradamento del traffico in Kubernetes ai backend dell'applicazione. - Crea un collegamento di rete che consenta a una rete VPC producer di avviare connessioni a una rete VPC consumer.
- Crea un trigger Eventarc che indirizzi gli eventi Pub/Sub al ricevitore eventi nell'istanza VM.
- 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 utilizzi i seguenti componenti fatturabili di Google Cloud:
Per generare una stima dei costi in base all'utilizzo previsto,
utilizza il Calcolatore prezzi.
Al termine delle attività descritte in questo documento, puoi evitare la fatturazione continua eliminando le risorse che hai creato. Per ulteriori informazioni, consulta la sezione Pulizia.
Prima di iniziare
- 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.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
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.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Resource Manager, Compute Engine, Eventarc, GKE, and Pub/Sub APIs:
gcloud services enable compute.googleapis.com
container.googleapis.com cloudresourcemanager.googleapis.com eventarc.googleapis.com pubsub.googleapis.com - Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
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.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Resource Manager, Compute Engine, Eventarc, GKE, and Pub/Sub APIs:
gcloud services enable compute.googleapis.com
container.googleapis.com cloudresourcemanager.googleapis.com eventarc.googleapis.com pubsub.googleapis.com - Aggiorna i componenti di Google Cloud CLI:
gcloud components update
- Accedi utilizzando il tuo account:
gcloud auth login
-
Se sei il creator del progetto, ti viene assegnato il ruolo di proprietario di base (
roles/owner
). Per impostazione predefinita, questo ruolo Identity and Access Management (IAM) include le autorizzazioni necessarie per l'accesso completo alla maggior parte delle risorse e puoi saltare questo passaggio. Google CloudSe non sei il creator del progetto, le autorizzazioni richieste devono essere concesse al principale appropriato. Ad esempio, un'entità può essere un Account Google (per gli utenti finali) o un account di servizio (per le applicazioni e i carichi di lavoro di calcolo). Per ulteriori informazioni, consulta la pagina Ruoli e autorizzazioni relativa alla destinazione dell'evento.
Autorizzazioni obbligatorie
Per ottenere le autorizzazioni necessarie per completare questa guida introduttiva, chiedi all'amministratore di concederti i seguenti ruoli IAM nel progetto:
-
Amministratore rete Compute (
roles/compute.networkAdmin
) -
Amministratore della sicurezza di Compute (
roles/compute.securityAdmin
) -
Eventarc Admin (
roles/eventarc.admin
) -
Kubernetes Engine Admin (
roles/container.admin
) -
Logs View Accessor (
roles/logging.viewAccessor
) -
Amministratore IAM del progetto (
roles/resourcemanager.projectIamAdmin
) -
Publisher Pub/Sub (
roles/pubsub.publisher
) -
Amministratore account di servizio (
roles/iam.serviceAccountAdmin
) -
Utente account di servizio (
roles/iam.serviceAccountUser
) -
Amministratore utilizzo servizio (
roles/serviceusage.serviceUsageAdmin
)
Per saperne di più sulla concessione dei ruoli, consulta Gestire l'accesso a progetti, cartelle e organizzazioni.
Potresti anche riuscire a ottenere le autorizzazioni richieste tramite i ruoli personalizzati o altri ruoli predefiniti.
-
Amministratore rete Compute (
Prendi nota dell'account di servizio predefinito di Compute Engine, poiché lo collegherai a un trigger Eventarc per rappresentare l'identità dell'trigger a fini di test. Questo account di servizio viene creato automaticamente dopo aver attivato o utilizzato un Google Cloud servizio che utilizza Compute Engine e con il seguente formato email:
PROJECT_NUMBER-compute@developer.gserviceaccount.com
Sostituisci
PROJECT_NUMBER
con il numero Google Cloud del tuo progetto. Puoi trovare il numero del progetto nella pagina Welcome della console Google Cloud o eseguendo il seguente comando:gcloud projects describe PROJECT_ID --format='value(projectNumber)'
Per gli ambienti di produzione, ti consigliamo vivamente di creare un nuovo account di servizio e di assegnargli uno o più ruoli IAM contenenti le autorizzazioni minime richieste e di seguire il principio del privilegio minimo.
- Se hai attivato l'agente di servizio Cloud Pub/Sub il giorno 8 aprile 2021 o in una data precedente per supportare le richieste push Pub/Sub autenticate, concedi all'agente di servizio il ruolo Creatore token account di servizio (
roles/iam.serviceAccountTokenCreator
). 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
Creare una subnet solo proxy
A meno che non crei un criterio dell'organizzazione che lo vieti, i nuovi progetti iniziano con una rete predefinita (una rete VPC in modalità automatica) con una sottorete 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.
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 cherange
deve fornire almeno 64 indirizzi IP.Crea una regola firewall che corrisponda all'intervallo della sottorete 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.
Il seguente esempio crea un cluster GKE privato denominato
private-cluster
e 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 dell'API del piano di controllo.
La creazione del cluster potrebbe richiedere diversi 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 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 Google Cloud prodotti basati su VM Compute Engine.
Utilizza il comando gcloud compute instances create
per creare un'istanza VM Compute Engine nella sottorete creata 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 ulteriori informazioni, consulta Creare e avviare un'istanza VM.
Esegui il deployment di un ricevitore evento sulla VM
Utilizzando un'immagine predefinita, us-docker.pkg.dev/cloudrun/container/hello
, esegui il deployment di un servizio sulla VM che ascolta sulla porta 80 e riceve e registra gli eventi.
Stabilisci una connessione SSH all'istanza VM eseguendo il seguente comando:
gcloud compute ssh my-vm --project=PROJECT_ID --zone=us-central1-a
Dopo aver stabilito una connessione al server SSH, esegui i comandi rimanenti sull'istanza VM.
Se necessario, installa
kubectl
e gli eventuali plug-in richiesti.Dall'istanza VM, utilizza il comando
get-credentials
per consentire akubectl
di funzionare con il cluster che hai creato.gcloud container clusters get-credentials private-cluster \ --region=us-central1 \ --internal-ip
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 containerhello
.Dopo aver eseguito il deployment dell'applicazione, puoi esporre l'applicazione al traffico creando un servizio Kubernetes. Esegui il seguente
kubectl expose
comando:kubectl expose deployment hello-app \ --type ClusterIP \ --port 80 \ --target-port 8080
Dovresti vedere
service/hello-app exposed
nell'output.Puoi ignorare i 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 classe Gateway da cui è derivato. Per ulteriori informazioni, consulta la sezione Eseguire il deployment dei gateway.
Viene eseguito il deployment di un manifest HTTPRoute
per creare route e inviare traffico ai backend delle applicazioni.
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 è derivato 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.
Verifica che il gateway sia stato implementato correttamente. Potrebbero essere necessari alcuni minuti per il deployment di 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
Esegui il deployment di un manifest
HTTPRoute
per instradare il traffico HTTP al serviziohello-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 accetti 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 nella stessa 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 instrada gli eventi al ricevitore di eventi di cui è stato eseguito il deployment nella VM quando viene pubblicato un messaggio nell'argomento Pub/Sub.
Recupera l'indirizzo del gateway.
GATEWAY_ADDRESS=$(kubectl get gateways.gateway.networking.k8s.io internal-http -o=jsonpath="{.status.addresses[0].value}")
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 Google Cloud del tuo progetto. Puoi trovare il numero del progetto nella pagina Welcome della console Google Cloud o eseguendo il seguente comando:gcloud projects describe PROJECT_ID --format='value(projectNumber)'
Per ulteriori informazioni sulla configurazione dell'attivatore, consulta Indirizzare 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.
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)')
Pubblica un messaggio nell'argomento Pub/Sub per generare un evento.
gcloud pubsub topics publish $MY_TOPIC --message "Hello World"
L'attivatore Eventarc instrada l'evento all'endpoint HTTP interno nel cluster GKE privato.
Controlla i log del pod dell'applicazione e verifica l'invio 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 inoltrato come previsto dall'attivatore 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
- Elimina l'trigger Eventarc:
gcloud eventarc triggers delete my-trigger --location=us-central1
- Esci dalla VM ed elimina l'istanza VM:
gcloud compute instances delete my-vm --zone=us-central1-a
- Elimina il collegamento di rete:
gcloud compute network-attachments delete my-network-attachment --region=us-central1
- Elimina la regola firewall:
gcloud compute firewall-rules delete allow-proxy-connection
- Elimina il cluster:
gcloud container clusters delete private-cluster --region=us-central1
- Delete the subnet:
gcloud compute networks subnets delete proxy-only-subnet --region=us-central1