Questo documento mostra come esporre un'applicazione in esecuzione in un cluster Google Kubernetes Engine (GKE) utilizzando un servizio LoadBalancer esterno o interno con protocollo misto per il traffico TCP e UDP.
Per saperne di più sui bilanciatori del carico L4, consulta Informazioni sui servizi LoadBalancer.
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 esaurimento delle quote di indirizzi IP.
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 IP e un insieme consolidato di regole di forwarding per entrambi i protocolli. Questa funzionalità è supportata sia per i bilanciatori del carico di rete passthrough esterni regionali sia per i bilanciatori del carico di rete passthrough interni.
GKE supporta i servizi con protocollo misto con configurazioni IPv4, IPv6 e dual-stack. I servizi con protocollo misto utilizzano regole di forwarding di livello 3 (L3). Per progettazione, queste regole inoltrano tutto il traffico in arrivo all'indirizzo IP virtuale (VIP) del bilanciatore del carico direttamente ai nodi del cluster.
Per mantenere la sicurezza, GKE crea e gestisce automaticamente le regole firewall con priorità 999 che consentono solo il traffico TCP e UDP specifico definito nel manifest del servizio. Tutto il resto del traffico non autorizzato indirizzato all'indirizzo VIP del bilanciatore del carico viene bloccato dalle regole firewall gestite da GKE utilizzando la priorità 1000. Se crei regole firewall con priorità più alta, assicurati che le regole non consentano accidentalmente al traffico non autorizzato di raggiungere i nodi. Per saperne di più, consulta Regole firewall del servizio GKE.
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 updatecomando. 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 che utilizzi protocolli misti, il cluster deve soddisfare i seguenti requisiti:
- Il bilanciamento del carico con protocollo misto è disponibile a livello di disponibilità generale a partire da GKE versione 1.36.2-gke.1498000 e successive. La versione di disponibilità generale supporta sia i bilanciatori del carico esterni sia quelli interni con configurazioni IPv4, IPv6 e dual-stack.
- Per le versioni da 1.34.1-gke.2190000 a 1.36.2-gke.1498000, il bilanciamento del carico con protocollo misto è supportato solo per i bilanciatori del carico esterni che utilizzano indirizzi IPv4.
- Devi aver abilitato l'addon
HttpLoadBalancingnel cluster. - Per i bilanciatori del carico interni, il cluster deve avere l'impostazione secondaria GKE abilitata.
- Per i nuovi servizi LoadBalancer interni, nel manifest del servizio imposta il valore del campo
spec.loadBalancerClasssunetworking.gke.io/l4-regional-internal. Per i servizi interni esistenti, il manifest ha già l'annotazionenetworking.gke.io/load-balancer-type: "Internal"e puoi lasciarla così com'è. - Per i nuovi servizi LoadBalancer esterni, imposta il campo
spec.loadBalancerClasssunetworking.gke.io/l4-regional-externalnel manifest del servizio. Per i servizi esterni esistenti, il manifest ha già l'cloud.google.com/l4-rbs: "enabled"annotazione e puoi lasciare l' annotazione così com'è.
Limitazioni
- Nelle versioni da 1.34.1-gke.2190000 a 1.36.2-gke.1498000, i bilanciatori del carico con protocollo misto supportano solo gli indirizzi IPv4.
- I servizi esistenti con i finalizzatori
gke.networking.io/l4-ilb-v1ogke.networking.io/l4-netlb-v1non possono essere utilizzati per il bilanciamento del carico con protocollo misto. Se vuoi utilizzare protocolli misti su questi servizi, devi eliminare e ricreare il servizio in base ai requisiti precedenti. - L'aggiornamento delle porte del servizio potrebbe causare una breve interruzione del traffico per tutto il traffico instradato tramite il bilanciatore del carico.
- Non puoi collegare Private Service Connect ai servizi con protocollo misto.
Prezzi
Cloud de Confiance ti addebita i costi 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 saperne di più, consulta Prezzi della rete VPC.
| Tipo | Livello di trasporto | Livello internet | Numero di regole di forwarding | Numero di indirizzi IP esterni |
|---|---|---|---|---|
| Interno | Singolo o misto (TCP, UDP o entrambi) | IPv4 | 1 | 0 |
| IPv6 | 1 | 0 | ||
| IPv4 e IPv6 (DualStack) | 2 | 0 | ||
| Esterno | Singolo o misto (TCP, UDP o entrambi) | IPv4 | 1 | 1 |
| IPv6 | 1 | 1 | ||
| IPv4 e IPv6 (DualStack) | 2 | 2 |
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.
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. Puoi creare un bilanciatore del carico esterno o interno.
Per creare un bilanciatore del carico esterno, salva il seguente manifest come
mixed-protocol-lb.yaml:apiVersion: v1 kind: Service metadata: name: mixed-protocol-external-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: 8080Per creare un bilanciatore del carico interno, imposta il valore del campo
spec.loadBalancerClasssunetworking.gke.io/l4-regional-internal.Il 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.
Esamina il servizio:
kubectl describe service SERVICE_NAMESostituisci
SERVICE_NAMEcon il nome del servizio (ad esempiomixed-protocol-lb).L'output mostra l'indirizzo IP del bilanciatore del carico e le regole di forwarding. Verifica i seguenti dettagli nell'output:
- Il campo
status.loadBalancer.ingress.ipè compilato. - Per i cluster nelle versioni da 1.34.1-gke.2190000 a 1.36.2-gke.1498000, verifica che siano presenti le seguenti annotazioni per il bilanciatore del carico esterno:
service.kubernetes.io/tcp-forwarding-ruleservice.kubernetes.io/udp-forwarding-rule
- Per i cluster creati nelle versioni successive alla 1.36.2-gke.1498000, verifica che siano presenti le seguenti annotazioni per il bilanciatore del carico, a seconda della configurazione:
- Per IPv4:
service.kubernetes.io/l3-forwarding-rule - Per IPv6:
service.kubernetes.io/l3-forwarding-rule-ipv6 - Per dual-stack: entrambe le annotazioni.
- Per IPv4:
- 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 del servizio. Per modificare il servizio, esegui il comando seguente:
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" # for internal LB, use: "networking.gke.io/l4-regional-internal"
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 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" # for internal LB, use: "networking.gke.io/l4-regional-internal"
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 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" # for internal LB, use: "networking.gke.io/l4-regional-internal"
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 con protocollo misto, esegui il comando seguente:
kubectl delete service SERVICE_NAME
Sostituisci SERVICE_NAME con il nome del servizio (ad esempio mixed-protocol-external-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.
Verifica la presenza di eventi di errore
Il primo passo per la risoluzione dei problemi è controllare gli eventi associati al servizio.
Recupera i dettagli del servizio:
kubectl describe service SERVICE_NAMESostituisci
SERVICE_NAMEcon il nome del servizio.Esamina la sezione
Eventsalla fine dell'output per verificare la presenza di messaggi di errore.
Errore: Mixed Protocol is not supported for 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-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. È necessaria una richiesta HTTP
PUTcon l'intera specifica dell'oggetto Service.
Passaggi successivi
- Scopri di più su come esporre le applicazioni utilizzando i servizi.
- Leggi i servizi LoadBalancer.