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 Bilanciatore del carico di rete passthrough esterno basato sui servizi di backend.
Panoramica
Puoi esporre 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 protocolli misti ti consentono di utilizzare un singolo servizio per gestire il traffico sia per TCP che per 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 operazioni:
- Attiva l'API Google Kubernetes Engine. Attiva 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 comando
gcloud components update. 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 utilizzi protocolli misti, il cluster deve soddisfare i seguenti requisiti:
- Il bilanciamento del carico con protocolli misti è disponibile solo sui cluster appena creati nella versione 1.34.1-gke.2190000 o successive.
- Devi aver attivato il componente aggiuntivo
HttpLoadBalancingsul tuo cluster. - Per i nuovi servizi LoadBalancer esterni, per implementare il bilanciatore del carico, imposta
il campo
spec.loadBalancerClasssunetworking.gke.io/l4-regional-externalnel manifest del servizio. Per i servizi esistenti, il tuo manifest ha già l'annotazionecloud.google.com/l4-rbs: "enabled"e puoi lasciarla così com'è.
Limitazioni
- I bilanciatori del carico con protocolli misti supportano solo gli indirizzi IPv4.
Non puoi utilizzare protocolli misti in un manifest di servizio con i seguenti finalizzatori:
gke.networking.io/l4-ilb-v1gke.networking.io/l4-netlb-v1
Se il manifest contiene questi finalizer, devi eliminare e ricreare il servizio in base ai requisiti precedenti.
Prezzi
Google Cloud ti addebita un costo per regola di forwarding, per 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 ulteriori informazioni, consulta Prezzi delle reti 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 workload
Questa sezione mostra come eseguire il deployment di un workload di esempio in ascolto sulle porte TCP e UDP. Tieni presente che la configurazione di Deployment è la stessa sia che utilizzi un servizio LoadBalancer con protocollo misto sia due servizi LoadBalancer con protocollo singolo separati.
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: 8080Applica 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 esponga il deployment al traffico TCP e UDP.
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: 8080Il servizio precedente ha due porte, una per TCP e una per UDP, entrambe sulla porta 8080.
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.
Ispeziona il servizio:
kubectl describe service mixed-protocol-lbL'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-ruleservice.kubernetes.io/udp-forwarding-rule
- La sezione
Eventsnon contiene messaggi di errore.
- Il campo
Aggiorna il bilanciatore del carico con protocollo misto
Puoi aggiornare le porte di un bilanciatore del carico con protocollo misto modificando il manifest di servizio. Per modificare il servizio, esegui questo comando:
kubectl edit service SERVICE_NAME
Sostituisci SERVICE_NAME con il nome del tuo servizio.
Aggiorna 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 a protocollo singolo a protocollo misto
Per modificare un bilanciatore del carico a protocollo singolo in un bilanciatore del carico a 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 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 un singolo protocollo
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 DNS, il 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 bilanciatore del carico con protocollo misto
Per eliminare il servizio LoadBalancer esterno mixed-protocol-lb, esegui questo 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 relativi ai servizi LoadBalancer con protocollo misto.
Controllare gli eventi di errore
Il primo passaggio per la risoluzione dei problemi è controllare gli eventi associati al tuo servizio.
Visualizza i dettagli del tuo servizio:
kubectl describe service mixed-protocol-lbControlla la sezione
Eventsalla fine dell'output per individuare 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 protocolli misti, esegue il provisioning del bilanciatore del carico in modo corretto.
La definizione della porta non è presente dopo un aggiornamento
Sintomo:
Quando aggiorni un servizio che utilizza la stessa porta sia per TCP che per UDP (ad esempio la porta 8080), una delle definizioni di porta non è presente nel servizio aggiornato.
Causa:
Si tratta di un problema noto di 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, il che causa la rimozione di una delle definizioni di porta.
Questo problema riguarda i client che utilizzano le patch lato client, come kubectl apply e
il client Go con le patch di unione.
Soluzione:
La soluzione alternativa a questo problema dipende dal tuo cliente.
Per kubectl: utilizza il flag
--server-sideconkubectl apply:kubectl apply --server-side -f YOUR_SERVICE_MANIFEST.yamlSostituisci
YOUR_SERVICE_MANIFESTcon 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. Ciò richiede una richiesta HTTP
PUTcon l'intera specifica dell'oggetto Service.
Passaggi successivi
- Scopri di più sull'esposizione delle applicazioni tramite i servizi.
- Scopri di più sui servizi LoadBalancer.