Configurare un gruppo di endpoint di rete tra progetti
La funzionalità del gruppo di endpoint di rete (NEG) tra progetti consente ai clienti di collegare i NEG di un altro progetto a Traffic Director/Cloud Service MeshBackendService
, consentendo i seguenti casi d'uso:
In un deployment multi-project,
BackendServices
insieme ai relativi criteri di routing e traffico associati in un progetto centralizzato. con endpoint di backend da progetti diversi.In un deployment multi-project, puoi gestire tutte le risorse di calcolo (VM Compute Engine, NEG di GKE e così via) in un unico progettoGoogle Cloud centrale, mentre i team di servizi possiedono i propri progetti di servizi Google Cloud in cui definiscono le norme di servizio espresse in
BackendServices
e le route di routing dei servizi nel rispettivo progetto di servizio. In questo modo, i team del servizio possono delegare la gestione dei propri servizi, mantenendo al contempo un controllo rigoroso sulle risorse di calcolo che possono essere condivise tra team di servizi diversi.
Questa pagina mostra come creare una configurazione di base di due progetti in cui il NEG nel progetto A (chiamato progetto del workload) è collegato al BackendService
nel progetto B (chiamato progetto della policy). L'esempio seguente configura le VM del carico di lavoro nella rete VPC predefinita del progetto del carico di lavoro e dimostra che il client può eseguire il routing nel progetto del carico di lavoro in base alle configurazioni nel progetto del criterio.
In una configurazione più sofisticata, è necessaria una soluzione come VPC condiviso per un dataplane interconnesso in più progetti. Ciò implica anche che gli endpoint NEG hanno IP univoci. Questa configurazione di esempio può essere estesa a scenari più complicati in cui i carichi di lavoro si trovano in una rete VPC condiviso che copre più progetti.
Limitazioni
Si applicano le limitazioni generali di Traffic Director e le limitazioni di BackendService/NetworkEndpointGroup.
Si applicano anche le seguenti limitazioni, che potrebbero non essere specifiche per una configurazione di più progetti:
- Un singolo BackendService può supportare fino a 50 backend(inclusi NEG e MIG).
- Sono supportati solo i NEG zonali di tipo GCP_VM_IP_PORT.
- Il riferimento ai gruppi di istanze (gestiti o non gestiti) di BackendServices tra progetti non è supportato.
- L'elenco di NEG tra progetti che possono essere collegati a un determinato BackendService non è supportato.
- L'elenco di servizi di backend tra progetti che utilizzano un NEG specifico non è supportato.
Prima di iniziare
Prima di poter configurare i NEG tra progetti, devi completare i seguenti prerequisiti.
Abilita le API richieste
Per completare questa guida sono necessarie le seguenti API:
- osconfig.googleapis.com
- trafficdirector.googleapis.com
- compute.googleapis.com
- networkservices.googleapis.com
Esegui il seguente comando per abilitare le API richieste sia nel progetto di workload sia nel progetto di criteri:
gcloud services enable --project PROJECT_ID \
osconfig.googleapis.com \
trafficdirector.googleapis.com \
compute.googleapis.com \
networkservices.googleapis.com
Concedi le autorizzazioni IAM richieste
Per completare questa guida, devi disporre di autorizzazioni IAM (Identity and Access Management) sufficienti. Se disponi del ruolo di Proprietario o Editor (roles/owner
oroles/editor
) del progetto in cui stai attivando Cloud Service Mesh, hai automaticamente le autorizzazioni corrette.
In caso contrario, devi concedere tutti i seguenti ruoli IAM. Se disponi di questi ruoli, hai anche le autorizzazioni associate, come descritto nella documentazione IAM di Compute Engine.
I seguenti ruoli sono obbligatori sia nei progetti di carichi di lavoro che nei progetti di criteri:
- roles/iam.serviceAccountAdmin
- roles/serviceusage.serviceUsageAdmin
- roles/compute.networkAdmin
I seguenti ruoli sono obbligatori solo nel progetto del workload:
- roles/compute.securityAdmin
- roles/container.admin
- Qualsiasi ruolo che includa le seguenti autorizzazioni. Il ruolo predefinito più granulare che include tutte le autorizzazioni richieste per l'attacco di un NEG a un servizio di backend è roles/compute.loadBalancerServiceUser.
- compute.networkEndpointGroups.get
- compute.networkEndpointGroups.use
Inoltre, i client xDS gestiti da Traffic Director (come il proxy Envoy) devono avere le autorizzazioni riportate in roles/trafficdirector.client
. A scopo dimostrativo,
puoi utilizzare il seguente comando per concedere questa autorizzazione nel progetto di criteri
all'account di servizio Compute predefinito del progetto di carico di lavoro:
gcloud projects add-iam-policy-binding POLICY_PROJECT_ID \
--member "serviceAccount:WORKLOAD_PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
--role "roles/trafficdirector.client"
dove
- POLICY_PROJECT_ID è l'ID del progetto criterio.
- WORKLOAD_PROJECT_NUMBER è il numero del progetto di carico di lavoro.
Configura un backend di servizio nel progetto di carico di lavoro
Esegui il seguente comando per indirizzare la tua Google Cloud CLI al progetto di criteri e impostare la zona di calcolo Google Cloud preferita:
gcloud config set project WORKLOAD_PROJECT_ID gcloud config set compute/zone ZONE
dove
- WORKLOAD_PROJECT_ID è l'ID del progetto del carico di lavoro.
- ZONE è la zona del cluster GKE,
ad esempio
us-central1
.
Creare un cluster GKE. A scopo dimostrativo, il comando seguente crea un cluster GKE zonale. Tuttavia, questa funzionalità funziona anche sui cluster GKE regionali.
gcloud container clusters create test-cluster \ --scopes=https://www.googleapis.com/auth/cloud-platform --zone=ZONE
Crea una regola firewall:
gcloud compute firewall-rules create http-allow-health-checks \ --network=default \ --action=ALLOW \ --direction=INGRESS \ --source-ranges=35.191.0.0/16,130.211.0.0/22 \ --rules=tcp:80
Una regola firewall consente al piano di controllo di Google Cloud di inviare probe di controllo di integrità'integrità ai backend nella rete VPC predefinita.
Modifica il contesto corrente di kubectl nel cluster appena creato:
gcloud container clusters get-credentials test-cluster \ --zone=ZONE
Crea ed esegui il deployment dell'app di esempio whereami:
kubectl apply -f - <<EOF apiVersion: apps/v1 kind: Deployment metadata: name: whereami spec: replicas: 2 selector: matchLabels: app: whereami template: metadata: labels: app: whereami spec: containers: - name: whereami image: us-docker.pkg.dev/google-samples/containers/gke/whereami:v1 ports: - containerPort: 8080 --- apiVersion: v1 kind: Service metadata: name: whereami annotations: cloud.google.com/neg: '{"exposed_ports":{"8080":{"name": "example-neg"}}}' spec: selector: app: whereami ports: - port: 8080 targetPort: 8080 EOF
Esegui questo comando per archiviare il riferimento al NEG in una variabile:
NEG_LINK=$(gcloud compute network-endpoint-groups describe example-neg --format="value(selfLink)")
Il controller NEG crea automaticamente un gruppo di endpoint di rete a livello di zona per i backend dei servizi in ogni zona. In questo esempio, il nome NEG è hardcoded a example-neg. Memorizzarlo come variabile sarà utile nella sessione successiva quando collegherai questo NEG a un BackendService nel progetto del criterio.
Se utilizzi $NEG_LINK, l'esempio dovrebbe essere simile al seguente:
$ echo ${NEG_LINK} https://www.googleapis.com/compute/v1/projects/WORKLOAD_PROJECT/zones/ZONE/networkEndpointGroups/example-neg
In alternativa, puoi recuperare l'URL NEG leggendo l'annotazione neg-status sul servizio:
kubectl get service whereami -o jsonpath="{.metadata.annotations['cloud\.google\.com/neg-status']}" NEG_LINK="https://www.googleapis.com/compute/v1/projects/WORKLOAD_PROJECT_ID/zones/ZONE/networkEndpointGroups/example-neg"
Configura le risorse di rete Google Cloud nel progetto di criteri
Indica a Google Cloud CLI il progetto di norme:
gcloud config set project POLICY_PROJECT_ID
Configura una risorsa mesh:
gcloud network-services meshes import example-mesh --source=- --location=global << EOF name: example-mesh EOF
Il nome della risorsa del mesh è la chiave utilizzata dai proxy sidecar per richiedere la configurazione del mesh di servizi.
Configura un riferimento
BackendService
con un controllo di integrità:gcloud compute health-checks create http http-example-health-check gcloud compute backend-services create example-service \ --global \ --load-balancing-scheme=INTERNAL_SELF_MANAGED \ --protocol=HTTP \ --health-checks http-example-health-check
Collega il
NetworkEndpointGroup
creato nella sezione precedente alBackendService
:gcloud compute backend-services add-backend example-service --global \ --network-endpoint-group=${NEG_LINK} \ --balancing-mode=RATE \ --max-rate-per-endpoint=5
Crea un parametro HTTPRoute per indirizzare tutte le richieste HTTP con intestazione dell'host
example-service
al server nel progetto del carico di lavoro:gcloud network-services http-routes import example-route --source=- --location=global << EOF name: example-route hostnames: - example-service meshes: - projects/POLICY_PROJECT_NUMBER/locations/global/meshes/example-mesh rules: - action: destinations: - serviceName: "projects/POLICY_PROJECT_NUMBER/locations/global/backendServices/example-service" EOF
dove POLICY_PROJECT_NUMBER è il numero del progetto di criteri.
Verifica la configurazione
Puoi verificare la configurazione inviando una richiesta HTTP con l'intestazione HOST impostata su
example-service
a un VIP dietro un proxy sidecar gestito da Traffic Director:
curl -H "Host: example-service" http://10.0.0.1/
L'output è simile al seguente:
{"cluster_name":"test-cluster","gce_instance_id":"4879146330986909656","gce_service_account":"...","host_header":"example-service","pod_name":"whereami-7fbffd489-nhkfg","pod_name_emoji":"...","project_id":"...","timestamp":"2024-10-15T00:42:22","zone":"us-west1-a"}
Tieni presente che, poiché tutto il traffico in uscita dai pod viene intercettato da un sidecar Envoy in un mesh di servizi e la route HTTP precedente è configurata per inviare tutto il traffico al servizio Kubernetes "whereami" esclusivamente in base all'attributo L7 (intestazione host), A scopo di esempio, l'IP virtuale in questo comando è 10.0.0.1, ma può essere qualsiasi IP.
Il proxy sidecar deve richiedere le configurazioni associate alla risorsa mesh nel progetto di criteri. Per farlo, assicurati che l'ID nodo sia impostato nel seguente formato:
projects/POLICY_PROJECT_NUMBER/networks/mesh:example-mesh/nodes/UUID"