Crea un bilanciatore del carico interno tra le reti VPC

Questa pagina spiega come creare un bilanciatore del carico di rete passthrough interno su Google Kubernetes Engine (GKE) nelle reti VPC.

Prima di leggere questa pagina, assicurati di conoscere 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
  • Se vuoi 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 gcloud components update comando. Le versioni precedenti di gcloud CLI potrebbero non supportare l'esecuzione dei comandi in questo documento.

Creare un bilanciatore del carico interno con Private Service Connect

In qualità di producer di servizi, puoi utilizzare i collegamenti di servizio per rendere i tuoi servizi disponibili ai consumer di servizi in altre reti VPC utilizzando Private Service Connect. Puoi creare, gestire ed eliminare i collegamenti di servizio 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 di servizio nelle versioni di GKE 1.21.4-gke.300 e successive.
  • Il cluster deve avere l'HttpLoadBalancing add-on abilitato. I nuovi cluster GKE hanno l'add-on HttpLoadBalancing abilitato per impostazione predefinita.
  • Non puoi utilizzare la stessa subnet in più configurazioni di collegamento di servizio.
  • Devi creare un servizio GKE che utilizzi un bilanciatore del carico di rete passthrough interno.
  • 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 di servizio, non puoi aggiornare il bilanciatore del carico interno. Per modificare le configurazioni del bilanciatore del carico, devi eliminare e ricreare il collegamento di servizio.

Creare un ServiceAttachment

  1. Crea una subnet.

    Devi creare una nuova subnet per ogni ServiceAttachment.

    gcloud beta compute networks subnets create SUBNET_NAME \
        --project PROJECT_ID \
        --network NETWORK_NAME \
        --region REGION \
        --range SUBNET_RANGE \
        --purpose PRIVATE_SERVICE_CONNECT
    

    Sostituisci quanto segue:

    • SUBNET_NAME: il nome della nuova subnet. Nelle versioni di GKE 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 della risorsa con nome completo utilizzando il comando gcloud compute networks subnets describe.
    • PROJECT_ID: l'ID del tuo Google Cloud progetto.
    • NETWORK_NAME: il nome della rete VPC per la subnet.
    • REGION: la regione per la nuova subnet. Devi utilizzare la stessa regione del servizio che crei.
    • SUBNET_RANGE: l'intervallo di indirizzi IP da utilizzare per la subnet.
  2. Esegui il deployment di un carico di lavoro.

    Il manifest seguente 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: 1
    
  3. Applica il manifest al cluster:

    kubectl apply -f my-deployment.yaml
    
  4. Crea un servizio. Il manifest seguente 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: TCP
    

    Sostituisci quanto segue:

    • SERVICE_NAME: il nome del nuovo servizio.
  5. Applica il manifest al cluster:

    kubectl apply -f my-service.yaml
    
  6. Crea ServiceAttachment.

    Il manifest seguente descrive un ServiceAttachment che espone il servizio che hai creato ai consumer di servizi. Salva il manifest come my-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_NAME
    

    Sostituisci quanto segue:

    • SERVICE_ATTACHMENT_NAME: il nome del nuovo collegamento di servizio.
    • SUBNET_NAME: il nome della nuova subnet. Nelle versioni di GKE 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 della risorsa con nome completo utilizzando il comando gcloud 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 di servizio.

  7. Applica il manifest al cluster:

    kubectl apply -f my-psc.yaml
    
  8. Verifica che il controller Private Service Connect abbia creato il collegamento di servizio:

    gcloud beta compute service-attachments list
    

    L'output mostra un collegamento di servizio con un nome generato automaticamente:

    NAME        REGION       PRODUCER_FORWARDING_RULE          CONNECTION_PREFERENCE
    k8s1-sa-... REGION_NAME  a3fea439c870148bdba5e59c9ea9451a  ACCEPT_AUTOMATIC
    

Visualizzare 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>

Utilizzare un ServiceAttachment

Per utilizzare il servizio da un altro progetto:

  1. 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-sa
    
  2. Crea un endpoint Private Service Connect utilizzando l'URL di ServiceAttachment.

  3. Verifica di poter connetterti al servizio di cui hai eseguito il deployment nel progetto del produttore utilizzando un comando curl da una VM nel progetto del consumer:

    curl PSC_IP_ADDRESS
    

    Sostituisci PSC_IP_ADDRESS con l'indirizzo IP della regola di forwarding nel progetto del 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"
    }
    

