Questa pagina spiega come utilizzare il bilanciamento del carico nativo dei container in Google Kubernetes Engine (GKE). Il bilanciamento del carico nativo del container consente ai bilanciatori del carico di scegliere come target direttamente i pod Kubernetes e di distribuire uniformemente il traffico tra i pod.
Per ulteriori informazioni sui vantaggi, sui requisiti e sulle limitazioni del bilanciamento del carico nativo del container, consulta Bilanciamento del carico nativo del container.
Prima di iniziare
Prima di iniziare, assicurati di aver eseguito le seguenti operazioni:
- Attiva l'API Google Kubernetes Engine. Abilita l'API Google Kubernetes Engine
- Se vuoi utilizzare Google Cloud CLI per questa attività,
install e poi
inizializzare
con gcloud CLI. Se hai già installato gcloud CLI, scarica la versione più recente
eseguendo
gcloud components update
.
Utilizzare il bilanciamento del carico nativo del container
Le sezioni seguenti illustrano il bilanciamento del carico nativo del container.
configurazione su GKE. Tieni presente che per i cluster GKE che eseguono la versione 1.17 o successive e in determinate condizioni, il bilanciamento del carico nativo dei container è predefinito e non richiede un'annotazione del servizio cloud.google.com/neg: '{"ingress": true}'
esplicita.
Crea un cluster nativo di VPC
Per utilizzare il bilanciamento del carico nativo del container, nel cluster GKE devono essere attivati gli indirizzi IP alias.
Ad esempio, il comando seguente crea un cluster GKE,
neg-demo-cluster
, con una subnet di cui è stato eseguito il provisioning automatico:
Per la modalità Autopilot, gli indirizzi IP alias sono abilitati per impostazione predefinita:
gcloud container clusters create-auto neg-demo-cluster \ --location=COMPUTE_LOCATION
Sostituisci
COMPUTE_LOCATION
con Località di Compute Engine per il cluster.
Per la modalità standard, attiva gli indirizzi IP alias quando crei il cluster:
gcloud container clusters create neg-demo-cluster \ --enable-ip-alias \ --create-subnetwork="" \ --network=default \ --zone=us-central1-a
Creazione di un deployment
L'esempio seguente
Deployment,
neg-demo-app
esegue una singola istanza di un server HTTP containerizzato. Ti consigliamo di utilizzare carichi di lavoro che utilizzano il feedback sulla preparazione dei pod.
Utilizzare il feedback relativo all'idoneità dei pod
apiVersion: apps/v1 kind: Deployment metadata: labels: run: neg-demo-app # Label for the Deployment name: neg-demo-app # Name of Deployment spec: selector: matchLabels: run: neg-demo-app template: # Pod template metadata: labels: run: neg-demo-app # Labels Pods from this Deployment spec: # Pod specification; each Pod created by this Deployment has this specification containers: - image: registry.k8s.io/serve_hostname:v1.4 # Application to run in Deployment's Pods name: hostname # Container name ports: - containerPort: 9376 protocol: TCP
Utilizzare un ritardo hardcoded
apiVersion: apps/v1 kind: Deployment metadata: labels: run: neg-demo-app # Label for the Deployment name: neg-demo-app # Name of Deployment spec: minReadySeconds: 60 # Number of seconds to wait after a Pod is created and its status is Ready selector: matchLabels: run: neg-demo-app template: # Pod template metadata: labels: run: neg-demo-app # Labels Pods from this Deployment spec: # Pod specification; each Pod created by this Deployment has this specification containers: - image: registry.k8s.io/serve_hostname:v1.4 # Application to run in Deployment's Pods name: hostname # Container name # Note: The following line is necessary only on clusters running GKE v1.11 and lower. # For details, see https://cloud.google.com/kubernetes-engine/docs/how-to/container-native-load-balancing#align_rollouts ports: - containerPort: 9376 protocol: TCP terminationGracePeriodSeconds: 60 # Number of seconds to wait for connections to terminate before shutting down Pods
In questo deployment, ogni contenitore esegue un server HTTP. Il server HTTP restituisce il nome host del server delle applicazioni (il nome del pod su cui server) come risposta.
Salva questo manifest con il nome neg-demo-app.yaml
, quindi crea il deployment:
kubectl apply -f neg-demo-app.yaml
Crea un servizio per un bilanciatore del carico nativo del container
Dopo aver creato un deployment, devi raggruppare i relativi pod in un servizio.
Il seguente servizio di esempio, neg-demo-svc
, ha come target il deployment di esempio che
creato nella sezione precedente:
apiVersion: v1
kind: Service
metadata:
name: neg-demo-svc # Name of Service
annotations:
cloud.google.com/neg: '{"ingress": true}' # Creates a NEG after an Ingress is created
spec: # Service's specification
type: ClusterIP
selector:
run: neg-demo-app # Selects Pods labelled run: neg-demo-app
ports:
- name: http
port: 80 # Service's port
protocol: TCP
targetPort: 9376
L'annotazione del servizio, cloud.google.com/neg: '{"ingress": true}'
, attiva il bilanciamento del carico nativo del container. Tuttavia, il bilanciatore del carico non viene creato finché non crei un Ingress per il servizio.
Salva questo manifest come neg-demo-svc.yaml
, quindi crea il servizio:
kubectl apply -f neg-demo-svc.yaml
Crea un Ingress per il servizio
L'esempio seguente
In entrata,
neg-demo-ing
ha come target il servizio che hai creato:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: neg-demo-ing
spec:
defaultBackend:
service:
name: neg-demo-svc # Name of the Service targeted by the Ingress
port:
number: 80 # Should match the port used by the Service
Salva questo manifest come neg-demo-ing.yaml
, quindi crea l'oggetto Ingress:
kubectl apply -f neg-demo-ing.yaml
Al momento della creazione di Ingress, nel progetto viene creato un bilanciatore del carico delle applicazioni e vengono creati gruppi di endpoint di rete (NEG) in ogni zona in cui viene eseguito il cluster. Gli endpoint nel NEG e gli endpoint del servizio vengono mantenuti sincronizzati.
Verifica il traffico in entrata
Dopo aver eseguito il deployment di un carico di lavoro, raggruppato i relativi pod in un servizio e creato un Ingress per il servizio, devi verificare che l'Ingress abbia eseguito il provisioning del bilanciatore del carico nativo del container.
Recupera lo stato dell'Ingress:
kubectl describe ingress neg-demo-ing
L'output include gli eventi ADD
e CREATE
:
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ADD 16m loadbalancer-controller default/neg-demo-ing
Normal Service 4s loadbalancer-controller default backend set to neg-demo-svc:32524
Normal CREATE 2s loadbalancer-controller ip: 192.0.2.0
Testa il bilanciatore del carico
Le sezioni seguenti spiegano come testare la funzionalità di un bilanciatore del carico nativo per i container.
Visita l'indirizzo IP di Ingress
Attendi alcuni minuti per la configurazione del bilanciatore del carico delle applicazioni.
Puoi verificare che il bilanciatore del carico nativo del container funzioni visitando l'indirizzo IP di Ingress.
Per ottenere l'indirizzo IP di Ingress, esegui il seguente comando:
kubectl get ingress neg-demo-ing
Nell'output del comando, l'indirizzo IP di Ingress viene visualizzato nella colonna ADDRESS
. Visita l'indirizzo IP in un browser web.
Controllare lo stato di salute del servizio di backend
Puoi anche ottenere lo stato di integrità del servizio di backend del bilanciatore del carico.
Recupera un elenco dei servizi di backend in esecuzione nel tuo progetto:
gcloud compute backend-services list
Registra il nome del servizio di backend che include il nome del servizio, ad esempio
neg-demo-svc
.Visualizza lo stato di integrità del servizio di backend:
gcloud compute backend-services get-health BACKEND_SERVICE_NAME --global
Sostituisci
BACKEND_SERVICE_NAME
con il nome del di servizio di backend.
Testa il traffico in entrata
Un altro modo per verificare che il bilanciatore del carico funzioni come previsto è scalare il deployment di esempio, inviare richieste di test a Ingress verificando che risponda il numero corretto di repliche.
Scala il deployment
neg-demo-app
da un'istanza a due istanze:kubectl scale deployment neg-demo-app --replicas 2
Il completamento di questo comando potrebbe richiedere diversi minuti.
Verifica che l'implementazione sia completa:
kubectl get deployment neg-demo-app
L'output dovrebbe includere due repliche disponibili:
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE neg-demo-app 2 2 2 2 26m
Ottieni l'indirizzo IP di Ingress:
kubectl describe ingress neg-demo-ing
Se questo comando restituisce un errore 404, attendi qualche minuto per l'avvio del bilanciatore del carico, quindi riprova.
Conta il numero di risposte distinte del bilanciatore del carico:
for i in `seq 1 100`; do \ curl --connect-timeout 1 -s IP_ADDRESS && echo; \ done | sort | uniq -c
Sostituisci
IP_ADDRESS
con l'indirizzo IP di Ingress.L'output è simile al seguente:
44 neg-demo-app-7f7dfd7bc6-dcn95 56 neg-demo-app-7f7dfd7bc6-jrmzf
In questo output, il numero di risposte distinte è uguale al numero di repliche, il che indica che tutti i pod di backend gestiscono il traffico.
Esegui la pulizia
Dopo aver completato le attività in questa pagina, segui questi passaggi per rimuovere per evitare addebiti indesiderati sul tuo account:
Elimina il cluster
gcloud
gcloud container clusters delete neg-demo-cluster
Console
Vai alla pagina Google Kubernetes Engine nella console Google Cloud.
Seleziona neg-demo-cluster e fai clic su delete Elimina.
Quando ti viene richiesto di confermare, fai clic su Elimina.
Risoluzione dei problemi
Utilizza le tecniche riportate di seguito per verificare la configurazione di rete. Le seguenti sezioni spiegano come risolvere problemi specifici relativi al bilanciamento del carico nativo dei container.
Consulta la documentazione sul bilanciamento del carico per scoprire come elencare i gruppi di endpoint di rete.
Puoi trovare il nome e le zone del NEG che corrisponde a un servizio in l'annotazione
neg-status
del servizio. Ottieni la specifica del servizio con:kubectl get svc SVC_NAME -o yaml
L'annotazione
metadata:annotations:cloud.google.com/neg-status
elenca il nome del NEG corrispondente del servizio e le zone del NEG.Puoi controllare l'integrità del servizio di backend che corrisponde a un NEG con il seguente comando:
gcloud compute backend-services --project PROJECT_NAME \ get-health BACKEND_SERVICE_NAME --global
Il servizio di backend ha lo stesso nome del relativo NEG.
Per stampare i log eventi di un servizio:
kubectl describe svc SERVICE_NAME
La stringa del nome del servizio include il nome e lo spazio dei nomi del servizio GKE corrispondente.
Impossibile creare un cluster con IP alias
- Sintomi
Quando provi a creare un cluster con IP alias, potresti riscontrare il seguente errore:
ResponseError: code=400, message=IP aliases cannot be used with a legacy network.
- Potenziali cause
Questo errore si verifica se provi a creare un cluster con IP alias che utilizza anche una rete precedente.
- Risoluzione
Assicurati di non creare un cluster con IP alias e una rete legacy attivate contemporaneamente. Per ulteriori informazioni sull'uso degli IP alias, consulta Crea un cluster nativo di VPC.
Il traffico non raggiunge gli endpoint
- Sintomi
- Errori 502/503 o connessioni rifiutate.
- Possibili cause
In genere, i nuovi endpoint diventano raggiungibili dopo l'attacco al bilanciatore del carico, a condizione che rispondano ai controlli di integrità. Potresti riscontrare errori 502 o connessioni rifiutate se il traffico non riesce a raggiungere gli endpoint.
Gli errori 502 e le connessioni rifiutate possono essere causati anche da un container che non gestisce
SIGTERM
. Se un contenitore non gestisce esplicitamenteSIGTERM
, si chiude immediatamente e smette di gestire le richieste. Il bilanciatore del carico continua a inviare traffico in entrata al container terminato, causando errori.Il bilanciatore del carico nativo del container ha un solo endpoint di backend. Durante un aggiornamento progressivo, l'endpoint precedente viene deprogrammato prima che venga programmato quello nuovo.
Il deployment dei pod di backend viene eseguito in una nuova zona per la prima volta dopo viene eseguito il provisioning del bilanciatore del carico nativo del container. L'infrastruttura del bilanciatore del carico viene programmata in una zona se è presente almeno un endpoint. Quando viene aggiunto un nuovo endpoint a una zona, l'infrastruttura del bilanciatore del carico viene programmata e causa interruzioni del servizio.
- Risoluzione
Configura i contenitori per gestire
SIGTERM
e continuare a rispondere alle richieste durante il periodo di tolleranza per il recesso (30 secondi per impostazione predefinita). Configura i pod per iniziare a non superare i controlli di integrità quando ricevonoSIGTERM
. Questo indica al bilanciatore del carico di interrompere l'invio di traffico al pod mentre la deprogrammazione dell'endpoint è in corso.Se la tua applicazione non si arresta normalmente e smette di rispondere a alle richieste quando si riceve un
SIGTERM
, gancio pre-interruzione può essere utilizzato per gestireSIGTERM
e continuare a gestire il traffico mentre l'endpoint è in corso la deprogrammazione.lifecycle: preStop: exec: # if SIGTERM triggers a quick exit; keep serving traffic instead command: ["sleep","60"]
Consulta la documentazione sull'interruzione dei pod.
Se il backend del bilanciatore del carico ha una sola istanza, configura il rollback la strategia per evitare di eliminare l'unica istanza prima della nuova sia completamente programmato. Per i pod delle applicazioni gestiti dal carico di lavoro
Deployment
, puoi farlo configurando l'implementazione strategia con parametromaxUnavailable
uguale a0
.strategy: rollingUpdate: maxSurge: 1 maxUnavailable: 0
Per risolvere i problemi relativi al traffico che non raggiunge gli endpoint, verifica che le regole firewall consenti il traffico TCP in entrata verso gli endpoint in
130.211.0.0/22
e Intervalli35.191.0.0/16
. Per saperne di più, consulta Aggiunta di controlli di integrità nel documentazione di Cloud Load Balancing.Visualizza i servizi di backend nel tuo progetto. La stringa del nome del segmento include il nome e lo spazio dei nomi del servizio di backend Servizio GKE:
gcloud compute backend-services list
Recupera lo stato di integrità del backend dal servizio di backend:
gcloud compute backend-services get-health BACKEND_SERVICE_NAME
Se tutti i backend non sono integri, il firewall, Ingress o il servizio potrebbe essere configurato in modo errato.
Se alcuni backend non sono integri per un breve periodo di tempo, la programmazione di rete potrebbe essere la causa.
Se alcuni backend non compaiono nell'elenco dei servizi di backend, la programmazione potrebbe essere la causa. Puoi verificarlo eseguendo il comando seguente, dove
NEG_NAME
è il nome del servizio di backend. (I NEG e i servizi di backend condividono lo stesso nome):gcloud compute network-endpoint-groups list-network-endpoints NEG_NAME
Controlla se tutti gli endpoint previsti si trovano nel NEG.
Se hai un numero ridotto di backend (ad esempio un pod) selezionati da un bilanciatore del carico nativo dei container, ti consigliamo di aumentare il numero di repliche e distribuire i pod di backend in tutte le zone in cui si estende il cluster GKE. In questo modo, l'infrastruttura del bilanciatore del carico sottostante sarà completamente programmata. In caso contrario, valuta la possibilità di limitare i pod di backend in una singola zona.
Se configuri un criterio di rete per l'endpoint, assicurati che l'ingresso dalla subnet solo proxy sia consentito.
Implementazione bloccata
- Sintomi
- L'implementazione di un deployment aggiornato si blocca e il numero di repliche aggiornate non corrisponde al numero di repliche desiderato.
- Potenziali cause
I controlli di integrità del deployment non sono riusciti. L'immagine del contenitore potrebbe essere danneggiata o il controllo di integrità potrebbe essere configurato in modo errato. La sostituzione graduale dei pod attende che il pod appena avviato superi il controllo di idoneità dei pod. Ciò si verifica solo se il pod risponde ai controlli di integrità del bilanciatore del carico. Se il pod non risponde o, se il controllo di integrità non è configurato correttamente, il controllo di condizioni non possono essere soddisfatte e l'implementazione non può continuare.
Se utilizzi
kubectl
1.13 o versioni successive, puoi controllare lo stato dei gate di idoneità di un pod con il seguente comando:kubectl get pod POD_NAME -o wide
Controlla la colonna
READINESS GATES
.Questa colonna non esiste in
kubectl
1.12 e versioni precedenti. Un pod contrassegnato come in statoREADY
potrebbe avere un controllo di idoneità non superato. Per verificare utilizza questo comando:kubectl get pod POD_NAME -o yaml
I gate di idoneità e il relativo stato sono elencati nell'output.
- Risoluzione
Verifica che l'immagine container nella specifica dei pod del deployment sia funziona correttamente ed è in grado di rispondere ai controlli di integrità. Verifica che che i controlli di integrità siano configurati correttamente.
Errori di modalità con prestazioni ridotte
- Sintomi
A partire dalla versione di GKE 1.29.2-gke.1643000, potresti ricevere i seguenti avvisi sul tuo servizio in Esplora log quando vengono aggiornati i NEG:
Entering degraded mode for NEG <service-namespace>/<service-name>-<neg-name>... due to sync err: endpoint has missing nodeName field
- Potenziali cause
Questi avvisi indicano che GKE ha rilevato l'endpoint configurazioni errate durante un aggiornamento del NEG in base a
EndpointSlice
oggetti, che attivano un processo di calcolo più approfondito chiamato degrado . GKE continua ad aggiornare i NEG secondo il criterio del "best effort", correggendo l'errata configurazione o escludendo gli endpoint non validi dagli aggiornamenti del NEG.Ecco alcuni errori comuni:
endpoint has missing pod/nodeName field
endpoint corresponds to an non-existing pod/node
endpoint information for attach/detach operation is incorrect
- Risoluzione
In genere, gli stati transitori causano questi eventi e sono fissi autonomamente. Tuttavia, gli eventi causati da configurazioni errate negli oggetti
EndpointSlice
personalizzati rimangono irrisolti. Per comprendere l'errata configurazione, esamina gli oggettiEndpointSlice
corrispondenti al servizio:kubectl get endpointslice -l kubernetes.io/service-name=<service-name>
Convalida ogni endpoint in base all'errore nell'evento.
Per risolvere il problema, devi modificare manualmente gli oggetti
EndpointSlice
. L'aggiornamento attiva un nuovo aggiornamento dei NEG. Quando l'errore di configurazione non esiste più, l'output è simile al seguente:NEG <service-namespace>/<service-name>-<neg-name>... is no longer in degraded mode
Problemi noti
Il bilanciamento del carico nativo del container su GKE ha i seguenti problemi:
Garbage collection incompleta
La garbage collection GKE raccoglie bilanciatori del carico nativi del container ogni due minuti. Se un cluster viene eliminato prima che i bilanciatori del carico vengano completamente rimossi, devi eliminare manualmente i NEG del bilanciatore del carico.
Visualizza i NEG nel tuo progetto eseguendo il seguente comando:
gcloud compute network-endpoint-groups list
Nell'output del comando, cerca i NEG pertinenti.
Per eliminare un NEG, esegui il seguente comando, sostituendo NEG_NAME
con il nome del NEG:
gcloud compute network-endpoint-groups delete NEG_NAME
Allinea le implementazioni dei carichi di lavoro con la propagazione degli endpoint
Quando esegui il deployment di un carico di lavoro nel cluster o aggiorni un carico di lavoro esistente, il bilanciatore del carico nativo del container può richiedere più tempo per propagare i nuovi endpoint rispetto al tempo necessario per completare l'implementazione del carico di lavoro. Il deployment di esempio
che distribuisci in questa guida usa due campi per allineare l'implementazione con
propagazione degli endpoint: terminationGracePeriodSeconds
e minReadySeconds
.
terminationGracePeriodSeconds
permette al pod
arrestato in modo controllato attendendo che le connessioni vengano terminate dopo che un pod
e ne è stata pianificata l'eliminazione.
minReadySeconds
aggiunge un periodo di latenza dopo che un pod
è stato creato. Specifica il numero minimo di secondi di cui deve essere eseguito il nuovo pod
nel
Stato Ready
,
senza che si verifichi un arresto anomalo di nessuno dei suoi container,
affinché il pod sia considerato disponibile.
Devi configurare i valori minReadySeconds
e
terminationGracePeriodSeconds
dei carichi di lavoro in modo che siano pari o superiori a 60 secondi per assicurarti
che il servizio non venga interrotto a causa dell'implementazione dei carichi di lavoro.
terminationGracePeriodSeconds
è disponibile in tutte le specifiche dei pod e
minReadySeconds
è disponibile per i deployment e i DaemonSet.
Per scoprire di più sull'ottimizzazione delle implementazioni, consulta RollingUpdateStrategy.
initialDelaySeconds
nel pod readinessProbe
non rispettata
Potresti aspettarti la configurazione initialDelaySeconds
nel pod
readinessProbe
il bilanciatore del carico nativo del container deve essere rispettato. tuttavia, readinessProbe
è implementato da kubelet, mentre i controlli di configurazione initialDelaySeconds
il controllo di integrità kubelet, non
il bilanciatore del carico nativo del container. Nativo del container
il bilanciamento del carico dispone di un proprio controllo di integrità del bilanciamento del carico.
Passaggi successivi
- Scopri di più sui NEG.
- Scopri di più sui cluster nativi di VPC.