Questa pagina spiega come creare un bilanciatore del carico di rete passthrough interno su Google Kubernetes Engine (GKE) tra reti VPC.
Prima di leggere questa pagina, assicurati di avere familiarità con i seguenti concetti:
Prima di iniziare
Prima di iniziare, assicurati di aver eseguito le seguenti attività:
- Abilita l'API Google Kubernetes Engine. Abilita l'API Google Kubernetes Engine
- Per utilizzare Google Cloud CLI per questa attività,
installala e poi
inizializza
gcloud CLI. Se hai già installato gcloud CLI, scarica l'ultima
versione eseguendo il comando
gcloud components update. Le versioni precedenti di gcloud CLI potrebbero non supportare l'esecuzione dei comandi in questo documento.
Crea un bilanciatore del carico interno con Private Service Connect
In qualità di producer di servizi, puoi utilizzare i collegamenti ai servizi per renderli disponibili ai consumer di servizi in altre reti VPC utilizzando Private Service Connect. Puoi creare, gestire ed eliminare i collegamenti ai servizi utilizzando una risorsa personalizzata ServiceAttachment. Il controller Private Service Connect di GKE monitora la risorsa ServiceAttachment e crea, aggiorna o elimina automaticamente una risorsa ServiceAttachment corrispondente in Compute Engine.
Requisiti e limitazioni
- Si applicano le limitazioni per Private Service Connect.
- Puoi creare un collegamento al servizio in GKE 1.21.4-gke.300 e versioni successive.
- Il cluster deve avere il componente aggiuntivo
HttpLoadBalancingabilitato. I nuovi cluster GKE hanno il componente aggiuntivoHttpLoadBalancingabilitato per impostazione predefinita. - Non puoi utilizzare la stessa subnet in più configurazioni di collegamento ai servizi.
- Devi creare un servizio GKE che utilizzi un bilanciatore del carico di rete passthrough interno.
- Il servizio GKE deve utilizzare un solo protocollo. I servizi GKE con protocollo misto non sono supportati.
- Non puoi specificare una subnet in un progetto diverso (VPC condiviso) per le versioni di GKE precedenti alla 1.22.4-gke.100. Per il VPC condiviso, assicurati che siano soddisfatti tutti i requisiti per il VPC condiviso.
- Dopo aver creato un collegamento al servizio, non puoi aggiornare il bilanciatore del carico interno. Per modificare le configurazioni del bilanciatore del carico, devi eliminare e ricreare il collegamento al servizio.
Compatibilità delle versioni IP per i servizi e le subnet NAT
Quando crei una risorsa ServiceAttachment, il controller Private Service Connect di GKE crea un singolo collegamento al servizio Compute Engine associato a una regola di forwarding del producer.
La regola di forwarding del producer utilizza un indirizzo IPv4 o IPv6.
La tabella seguente mostra in che modo il controller seleziona la regola di forwarding in base alla configurazione della famiglia IP (campo spec.ipFamilies) del servizio Kubernetes di riferimento e ai tipi di stack di tutte le subnet specificate nel campo spec.natSubnets:
| Servizio Kubernetes (regole di forwarding) | Tipi di stack delle subnet nel campo natSubnets |
Regola di forwarding del collegamento al servizio Compute Engine | Note |
|---|---|---|---|
| IPv4 a stack singolo | IPV4_ONLY, IPV4_IPV6 o entrambi |
Indirizzo IPv4 | Supportati |
Contiene qualsiasi subnet IPV6_ONLY |
Nessuno (errore) | Errore di configurazione. Tutte le subnet NAT devono supportare gli indirizzi IPv4. | |
| Dual-stack (indirizzi IPv4 e IPv6) | IPV4_ONLY, IPV4_IPV6 o entrambe (nessuna subnet IPV6_ONLY) |
Indirizzo IPv4 | Supportati Utilizza la regola di forwarding IPv4. Un collegamento di servizio IPv4 può accettare connessioni da endpoint consumer sia IPv4 che IPv6. |
IPV6_ONLY o una combinazione di IPV6_ONLY e IPV4_IPV6 (nessuna subnet IPV4_ONLY) |
Indirizzo IPv6 | Supportati Utilizza la regola di forwarding IPv6 perché è presente una subnet IPV6_ONLY. Un collegamento di servizi IPv6 accetta connessioni solo da endpoint consumer IPv6. |
|
Contiene sia subnet IPV4_ONLY sia subnet IPV6_ONLY |
Nessuno (errore) | Errore di configurazione. Tutte le subnet NAT devono condividere una versione IP comune. | |
| IPv6 a stack singolo | IPV6_ONLY, IPV4_IPV6 o entrambi |
Indirizzo IPv6 | Supportati |
Contiene qualsiasi subnet IPV4_ONLY |
Nessuno (errore) | Errore di configurazione. Tutte le subnet NAT devono supportare gli indirizzi IPv6. |
Per saperne di più su come gli endpoint consumer si connettono ai collegamenti ai servizi IPv4 e IPv6, consulta Traduzione della versione IP.
Crea un ServiceAttachment
Crea una subnet.
Devi creare una nuova subnet per ogni
ServiceAttachment.gcloud compute networks subnets create SUBNET_NAME \ --project PROJECT_ID \ --network NETWORK_NAME \ --region REGION \ --range SUBNET_RANGE \ --purpose PRIVATE_SERVICE_CONNECTSostituisci quanto segue:
SUBNET_NAME: il nome della nuova subnet. In GKE versione 1.22.4-gke.100 e successive, puoi specificare una subnet in un progetto diverso utilizzando l'URL della risorsa con nome completo per questo campo. Puoi ottenere l'URL completo della risorsa utilizzando il comandogcloud compute networks subnets describe.PROJECT_ID: l'ID del tuo progetto Google Cloud.NETWORK_NAME: il nome della rete VPC per la subnet.REGION: la regione della nuova subnet. Devi utilizzare la stessa regione del servizio che crei.SUBNET_RANGE: l'intervallo di indirizzi IPv4 da utilizzare per la subnet.
Per creare una subnet Private Service Connect a doppio stack o solo IPv6, includi i flag
--stack-type=IPV4_IPV6e--ipv6-access-type=INTERNALo i flag--stack-type=IPV6_ONLYe--ipv6-access-type=INTERNAL(ometti il flag--rangequando utilizzi il tipo di stackIPV6_ONLY). Assicurati che il tipo di stack della subnet sia compatibile con la famiglia di IP del servizio, come descritto in Compatibilità della versione IP per i servizi e le subnet NAT.Esegui il deployment di un workload.
Il seguente manifest descrive un deployment che esegue un'immagine container di un'applicazione web di esempio. Salva il manifest come
my-deployment.yaml:apiVersion: apps/v1 kind: Deployment metadata: name: psc-ilb spec: replicas: 3 selector: matchLabels: app: psc-ilb template: metadata: labels: app: psc-ilb spec: containers: - name: whereami image: us-docker.pkg.dev/google-samples/containers/gke/whereami:v1 ports: - name: http containerPort: 8080 readinessProbe: httpGet: path: /healthz port: 8080 scheme: HTTP initialDelaySeconds: 5 timeoutSeconds: 1Applica il manifest al tuo cluster:
kubectl apply -f my-deployment.yamlCrea un servizio. Il seguente manifest descrive un servizio che crea un bilanciatore del carico di rete passthrough interno sulla porta TCP 8080. Salva il manifest come
my-service.yaml:apiVersion: v1 kind: Service metadata: name: SERVICE_NAME annotations: networking.gke.io/load-balancer-type: "Internal" spec: type: LoadBalancer selector: app: psc-ilb ports: - port: 80 targetPort: 8080 protocol: TCPSostituisci quanto segue:
SERVICE_NAME: il nome del nuovo servizio.
Applica il manifest al tuo cluster:
kubectl apply -f my-service.yamlCrea
ServiceAttachment.Il seguente manifest descrive un
ServiceAttachmentche espone il servizio che hai creato ai consumer di servizi. Salva il manifest comemy-psc.yaml:apiVersion: networking.gke.io/v1 kind: ServiceAttachment metadata: name: SERVICE_ATTACHMENT_NAME namespace: default spec: connectionPreference: ACCEPT_AUTOMATIC natSubnets: - SUBNET_NAME proxyProtocol: false reconcileConnections: false # set to true to enable connection reconciliation resourceRef: kind: Service name: SERVICE_NAMESostituisci quanto segue:
SERVICE_ATTACHMENT_NAME: il nome del nuovo collegamento al servizio.SUBNET_NAME: il nome della nuova subnet. In GKE versione 1.22.4-gke.100 e successive, puoi specificare una subnet in un progetto diverso utilizzando l'URL della risorsa con nome completo per questo campo. Puoi ottenere l'URL completo della risorsa utilizzando il comandogcloud compute networks subnets describe. Per una configurazione di VPC condiviso, utilizza il seguente formato:projects/HOST_PROJECT_ID/regions/COMPUTE_REGION/subnetworks/SUBNET_NAME.
Per ulteriori informazioni sui campi del manifest, consulta i campi del collegamento al servizio.
Applica il manifest al tuo cluster:
kubectl apply -f my-psc.yamlVerifica che il controller Private Service Connect abbia creato il collegamento al servizio:
gcloud compute service-attachments listL'output mostra un collegamento al servizio con un nome generato automaticamente:
NAME REGION PRODUCER_FORWARDING_RULE CONNECTION_PREFERENCE k8s1-sa-... REGION_NAME a3fea439c870148bdba5e59c9ea9451a ACCEPT_AUTOMATIC
Visualizza un ServiceAttachment
Puoi visualizzare i dettagli di un ServiceAttachment utilizzando il seguente comando:
kubectl describe serviceattachment SERVICE_ATTACHMENT_NAME
L'output è simile al seguente:
Name: <sa-name>
Namespace: default
Labels: <none>
Annotations: <none>
API Version: networking.gke.io/v1beta1
Kind: ServiceAttachment
Metadata:
...
Status:
Forwarding Rule URL: https://www.googleapis.com/compute/beta/projects/<project>/regions/<region>/forwardingRules/<fr-name>
Last Modified Timestamp: 2021-07-08T01:32:39Z
Service Attachment URL: https://www.googleapis.com/compute/beta/projects/<projects>/regions/<region>/serviceAttachments/<gce-service-attachment-name>
Events: <none>
Consuma un ServiceAttachment
Per utilizzare il servizio da un altro progetto, segui questi passaggi:
Recupera l'URL di
ServiceAttachment:kubectl get serviceattachment SERVICE_ATTACHMENT_NAME -o=jsonpath="{.status.serviceAttachmentURL}"L'output è simile al seguente:
serviceAttachmentURL: https://www.googleapis.com/compute/alpha/projects/<project>/region/<region>/serviceAttachments/k8s1-...my-saCrea un endpoint Private Service Connect utilizzando l'URL di
ServiceAttachment.Verifica di poterti connettere al servizio di cui hai eseguito il deployment nel progetto producer utilizzando un comando
curlda una VM nel progetto consumer:curl PSC_IP_ADDRESSSostituisci
PSC_IP_ADDRESScon l'indirizzo IP della regola di forwarding nel progetto consumer.L'output è simile al seguente:
{ "cluster_name":"cluster", "host_header":"10.128.15.200", "node_name":"gke-psc-default-pool-be9b6e0e-dvxg.c.gke_project.internal", "pod_name":"foo-7bf648dcfd-l5jf8", "pod_name_emoji":"👚", "project_id":"gke_project", "timestamp":"2021-06-29T21:32:03", "zone":"ZONE_NAME" }
Aggiorna un ServiceAttachment
Puoi aggiornare un ServiceAttachment seguendo questi passaggi:
Modifica il manifest
ServiceAttachmentinmy-psc.yaml:apiVersion: networking.gke.io/v1 kind: ServiceAttachment metadata: name: my-sa namespace: default spec: connectionPreference: ACCEPT_AUTOMATIC natSubnets: - my-nat-subnet proxyProtocol: false resourceRef: kind: Service name: ilb-serviceApplica il manifest al tuo cluster:
kubectl apply -f my-psc.yaml
Elimina un ServiceAttachment
Non puoi eliminare un bilanciatore del carico di rete passthrough interno connesso a un collegamento al servizio. Devi eliminare il collegamento al servizio e il servizio GKE separatamente.
Elimina il collegamento al servizio:
kubectl delete serviceattachment SERVICE_ATTACHMENT_NAME --wait=falseQuesto comando contrassegna il collegamento al servizio per l'eliminazione, ma la risorsa continua a esistere. Puoi anche attendere il completamento dell'eliminazione omettendo il flag
--wait.Elimina il servizio:
kubectl delete svc SERVICE_NAMEElimina la subnet:
gcloud compute networks subnets delete SUBNET_NAME
ServiceAttachment campi
ServiceAttachment contiene i seguenti campi:
connectionPreference: la preferenza di connessione che determina il modo in cui i clienti si connettono al servizio. Puoi utilizzare l'approvazione automatica del progetto utilizzandoACCEPT_AUTOMATICo l'approvazione esplicita del progetto utilizzandoACCEPT_MANUAL. Per saperne di più, consulta Pubblicazione di servizi utilizzando Private Service Connect.natSubnets: un elenco di nomi delle risorse di subnet da utilizzare per il collegamento del servizio.proxyProtocol: se impostato su true, l'IP di origine del consumer e l'ID connessione di Private Service Connect sono disponibili nelle richieste. Questo campo è facoltativo e, se non viene fornito, il valore predefinito è false.reconcileConnections(anteprima): se impostato su true, le modifiche agli elenchi di accettazione o rifiuto del consumer di servizi terminano automaticamente le connessioni esistenti non autorizzate. Se impostato su false, le modifiche interessano solo le nuove connessioni. Questo campo è facoltativo e il valore predefinito è false. Questo campo è supportato a partire dalla versione 1.36.0-gke.2459000 di GKE.consumerAllowList: l'elenco dei progetti consumer autorizzati a connettersi aServiceAttachment. Questo campo può essere utilizzato solo quandoconnectionPreferenceèACCEPT_MANUAL. Per saperne di più su questo campo, consulta Pubblicazione di servizi utilizzando Private Service Connect.project: l'ID o il numero del progetto consumer.connectionLimit: il limite di connessioni per il progetto consumer. Questo campo è facoltativo.forceSendFields: i nomi dei campi da inviare da includere nelle richieste API. Questo campo è facoltativo.nullFields: i nomi dei campi da includere nelle richieste API con un valore null. Questo campo è facoltativo.
consumerRejectList: l'elenco di ID o numeri di progetto consumer che non possono connettersi aServiceAttachment. Questo campo può essere utilizzato solo quandoconnectionPreferenceèACCEPT_MANUAL. Per saperne di più su questo campo, consulta Pubblicazione di servizi utilizzando Private Service Connect.resourceRef: un riferimento alla risorsa Kubernetes.kind: il tipo di risorsa Kubernetes. Devi utilizzareService.name: il nome della risorsa Kubernetes che deve trovarsi nello stesso spazio dei nomi del bilanciatore del carico di rete passthrough interno.
Risoluzione dei problemi
Puoi visualizzare i messaggi di errore utilizzando il seguente comando:
kubectl get events -n NAMESPACE
Sostituisci NAMESPACE con lo spazio dei nomi del bilanciatore del carico di rete passthrough interno.
Errore durante l'eliminazione del bilanciatore del carico di rete passthrough interno
Se provi a eliminare un bilanciatore del carico di rete passthrough interno utilizzato da un collegamento al servizio, viene visualizzato un messaggio di errore simile al seguente. Devi eliminare
ServiceAttachment prima di poter eliminare il bilanciatore del carico di rete passthrough interno.
Error syncing load balancer: failed to ensure load balancer: googleapi:
Error 400: The forwarding_rule resource '<fwd-rule-URL>' is already being used
by '<svc-attachment-URL>', resourceInUseByAnotherResource.
Errore durante l'attivazione dell'accesso globale
Potresti riscontrare un errore quando attivi l'accesso globale per un bilanciatore del carico di rete passthrough interno che utilizza un collegamento di servizio Private Service Connect.
Sintomo:
Quando abiliti l'accesso globale aggiornando il manifest del servizio GKE e impostando l'annotazione networking.gke.io/internal-load-balancer-allow-global-access: "true", l'aggiornamento non va a buon fine quando applichi il manifest. Quando esegui il comando kubectl get events, viene visualizzato il seguente messaggio di errore:
Error syncing load balancer: failed to ensure load balancer: googleapi: Error 400: The forwarding_rule resource '...' is already being used by '...', resourceInUseByAnotherResource
Motivo:
Questo errore si verifica perché il control plane GKE tenta di ricreare la regola di forwarding del bilanciatore del carico per abilitare l'accesso globale. Tuttavia, poiché la regola di forwarding è utilizzata da un ServiceAttachment, non può essere eliminata e ricreata, il che genera l'errore.
Soluzione temporanea:
Per abilitare l'accesso globale sul bilanciatore del carico riducendo al minimo i tempi di inattività, devi aggiornare la configurazione del servizio GKE e aggiornare manualmente la regola di forwarding:
Aggiorna il manifest del servizio GKE: aggiorna il manifest del servizio GKE per includere l'annotazione
networking.gke.io/internal-load-balancer-allow-global-access: "true".Attiva manualmente l'accesso globale nella regola di forwarding: segui i passaggi descritti in Abilita l'accesso globale per aggiornare la regola di forwarding del bilanciatore del carico utilizzando la consoleGoogle Cloud , Google Cloud CLI o l'API Compute Engine.
Campo ReconcileConnections non sincronizzato
Se hai attivato manualmente il campo ReconcileConnections sulla risorsa ServiceAttachment di Compute Engine, ma hai omesso il campo dal manifest di Kubernetes, il campo viene impostato su false per impostazione predefinita. Il controller GKE non sovrascrive il valore del campo.
Sintomo:
La risorsa Kubernetes ServiceAttachment ha l'annotazione networking.gke.io/unsynced-field: ReconcileConnections. Quando esegui il comando kubectl get events, viene visualizzato un evento di avviso simile al seguente:
Field "ReconcileConnections" is not specified in the ServiceAttachment CR but has a value in GCE. The controller will not overwrite this field until it is explicitly set in the CR.
Soluzione temporanea:
Per risolvere questo avviso e sincronizzare i valori, esegui una delle seguenti azioni:
- Aggiorna la risorsa ServiceAttachment di GKE: aggiorna il manifest ServiceAttachment di GKE per includere
reconcileConnections: true(ofalsese vuoi disabilitarlo). - Aggiorna la risorsa ServiceAttachment di Compute Engine: imposta manualmente il campo
reconcileConnectionssufalse.
Passaggi successivi
- Leggi la panoramica della rete GKE.
- Scopri di più sui bilanciatori del carico di Compute Engine.
- Scopri come creare un cluster nativo di VPC.
- Scopri di più sulla configurazione delle reti autorizzate.
- Risolvi i problemi di bilanciamento del carico in GKE.