Instrada il traffico dai workload Cloud Service Mesh ai servizi Cloud Run
L'integrazione di Cloud Run con Cloud Service Mesh ti consente di instradare in modo sicuro il traffico dai workload GKE ai backend serverless. I tuoi servizi Cloud Run non devono essere aggiunti al mesh di servizi per ricevere traffico.
Questa integrazione supporta Cloud Service Mesh con le API Istio e non supporta le APIGoogle Cloud . Mentre questa funzionalità è in anteprima pubblica, il servizio Cloud Run deve risiedere nello stesso progetto Google Cloud del cluster GKE.
Prima di iniziare
Le seguenti sezioni presuppongono che tu disponga di quanto segue:
- Un cluster GKE con Cloud Service Mesh abilitato.
- Hai eseguito il deployment di un servizio Cloud Run.
In alternativa, puoi eseguire questi comandi per eseguire il deployment di un servizio Cloud Run di esempio.
Genera un contesto kubeconfig per il tuo cluster:
gcloud container clusters get-credentials CLUSTER_NAME --project=PROJECT_ID --location=CLUSTER_LOCATIONDove:
- CLUSTER_NAME è il nome del tuo cluster.
- PROJECT_ID è l'ID progetto del tuo progetto.
- CLUSTER_LOCATION è la regione o la zona del tuo cluster.
Esegui il deployment di un servizio Cloud Run di esempio:
gcloud run deploy hello-world \ --image=us-docker.pkg.dev/cloudrun/container/hello \ --no-allow-unauthenticated \ --port=8080 \ --service-account=PROJECT_NUMBER-compute@developer.gserviceaccount.com \ --region=us-central1 \ --project=PROJECT_IDDove:
- PROJECT_NUMBER è il numero del tuo progetto.
- PROJECT_ID è l'ID progetto del tuo progetto.
Configura IAM
Per richiamare i servizi Cloud Run, i controlli di Cloud Run Identity and Access Management (IAM) devono avere esito positivo. Devi concedere il ruolo Cloud Run Invoker al service account Google. Devi anche configurare il service account Kubernetes (KSA) di GKE per assumere l'identità del service account Google.
Per consentire a un service account Kubernetes di assumere l'identità di un service account Google, segui questi passaggi.
Aggiungi un'associazione di policy IAM a un service account IAM:
gcloud iam service-accounts add-iam-policy-binding PROJECT_NUMBER-compute@developer.gserviceaccount.com \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:PROJECT_ID.svc.id.goog[NAMESPACE/KSA]"Dove:
- NAMESPACE è il nome dello spazio dei nomi. Ai fini di questa guida, puoi utilizzare lo spazio dei nomi
default. - KSA è il nome del service account Kubernetes. Ai fini di questa guida, puoi utilizzare l'agente di servizio Kubernetes
default.
- NAMESPACE è il nome dello spazio dei nomi. Ai fini di questa guida, puoi utilizzare lo spazio dei nomi
Annota il account di servizio:
kubectl annotate serviceaccount KSA \ --namespace NAMESPACE \ iam.gke.io/gcp-service-account=PROJECT_NUMBER-compute@developer.gserviceaccount.comConcedi il ruolo Cloud Run Invoker all'account di servizio Google:
gcloud run services add-iam-policy-binding hello-world \ --region=us-central1 \ --member="serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com" \ --role="roles/run.invoker"
Configura un servizio Cloud Run come GCPBackend
In questa sezione, esponi il servizio Cloud Run ai workload GKE utilizzando GCPBackend. GCPBackend è composto da:
- Informazioni sul frontend, in particolare il nome host e la porta che i workload GKE utilizzerebbero per chiamare questo GCPBackend.
- Informazioni sul backend: i dettagli del servizio Cloud Run, come il nome del servizio, la località e il numero del progetto.
GCPBackend contiene i dettagli del nome host e della porta, nonché i dettagli del servizio Cloud (nome del servizio, località e numero di progetto). I workload GKE devono utilizzare il nome host e la porta di GCPBackend nelle richieste HTTP per accedere al servizio Cloud Run.
Per rendere risolvibile il DNS del nome host all'interno del cluster (per impostazione predefinita non è risolvibile), devi configurare il DNS Google Cloud per risolvere tutti gli host con un nome host scelto in un indirizzo IP arbitrario. Finché non configuri questa voce DNS, la richiesta non va a buon fine. La configurazione DNS Google Cloud è una configurazione una tantum per dominio personalizzato.
Crea una zona gestita:
gcloud dns managed-zones create prod \ --description="zone for gcpbackend" \ --dns-name=gcpbackend \ --visibility=private \ --networks=defaultIn questo esempio, il nome DNS è gcpbackend e la rete VPC è default.
Configura il record per rendere risolvibile il dominio:
gcloud beta dns record-sets create *.gcpbackend \ --ttl=3600 --type=A --zone=prod \ --rrdatas=10.0.0.1Crea il GCPBackend con un nome host nel dominio precedente:
cat <<EOF > gcp-backend.yaml apiVersion: networking.gke.io/v1 kind: GCPBackend metadata: name: cr-gcp-backend namespace: NAMESPACE spec: hostname: hello-world.gcpbackend type: CloudRun cloudrun: service: hello-world regions: [us-central1] EOF kubectl apply -f gcp-backend.yamlIn questo esempio, GCP_BACKEND_NAME è
cr-gcp-backend.Crea un pod di test per verificare la connettività da GKE a Cloud Run:
cat <<EOF | kubectl apply -f - apiVersion: v1 kind: Pod metadata: name: testcurl namespace: default spec: containers: - name: curl image: curlimages/curl command: ["sleep", "3000"] EOF kubectl exec testcurl -c curl -- curl http://hello-world.gcpbackend/helloOra i tuoi workload GKE possono accedere al servizio Cloud Run inviando richieste HTTP a hello-world.gcpbackend/hello.
Devi utilizzare nomi distinti per GCPBackend per evitare conflitti con i servizi Kubernetes o le voci di servizio Istio esistenti. In caso di conflitto, l'ordine di precedenza (dal più alto al più basso) è Servizio Kubernetes, ServiceEntry Istio e GCPBackend.
Tieni presente che il servizio virtuale e GCPBackend devono trovarsi nello stesso spazio dei nomi e il servizio Cloud Run deve trovarsi nello stesso progetto del cluster GKE di Cloud Service Mesh.
(Facoltativo) Utilizza il nome host di Cloud Run anziché Cloud DNS
A ogni servizio Cloud Run viene assegnato un nome host (ad esempio hello-world.us-central1.run.app) e il DNS è risolvibile a livello globale. Puoi utilizzare questo nome host direttamente nel nome host GCPBackend e saltare la configurazione di Cloud DNS.
cat <<EOF | kubectl apply -f -
apiVersion: networking.gke.io/v1
kind: GCPBackend
metadata:
name: cr-gcp-backend
namespace: NAMESPACE
spec:
hostname: hello-world.us-central1.run.app
type: CloudRun
cloudrun:
service: hello-world
region: [us-central1]
EOF
Ora i tuoi workload GKE possono accedere al servizio Cloud Run inviando richieste HTTP a hello-world.us-central1.run.app.
(Facoltativo) Configura il servizio virtuale Istio e/o la regola di destinazione
Puoi configurare il servizio virtuale Istio o la regola di destinazione Istio per il nome host GCPBackend in modo da impostare le policy per i consumer o i client per le richieste al GCPBackend.
L'esempio seguente inserisce un ritardo di 5 secondi nel 50% delle richieste e interrompe (stato HTTP 503) il 10% delle richieste indirizzate a GCPBackend.
cat <<EOF | kubectl apply -f -
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: cr-virtual-service
namespace: NAMESPACE
spec:
hosts:
- hello-world.us-central1.run.app
gateways:
- mesh
http:
- fault:
delay:
percentage:
value: 50 # Delay 50% of requests
fixedDelay: 5s
abort:
percentage:
value: 10 # Abort 10% of requests
httpStatus: 503
- route:
- destination:
host: hello-world.us-central1.run.app
EOF
In questo esempio, VIRTUAL_SERVICE_NAME è cr-virtual-service.
Risoluzione dei problemi
Questa sezione mostra come risolvere i problemi comuni di Cloud Service Mesh e Cloud Run.
Log sidecar di Cloud Run
Gli errori di Envoy vengono registrati in Cloud Logging.
Ad esempio, se al account di servizio Cloud Run non viene assegnato il ruolo client Traffic Director nel progetto mesh, verrà registrato un errore simile al seguente:
StreamAggregatedResources gRPC config stream to trafficdirector.googleapis.com:443 closed: 7, Permission 'trafficdirector.networks.getConfigs' denied on resource '//trafficdirector.googleapis.com/projects/525300120045/networks/mesh:test-mesh/nodes/003fb3e0c8927482de85f052444d5e1cd4b3956e82b00f255fbea1e114e1c0208dbd6a19cc41694d2a271d1ab04b63ce7439492672de4499a92bb979853935b03d0ad0' (or it may not exist).
CSDS
Lo stato del client Traffic Director può essere recuperato utilizzando CSDS:
gcloud alpha container fleet mesh debug proxy-status --membership=<CLUSTER_MEMBERSHIP> --location=<CLUSTER_LOCATION>
External Clients:
....