Questo tutorial mostra come eseguire un'applicazione web in un Application Load Balancer esterno configurando la risorsa Ingress.
Contesto
Google Kubernetes Engine (GKE) offre supporto integrato per due tipi di Cloud Load Balancing per un'applicazione accessibile pubblicamente:
In questo tutorial, utilizzerai le Ingressi.
In entrata
Quando specifichi kind: Ingress
in un manifest della risorsa, indichi a GKE di creare una risorsa in entrata. Se includi annotazioni e
supporti carichi di lavoro e servizi, puoi creare un controller Ingress personalizzato.
Altrimenti, GKE effettua le chiamate API Google Cloud appropriate per creare un Application Load Balancer esterno. Le regole host e i matcher percorso della mappa URL del bilanciatore del carico fanno riferimento a uno o più servizi di backend, dove ciascun servizio di backend corrisponde a un servizio GKE di tipo NodePort
, come indicato in Ingress
. I backend per ciascun servizio di backend sono gruppi di istanze o gruppi di endpoint di rete (NEG). I NEG vengono creati quando configuri il bilanciamento del carico nativo del container come parte della configurazione di Ingress. Per ogni servizio di backend, GKE crea un controllo di integrità di Google Cloud in base alle impostazioni del probe di idoneità del carico di lavoro a cui fa riferimento il servizio GKE corrispondente.
Se stai esponendo un servizio HTTP(S) ospitato su GKE, il bilanciamento del carico HTTP(S) è il metodo consigliato per il bilanciamento del carico.
Obiettivi
- Creare un cluster GKE.
- Esegui il deployment dell'applicazione web di esempio nel cluster.
- Esponi l'app di esempio su internet con un bilanciatore del carico delle applicazioni esterno.
Costi
In questo documento vengono utilizzati i seguenti componenti fatturabili di Google Cloud:
Per generare una stima dei costi in base all'utilizzo previsto,
utilizza il Calcolatore prezzi.
Una volta completate le attività descritte in questo documento, puoi evitare la fatturazione continua eliminando le risorse che hai creato. Per ulteriori informazioni, consulta la pagina Pulizia.
Prima di iniziare
Segui questi passaggi per abilitare l'API Kubernetes Engine:- Visita la pagina Kubernetes Engine nella console Google Cloud.
- Crea o seleziona un progetto.
- Attendi che l'API e i servizi correlati siano abilitati. Questa operazione può richiedere diversi minuti.
-
Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.
Installa i seguenti strumenti a riga di comando utilizzati in questo tutorial:
-
gcloud
viene utilizzato per creare ed eliminare cluster Kubernetes Engine.gcloud
è incluso nell'interfaccia a riga di comandogcloud
. -
kubectl
viene utilizzato per gestire Kubernetes, il sistema di orchestrazione dei cluster utilizzato da Kubernetes Engine. Puoi installarekubectl
utilizzandogcloud
:gcloud components install kubectl
Clona il codice di esempio da GitHub:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples cd kubernetes-engine-samples/networking/load-balancing
Configura i valori predefiniti per lo strumento a riga di comando gcloud
Per risparmiare tempo nella digitazione delle opzioni dell'ID progetto
e della zona di Compute Engine nello strumento a riga di comando gcloud
, puoi configurare i valori predefiniti:
gcloud config set project project-id gcloud config set compute/zone compute-zone
crea un cluster GKE
Crea un cluster GKE Autopilot:
gcloud container clusters create-auto loadbalancedcluster
Deployment di un'applicazione web
Il seguente manifest descrive un deployment che esegue l'immagine container di applicazione web di esempio su un server HTTP sulla porta 8080:
Applica la risorsa al cluster:
kubectl apply -f web-deployment.yaml
Esposizione del deployment all'interno del cluster
Il seguente manifest descrive un servizio che rende il deployment web
accessibile all'interno del cluster di container:
Applica la risorsa al cluster:
kubectl apply -f web-service.yaml
Quando crei un servizio di tipo NodePort con questo comando, GKE rende disponibile il servizio su un numero di porta elevato selezionato casualmente (ad es. 32640) su tutti i nodi del tuo cluster.
Verifica che il servizio sia creato e che sia allocata una porta del nodo:
kubectl get service web
Output:NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE web NodePort 10.35.245.219 <none> 8080:32640/TCP 5m
Nell'output di esempio, la porta del nodo per il servizio
web
è32640
. Inoltre, tieni presente che non esiste un IP esterno allocato per questo servizio. Poiché i nodi GKE non sono accessibili esternamente per impostazione predefinita, la creazione di questo servizio non rende l'applicazione accessibile da internet.
Per rendere pubblicamente accessibile l'applicazione server web HTTP(S), devi creare una risorsa Ingress.
Creazione di una risorsa Ingress
Ingress è una risorsa Kubernetes che incapsula una raccolta di regole e configurazione per il routing del traffico HTTP(S) esterno ai servizi interni.
In GKE, la risorsa Ingress viene implementata utilizzando Cloud Load Balancing. Quando crei una risorsa Ingress nel tuo cluster, GKE crea un bilanciatore del carico HTTP(S) e lo configura per instradare il traffico alla tua applicazione.
Il seguente manifest descrive una risorsa Ingress che indirizza il traffico al tuo servizio web
:
Applica la risorsa al cluster:
kubectl apply -f basic-ingress.yaml
Dopo aver eseguito il deployment di questo manifest, Kubernetes crea una risorsa Ingress nel cluster. Il controller GKE Ingress crea e configura un bilanciatore del carico HTTP(S) in base alle informazioni presenti nella risorsa Ingress, indirizzando tutto il traffico HTTP esterno (sulla porta 80) al servizio NodePort web
che hai esposto.
Visita dell'applicazione
Per individuare l'indirizzo IP esterno del bilanciatore del carico che gestisce la tua applicazione, esegui:
kubectl get ingress basic-ingressOutput:
NAME HOSTS ADDRESS PORTS AGE basic-ingress * 203.0.113.12 80 2m
Apri l'indirizzo IP esterno dell'applicazione in un browser e visualizza una risposta HTTP di testo normale come la seguente:
Hello, world! Version: 1.0.0 Hostname: web-6498765b79-fq5q5
Puoi visitare il sito Bilanciamento del carico nella console Google Cloud ed esaminare le risorse di networking create dal controller GKE Ingress.
(Facoltativo) Configurare un indirizzo IP statico
Quando esponi un server web su un nome di dominio, è necessario che l'indirizzo IP esterno di un'applicazione sia un IP statico che non cambia.
Per impostazione predefinita, GKE alloca indirizzi IP esterni temporanei per le applicazioni HTTP esposte tramite una risorsa Ingress. Gli indirizzi temporanei sono soggetti a modifica. Se prevedi di eseguire la tua applicazione per un lungo periodo di tempo, devi utilizzare un indirizzo IP esterno statico.
Tieni presente che, dopo aver configurato un IP statico per la risorsa Ingress, l'eliminazione della risorsa Ingress non comporta l'eliminazione dell'indirizzo IP statico associato. Assicurati di ripulire gli indirizzi IP statici che hai configurato quando non prevedi più di riutilizzarli.
Per configurare un indirizzo IP statico, completa i seguenti passaggi:
Prenota un indirizzo IP esterno statico denominato
web-static-ip
:gcloud
gcloud compute addresses create web-static-ip --global
Config Connector
Nota: questo passaggio richiede Config Connector. Segui le istruzioni di installazione per installare Config Connector sul tuo cluster.
Per eseguire il deployment di questo manifest, scaricalo sulla macchina come compute-address.yaml ed esegui:kubectl apply -f compute-address.yaml
Il manifest
basic-ingress-static.yaml
aggiunge un'annotazione su Ingress per utilizzare la risorsa IP statico denominataweb-static-ip
:Visualizza il manifest:
cat basic-ingress-static.yaml
Applica la risorsa al cluster:
kubectl apply -f basic-ingress-static.yaml
Controlla l'indirizzo IP esterno:
kubectl get ingress basic-ingress
Attendi finché l'indirizzo IP dell'applicazione non cambia per utilizzare l'indirizzo IP riservato della risorsa
web-static-ip
.L'aggiornamento della risorsa Ingress esistente, la riconfigurazione del bilanciatore del carico e la propagazione delle regole di bilanciamento del carico nel globo potrebbero richiedere alcuni minuti. Al termine di questa operazione, GKE rilascia l'indirizzo IP temporaneo precedentemente allocato alla tua applicazione.
(Facoltativo) Gestione di più applicazioni su un bilanciatore del carico
Puoi eseguire più servizi su un singolo bilanciatore del carico e un IP pubblico configurando le regole di routing sulla rete Ingress. Ospitando più servizi sulla stessa Ingress, puoi evitare di creare bilanciatori del carico aggiuntivi (che sono risorse fatturabili) per ogni servizio esposto a internet.
Il seguente manifest descrive un deployment con la versione 2.0
della stessa
applicazione web:
Applica la risorsa al cluster:
kubectl apply -f web-deployment-v2.yaml
Il seguente manifest descrive un servizio che espone web2
internamente al cluster su un servizio NodePort denominato web2
:
Applica la risorsa al cluster:
kubectl apply -f web-service-v2.yaml
Il manifest seguente descrive una risorsa Ingress che:
- instrada al servizio
web2
le richieste con un percorso che inizia con/v2/
- instrada tutte le altre richieste al servizio
web
Applica la risorsa al cluster:
kubectl create -f fanout-ingress.yaml
Dopo il deployment di Ingress, esegui kubectl get ingress fanout-ingress
per trovare l'indirizzo IP pubblico del cluster.
Quindi visita l'indirizzo IP per vedere che entrambe le applicazioni sono raggiungibili sullo stesso bilanciatore del carico:
- Visita
http://<IP_ADDRESS>/
e nota che la risposta contieneVersion: 1.0.0
(poiché la richiesta viene instradata al servizioweb
) - Visita
http://<IP_ADDRESS>/v2/
e nota che la risposta contieneVersion: 2.0.0
(poiché la richiesta viene instradata al servizioweb2
)
L'unico carattere jolly supportato per il campo path
di una risorsa Ingress è il carattere *
. Il carattere *
deve seguire una barra (/
) e
deve essere l'ultimo carattere del pattern. Ad esempio, /*
, /foo/*
e
/foo/bar/*
sono pattern validi, al contrario di *
, /foo/bar*
e /foo/*/bar
.
Un pattern più specifico ha la precedenza su un pattern meno specifico. Se
hai sia /foo/*
che /foo/bar/*
, allora /foo/bar/bat
viene considerato come corrispondenza
/foo/bar/*
.
Per ulteriori informazioni sulle limitazioni dei percorsi e sulla corrispondenza dei pattern, consulta la documentazione di URL Maps.
(Facoltativo) Monitorare la disponibilità e la latenza del servizio
I controlli di uptime di Google Cloud eseguono il monitoraggio delle blackbox delle applicazioni dal punto di vista dell'utente, determinando la latenza e la disponibilità da più IP esterni all'indirizzo IP del bilanciatore del carico. In confronto, i controlli di integrità di Google Cloud eseguono un controllo interno sugli IP dei pod, determinando la disponibilità a livello di istanza. I controlli sono complementari e forniscono un quadro olistico dell'integrità dell'applicazione.
Puoi creare un controllo di uptime utilizzando la console Google Cloud, l'API Cloud Monitoring o le librerie client di Cloud Monitoring. Per informazioni, vedi Gestire i controlli di uptime. Se vuoi creare un controllo di uptime utilizzando la console Google Cloud:
Vai alla pagina Servizi e Ingress nella console Google Cloud.
Fai clic sul nome del servizio per cui vuoi creare un controllo di uptime.
Fai clic su Crea controllo di uptime.
Nel riquadro Crea controllo di uptime, inserisci un titolo per il controllo di uptime, quindi fai clic su Avanti per passare alle impostazioni di Destinazione.
I campi Target del controllo di uptime vengono compilati automaticamente utilizzando le informazioni del bilanciatore del carico del servizio.
Per la documentazione completa su tutti i campi di un controllo di uptime, consulta Creare un controllo di uptime.
Fai clic su Avanti per passare alle impostazioni Convalida risposta.
Fai clic su Avanti per passare alla sezione Avviso e notifica.
Per monitorare un controllo di uptime, puoi creare un criterio di avviso o visualizzare la dashboard dei controlli di uptime. Un criterio di avviso può inviarti una notifica via email o attraverso un canale diverso se il controllo di uptime ha esito negativo. Per informazioni generali sui criteri di avviso, consulta Introduzione agli avvisi.
Fai clic su Crea.
Note
Per impostazione predefinita, Ingress esegue un controllo di integrità periodico effettuando una richiesta GET
sul percorso /
per determinare l'integrità dell'applicazione e prevede una risposta HTTP200. Se vuoi controllare un percorso diverso o aspettarti un codice di risposta diverso, puoi utilizzare un percorso di controllo di integrità personalizzato.
Ingress supporta casi d'uso più avanzati, ad esempio:
Hosting virtuale basato sul nome: puoi utilizzare Ingress per riutilizzare il bilanciatore del carico per più nomi di dominio e sottodomini, nonché per esporre più servizi su un singolo indirizzo IP e bilanciatore del carico. Dai un'occhiata agli esempi di fanout semplice e di hosting virtuale basato sui nomi per scoprire come configurare Ingress per queste attività.
Terminazione HTTPS: puoi configurare il traffico in entrata per terminare il traffico HTTPS utilizzando il bilanciatore del carico Cloud.
Quando viene eliminato un Ingress, il controller GKE Ingress elimina automaticamente le risorse associate (tranne gli indirizzi IP statici riservati).
Esegui la pulizia
Per evitare che al tuo Account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, elimina il progetto che contiene le risorse oppure mantieni il progetto ed elimina le singole risorse.
Elimina tutte le regole di forwarding create manualmente e i proxy di destinazione che fanno riferimento al traffico in entrata:
Un proxy di destinazione inutilizzabile che fa riferimento a una mappa URL gestita da un controller GKE Ingress provocherà l'eliminazione della risorsa Ingress nelle versioni di GKE 1.15.4-gke.22+. Controlla la risorsa Ingress per trovare un evento con un messaggio di errore simile al seguente:
Error during GC: error running load balancer garbage collection routine: googleapi: Error 400: The url_map resource 'projects/project-id/global/urlMaps/k8s2-um-tlw9rhgp-default-my-ingress-9ifnni82' is already being used by 'projects/project-id/global/targetHttpsProxies/k8s2-um-tlw9rhgp-default-my82-target-proxy', resourceInUseByAnotherResource
Nel messaggio di errore precedente,
k8s2-um-tlw9rhgp-default-my82-target-proxy
è un proxy https di destinazione creato manualmente che fa ancora riferimento alla mappa URLk8s2-um-tlw9rhgp-default-my-ingress-9ifnni82
, creata e gestita da un controller Ingress.Queste risorse frontend create manualmente (sia regola di forwarding che proxy di destinazione) devono essere eliminate prima di procedere con l'eliminazione della risorsa Ingress.
Elimina il traffico in entrata: questo passaggio posiziona l'indirizzo IP esterno temporaneo e le risorse di bilanciamento del carico associate all'applicazione:
kubectl delete ingress basic-ingress
Se hai seguito il passaggio facoltativo per creare una risorsa Ingress per instradare le richieste in base al percorso, elimina la risorsa Ingress:
kubectl delete ingress fanout-ingress
Elimina l'indirizzo IP statico: completa questo passaggio solo se hai seguito il passaggio facoltativo per creare un indirizzo IP statico.
Se hai seguito "Opzione 1" per convertire un indirizzo IP temporaneo esistente in IP statico, visita la console Google Cloud per eliminare l'indirizzo IP statico.
Se hai seguito "Opzione 2" per creare un nuovo indirizzo IP statico, esegui questo comando per eliminarlo:
gcloud compute addresses delete web-static-ip --global
Elimina il cluster: questo passaggio elimina i nodi di calcolo del cluster di container e altre risorse, ad esempio i deployment nel cluster:
gcloud container clusters delete loadbalancedcluster
Passaggi successivi
- Consulta la guida dell'utente di Ingress per informazioni dettagliate sulle funzionalità di Ingress.
- Configura un IP statico e un nome di dominio per la tua applicazione Ingress utilizzando Ingress.
- Configura i certificati SSL per il bilanciatore del carico Ingress.
- Scopri di più sull'utilizzo dei certificati SSL gestiti da Google con Ingress.
Se hai un'applicazione in esecuzione su più cluster Kubernetes Engine in diverse regioni, configura un Ingress multi-cluster per instradare il traffico a un cluster nella regione più vicina all'utente.
Esplora altri tutorial su Kubernetes Engine.
Esplora le architetture di riferimento, i diagrammi e le best practice su Google Cloud. Visita il nostro Cloud Architecture Center.