Crea un bilanciatore del carico esterno con protocollo misto

Questo documento mostra come esporre a internet un'applicazione in esecuzione in un cluster Google Kubernetes Engine (GKE) utilizzando un servizio LoadBalancer esterno con protocollo misto per il traffico TCP e UDP.

Per saperne di più sui bilanciatori del carico di rete passthrough esterni, consulta Backend Bilanciatore del carico di rete passthrough esterno basato sui servizi di backend.

Panoramica

Puoi esporre le applicazioni che utilizzano i protocolli TCP e UDP utilizzando due servizi LoadBalancer GKE separati con un indirizzo IP condiviso coordinato manualmente. Tuttavia, questo approccio è inefficiente perché richiede la gestione di più servizi per una singola applicazione e potrebbe causare problemi come errori di configurazione o quote di indirizzi IP esaurite.

I servizi LoadBalancer con protocollo misto ti consentono di utilizzare un singolo servizio per gestire il traffico TCP e UDP. L'utilizzo di un singolo servizio semplifica la configurazione consentendoti di utilizzare un singolo indirizzo IPv4 e un insieme consolidato di regole di forwarding per entrambi i protocolli. Questa funzionalità è supportata per il bilanciatore del carico di rete passthrough esterno.

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.
  • Assicurati di avere un cluster Autopilot o Standard esistente. Per creare un nuovo cluster, vedi Crea un cluster Autopilot.

Requisiti

Per creare un servizio LoadBalancer esterno che utilizza protocolli misti, il cluster deve soddisfare i seguenti requisiti:

  • Il bilanciamento del carico con protocollo misto è disponibile nella versione 1.34.1-gke.2190000 o successive.
  • Devi aver abilitato l'addon HttpLoadBalancing nel cluster.
  • Per i nuovi servizi LoadBalancer esterni, per implementare il bilanciatore del carico, imposta il campo spec.loadBalancerClass su networking.gke.io/l4-regional-external nel manifest del servizio. Per i servizi esistenti, il manifest ha già l'annotazione cloud.google.com/l4-rbs: "enabled" e puoi lasciarla così com'è.

Limitazioni

  • I bilanciatori del carico con protocollo misto supportano solo gli indirizzi IPv4.
  • Non puoi utilizzare protocolli misti in un manifest del servizio con i seguenti finalizzatori:

    • gke.networking.io/l4-ilb-v1
    • gke.networking.io/l4-netlb-v1

    Se il manifest ha questi finalizzatori, devi eliminare e ricreare il servizio in base ai requisiti precedenti.

Prezzi

Cloud de Confiance ti addebita i costi per regola di forwarding, per tutti gli indirizzi IP esterni e per i dati inviati. La tabella seguente descrive il numero di regole di forwarding e indirizzi IP esterni utilizzati per le configurazioni specificate. Per saperne di più, consulta i prezzi della rete VPC.

Tipo Livello di trasporto Livello internet Numero di regole di forwarding Numero di indirizzi IP esterni
Esterno Singolo (TCP o UDP) IPv4 1 1
IPv6 1 1
IPv4 e IPv6(stack doppio) 2 2
Misto (TCP e UDP) IPv4 2 1

Esegui il deployment di un carico di lavoro

Questa sezione mostra come eseguire il deployment di un carico di lavoro di esempio che rimane in ascolto sulle porte TCP e UDP. Tieni presente che la configurazione del deployment è la stessa sia che tu stia utilizzando un servizio LoadBalancer con protocollo misto sia due servizi LoadBalancer con protocollo singolo separati.

  1. Il seguente manifest è per un'applicazione di esempio che rimane in ascolto sulla porta 8080 per il traffico TCP e UDP. Salva il seguente manifest come mixed-app-deployment.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mixed-app-deployment
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: mixed-app
      template:
        metadata:
          labels:
            app: mixed-app
        spec:
          containers:
          - image: gcr.io/kubernetes-e2e-test-images/agnhost:2.6
            name: agnhost
            args: ["serve-hostname", "--port=8080", "--tcp=true", "--udp=true", "--http=false"]
            ports:
              - name: tcp8080
                protocol: TCP
                containerPort: 8080
              - name: udp8080
                protocol: UDP
                containerPort: 8080
    
  2. Applica il manifest al cluster:

    kubectl apply -f mixed-app-deployment.yaml
    

Crea un bilanciatore del carico con protocollo misto

Crea un servizio di tipo LoadBalancer che espone il deployment al traffico TCP e UDP.

  1. Salva il seguente manifest come mixed-protocol-lb.yaml:

    apiVersion: v1
    kind: Service
    metadata:
      name: mixed-protocol-lb
    spec:
      loadBalancerClass: "networking.gke.io/l4-regional-external"
      type: LoadBalancer
      selector:
        app: mixed-app
      ports:
      - name: tcp-port
        protocol: TCP
        port: 8080
      - name: udp-port
        protocol: UDP
        port: 8080
    

    Il servizio precedente ha due porte, una per TCP e una per UDP, entrambe sulla porta 8080.

  2. Applica il manifest al cluster:

    kubectl apply --server-side -f mixed-protocol-lb.yaml
    

Verifica il bilanciatore del carico con protocollo misto