Aggiornare un ServiceAttachment

Puoi aggiornare un ServiceAttachment seguendo questi passaggi:

  1. Modifica il manifest ServiceAttachment in my-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-service
    
  2. Applica il manifest al cluster:

    kubectl apply -f my-psc.yaml
    

Eliminare un ServiceAttachment

Non puoi eliminare un bilanciatore del carico di rete passthrough interno connesso a un collegamento di servizio. Devi eliminare separatamente il collegamento di servizio e il servizio GKE.

  1. Elimina il collegamento di servizio:

    kubectl delete serviceattachment SERVICE_ATTACHMENT_NAME --wait=false
    

    Questo comando contrassegna il collegamento di servizio per l'eliminazione, ma la risorsa continua a esistere. Puoi anche attendere il completamento dell'eliminazione omettendo il flag --wait.

  2. Elimina il servizio:

    kubectl delete svc SERVICE_NAME
    
  3. Elimina la subnet:

    gcloud compute networks subnets delete SUBNET_NAME
    

Campi ServiceAttachment

ServiceAttachment ha i seguenti campi:

  • connectionPreference: la preferenza di connessione che determina la modalità di connessione dei clienti al servizio. Puoi utilizzare l'approvazione automatica del progetto utilizzando ACCEPT_AUTOMATIC o l'approvazione esplicita del progetto utilizzando ACCEPT_MANUAL. Per ulteriori informazioni, consulta Pubblicare servizi utilizzando Private Service Connect.
  • natSubnets: un elenco di nomi di risorse di subnet da utilizzare per il collegamento di servizio.
  • proxyProtocol: se impostato su true, l'indirizzo IP di origine del consumer e l'ID di connessione 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 e 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 di GKE 1.36.0-gke.2459000 e successive.
  • consumerAllowList: l'elenco dei progetti consumer autorizzati a connettersi a ServiceAttachment. Questo campo può essere utilizzato solo quando connectionPreference è ACCEPT_MANUAL. Per ulteriori informazioni su questo campo, consulta Pubblicare servizi utilizzando Private Service Connect.
    • project: l'ID o il numero del progetto consumer.
    • connectionLimit: il limite di connessione 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 degli ID o dei numeri dei progetti consumer che non sono autorizzati a connettersi a ServiceAttachment. Questo campo può essere utilizzato solo quando connectionPreference è ACCEPT_MANUAL. Per ulteriori informazioni su questo campo, consulta Pubblicare servizi utilizzando Private Service Connect.
  • resourceRef: un riferimento alla risorsa Kubernetes.

    • kind: il tipo di risorsa Kubernetes. Devi utilizzare Service.
    • 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 di 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'abilitazione dell'accesso globale

Potresti riscontrare un errore quando abiliti 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' networking.gke.io/internal-load-balancer-allow-global-access: "true" annotazione, l'aggiornamento non riesce 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 è in uso da un ServiceAttachment, non può essere eliminata e ricreata, il che genera l'errore.

Soluzione temporanea :

Per abilitare l'accesso globale al bilanciatore del carico riducendo al minimo i tempi di inattività, devi aggiornare la configurazione del servizio GKE e aggiornare manualmente la regola di forwarding:

  1. Aggiorna il manifest del servizio GKE: aggiorna il tuo manifest del servizio GKE in modo da includere l' networking.gke.io/internal-load-balancer-allow-global-access: "true" annotazione.

  2. Abilita manualmente l'accesso globale alla regola di forwarding: segui i passaggi descritti in Abilitare l'accesso globale per aggiornare la regola di forwarding del bilanciatore del carico utilizzando la Google Cloud console, Google Cloud CLI o l'API Compute Engine.

Campo ReconcileConnections non sincronizzato

Se hai abilitato manualmente il campo ReconcileConnections nella risorsa ServiceAttachment di Compute Engine, ma hai omesso il campo dal manifest Kubernetes, il valore predefinito del campo è false. Il controller GKE non sovrascrive il valore del campo.

Sintomo :

La risorsa ServiceAttachment di Kubernetes 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 in modo da includere reconcileConnections: true (o false se vuoi disabilitarlo).
  • Aggiorna la risorsa ServiceAttachment di Compute Engine: imposta manualmente il campo reconcileConnections su false.

Passaggi successivi