Crea un bilanciatore del carico interno nelle 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, dovresti 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à, installa e initialize gcloud CLI. Se hai già installato gcloud CLI, scarica la versione più recente eseguendo gcloud components update.

Crea un bilanciatore del carico interno con Private Service Connect

In qualità di producer di servizi, puoi utilizzare i collegamenti ai servizi per rendere i tuoi servizi disponibili per i consumer di servizi in altre reti VPC utilizzando Private Service Connect. Puoi creare, gestire ed eliminare i collegamenti ai servizi utilizzando una risorsa ServiceAttachment personalizzata.

Requisiti e limitazioni

  • Si applicano limitazioni per Private Service Connect.
  • Puoi creare il collegamento a un servizio in GKE versione 1.21.4-gke.300 e successive.
  • Non puoi utilizzare la stessa subnet in più configurazioni di collegamenti ai servizi.
  • Devi creare un servizio GKE che utilizza un bilanciatore del carico di rete passthrough interno.
  • Non puoi specificare una subnet in un progetto diverso (VPC condiviso) per versioni di GKE precedenti alla 1.22.4-gke.100. Per il VPC condiviso, assicurati che tutti i requisiti per il VPC condiviso siano soddisfatti.

Crea un ServiceAttachment

  1. Creare 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 altro progetto utilizzando l'URL completo delle risorse per questo campo. Puoi ottenere l'URL completo della risorsa utilizzando il comando gcloud 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 IP da utilizzare per la subnet.
  2. Eseguire il deployment di un carico di lavoro.

    Il seguente manifest descrive un deployment che esegue un'immagine container di applicazione web di esempio. Salva il file 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.2.19
            ports:
              - name: http
                containerPort: 8080
            readinessProbe:
              httpGet:
                path: /healthz
                port: 8080
                scheme: HTTP
              initialDelaySeconds: 5
              timeoutSeconds: 1
    
  3. Applica il manifest al tuo cluster:

    kubectl apply -f my-deployment.yaml
    
  4. Creare un servizio. Il seguente manifest descrive un servizio che crea un bilanciatore del carico di rete passthrough interno sulla porta TCP 8080. Salva il file 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 tuo cluster:

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

    Il seguente manifest descrive un elemento ServiceAttachment che espone il servizio creato ai consumer di servizi. Salva il manifest con il nome 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
     resourceRef:
       kind: Service
       name: SERVICE_NAME
    

    Sostituisci quanto segue:

    • SERVICE_ATTACHMENT_NAME: il nome del nuovo allegato al 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 altro progetto utilizzando l'URL completo delle risorse per questo campo. Puoi ottenere l'URL completo della risorsa utilizzando il comando gcloud compute networks subnets describe. Per una configurazione di un VPC condiviso, utilizza il seguente formato: projects/HOST_PROJECT_ID/regions/COMPUTE_REGION/subnetworks/SUBNET_NAME.

    Per saperne di più sui campi del file manifest, consulta i campi del collegamento al servizio.

  7. Applica il manifest al tuo cluster:

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

    gcloud beta compute service-attachments list
    

    L'output mostra il collegamento a un 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 ServiceAttachment utilizzando il seguente comando:

kubectl describe serviceattachment SERVICE_ATTACHMENT_NAME

L'output è simile al seguente:

 kubectl describe serviceattachment foo-sa
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:

  1. Ottieni 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 poterti connettere al servizio di cui hai eseguito il deployment nel progetto producer utilizzando un comando curl da una VM nel progetto consumer:

    curl PSC_IP_ADDRESS
    

    Sostituisci PSC_IP_ADDRESS con 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 questa procedura:

  1. Modifica il file 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 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 a un servizio. Devi eliminare il collegamento al servizio e il servizio GKE separatamente.

  1. Elimina il collegamento al servizio:

    kubectl delete serviceattachment SERVICE_ATTACHMENT_NAME --wait=false
    

    Questo 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.

  2. Elimina il servizio:

    kubectl delete svc SERVICE_NAME
    
  3. Elimina la subnet:

    gcloud compute networks subnets delete SUBNET_NAME
    

ServiceAttachment campi

Il campo 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 dei progetti utilizzando ACCEPT_AUTOMATIC o l'approvazione esplicita dei progetti utilizzando ACCEPT_MANUAL. Per maggiori informazioni, consulta Pubblicazione di servizi mediante Private Service Connect.
  • natSubnets: un elenco di nomi di risorse della subnet da utilizzare per il collegamento del servizio.
  • proxyProtocol: se questo criterio è impostato su true, l'IP di origine consumer e l'ID connessione Private Service Connect sono disponibili nelle richieste. Questo campo è facoltativo e il valore predefinito è false se non viene fornito.
  • consumerAllowList: l'elenco di progetti consumer a cui è consentito connettersi a ServiceAttachment. Questo campo può essere utilizzato solo quando connectionPreference è ACCEPT_MANUAL. Per ulteriori informazioni su questo campo, consulta Servizi di pubblicazione tramite Private Service Connect.
    • project: l'ID o il numero del progetto consumer.
    • connectionLimit: 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 nullo. Questo campo è facoltativo.
  • consumerRejectList: l'elenco di ID o numeri di progetti consumer che non possono connettersi a ServiceAttachment. Questo campo può essere utilizzato solo quando connectionPreference è ACCEPT_MANUAL. Per maggiori informazioni su questo campo, consulta Servizi di pubblicazione tramite 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.

Se tenti di eliminare un bilanciatore del carico di rete passthrough interno utilizzato da un collegamento a un 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.

Passaggi successivi