Dopo aver creato il servizio, verifica che GKE abbia creato correttamente il bilanciatore del carico.

  1. Ispeziona il servizio:

    kubectl describe service mixed-protocol-lb
    

    L'output mostra l'indirizzo IP esterno del bilanciatore del carico e le regole di forwarding per TCP e UDP. Verifica i seguenti dettagli nell'output:

    • Il campo status.loadBalancer.ingress.ip è compilato.
    • Verifica che siano presenti le seguenti annotazioni per il bilanciatore del carico esterno:
      • service.kubernetes.io/tcp-forwarding-rule
      • service.kubernetes.io/udp-forwarding-rule
    • La sezione Events non contiene messaggi di errore.

Aggiorna il bilanciatore del carico con protocollo misto

Puoi aggiornare le porte di un bilanciatore del carico con protocollo misto modificando il manifest del servizio. Per modificare il servizio, esegui il seguente comando:

kubectl edit service SERVICE_NAME

Sostituisci SERVICE_NAME con il nome del servizio.

Aggiorna le porte

Per aggiornare le porte di un bilanciatore del carico con protocollo misto, modifica la sezione ports del manifest del servizio. Puoi aggiungere, rimuovere o modificare le porte.

L'esempio seguente aggiunge una porta UDP per lo streaming e una porta TCP per i metadati del server di gioco:

apiVersion: v1
kind: Service
metadata:
  name: mixed-protocol-lb
spec:
  loadBalancerClass: "networking.gke.io/l4-regional-external"
  type: LoadBalancer
  selector:
    app: mixed-app
  ports:
  - name: tcp-port
    protocol: TCP
    port: 8080
  - name: streaming
    protocol: UDP
    port: 10100
  - name: gameserver-metadata
    protocol: TCP
    port: 10400
  - name: https
    protocol: TCP
    port: 443

Aggiorna un bilanciatore del carico con protocollo singolo a protocollo misto

Per modificare un bilanciatore del carico con protocollo singolo in un bilanciatore del carico con protocollo misto, modifica il servizio in modo da includere le porte per i protocolli TCP e UDP.

L'esempio seguente aggiunge una porta UDP per il DNS a un bilanciatore del carico esistente solo TCP:

apiVersion: v1
kind: Service
metadata:
  name: already-existing-single-protocol-lb
spec:
  loadBalancerClass: "networking.gke.io/l4-regional-external"
  type: LoadBalancer
  selector:
    app: mixed-app
  ports:
  - name: http
    protocol: TCP
    port: 80
  - name: https
    protocol: TCP
    port: 443
  - name: dns
    protocol: UDP
    port: 53

Aggiorna un bilanciatore del carico con protocollo misto a protocollo singolo

Per modificare un bilanciatore del carico con protocollo misto in un bilanciatore del carico con protocollo singolo, rimuovi tutte le porte per uno dei protocolli.

L'esempio seguente rimuove la porta UDP per il DNS, che converte il bilanciatore del carico in solo TCP:

apiVersion: v1
kind: Service
metadata:
  name: already-existing-mixed-protocol-lb
spec:
  loadBalancerClass: "networking.gke.io/l4-regional-external"
  type: LoadBalancer
  selector:
    app: mixed-app
  ports:
  - name: http
    protocol: TCP
    port: 80
  - name: https
    protocol: TCP
    port: 443

Elimina il servizio LoadBalancer con protocollo misto

Per eliminare il servizio LoadBalancer esterno mixed-protocol-lb, esegui il seguente comando:

kubectl delete service mixed-protocol-lb

GKE rimuove automaticamente tutte le risorse del bilanciatore del carico create per il servizio.

Risoluzione dei problemi

Questa sezione descrive come risolvere i problemi comuni con i servizi LoadBalancer con protocollo misto.

Controlla gli eventi di errore

Il primo passo per la risoluzione dei problemi è controllare gli eventi associati al servizio.

  1. Recupera i dettagli del servizio:

    kubectl describe service mixed-protocol-lb
    
  2. Esamina la sezione Events alla fine dell'output per eventuali messaggi di errore.

Errore: il protocollo misto non è supportato per LoadBalancer

Se hai creato il servizio con l'annotazione cloud.google.com/l4-rbs: "enabled", potresti visualizzare un evento di avviso dal controller del servizio originale dopo aver creato il bilanciatore del carico con protocollo misto: mixed-protocol is not supported for LoadBalancer.

Puoi ignorare questo messaggio perché il nuovo controller, che supporta i protocolli misti, esegue il provisioning corretto del bilanciatore del carico.

La definizione della porta non è presente dopo un aggiornamento

Sintomo:

Quando aggiorni un servizio che utilizza la stessa porta per TCP e UDP (ad esempio, la porta 8080), una delle definizioni delle porte non è presente nel servizio aggiornato.

Causa:

Si tratta di un problema noto in Kubernetes. Quando aggiorni un servizio con più protocolli sulla stessa porta, il calcolo della patch lato client può unire in modo errato l'elenco delle porte, causando la rimozione di una delle definizioni delle porte. Questo problema riguarda i client che utilizzano l'applicazione di patch lato client, come kubectl apply e il client Go con patch di unione.

Soluzione:

La soluzione alternativa per questo problema dipende dal client.

  • Per kubectl: utilizza il flag --server-side con kubectl apply:

    kubectl apply --server-side -f YOUR_SERVICE_MANIFEST.yaml
    

    Sostituisci YOUR_SERVICE_MANIFEST con il nome del manifest del servizio.

  • Per go-client: non utilizzare le patch di unione. Utilizza invece una chiamata di aggiornamento per sostituire il servizio. È necessaria una richiesta HTTP PUT con la specifica dell'intero oggetto del servizio.

Passaggi successivi