Questa pagina mostra come configurare un bilanciatore del carico delle applicazioni esterno creando un oggetto Kubernetes Ingress.
Prima di leggere questa pagina, assicurati di avere familiarità con i concetti di networking di 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
- Per 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.
Attiva il componente aggiuntivo HttpLoadBalancing
Il cluster deve avere il componente aggiuntivo HttpLoadBalancing abilitato. Questo componente aggiuntivo è
attivato per impostazione predefinita. Nei cluster Autopilot, non puoi disattivare questo componente aggiuntivo.
Puoi attivare il componente aggiuntivo HttpLoadBalancing utilizzando la console Google Cloud o Google Cloud CLI.
Console
Vai alla pagina Google Kubernetes Engine nella console Google Cloud .
Fai clic sul nome del cluster da modificare.
In Networking, nel campo Bilanciamento del carico HTTP, fai clic su edit Modifica bilanciamento del carico HTTP.
Seleziona la casella di controllo Abilita bilanciamento del carico HTTP.
Fai clic su Salva modifiche.
gcloud
gcloud container clusters update CLUSTER_NAME --update-addons=HttpLoadBalancing=ENABLED
Sostituisci CLUSTER_NAME con il nome del tuo cluster.
Crea un indirizzo IP statico
Un bilanciatore del carico delle applicazioni esterno fornisce un indirizzo IP stabile che puoi utilizzare per instradare le richieste a uno o più servizi. Se vuoi un indirizzo IP permanente, devi prenotare un indirizzo IP esterno statico globale prima di creare un Ingress.
Se modifichi una risorsa Ingress esistente per utilizzare un indirizzo IP statico anziché un indirizzo IP temporaneo, GKE potrebbe modificare l'indirizzo IP del bilanciatore del carico quando ricrea la regola di forwarding del bilanciatore del carico.
Crea un bilanciatore del carico delle applicazioni esterno
In questo esercizio, configurerai un bilanciatore del carico delle applicazioni esterno per instradare le richieste a servizi diversi a seconda del percorso dell'URL.
Per seguire le indicazioni dettagliate per questa attività direttamente nella console Google Cloud , fai clic su Procedura guidata:
Crea deployment e servizi
Crea due deployment con servizi denominati hello-world-1 e hello-world-2:
Salva il seguente manifest come
hello-world-deployment-1.yaml:apiVersion: apps/v1 kind: Deployment metadata: name: hello-world-deployment-1 spec: selector: matchLabels: greeting: hello version: one replicas: 3 template: metadata: labels: greeting: hello version: one spec: containers: - name: hello-app-1 image: "us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0" env: - name: "PORT" value: "50000"Questo manifest descrive un deployment di esempio con tre repliche.
Applica il manifest al cluster:
kubectl apply -f hello-world-deployment-1.yamlSalva il seguente manifest come
hello-world-service-1.yaml:apiVersion: v1 kind: Service metadata: name: hello-world-1 spec: type: NodePort selector: greeting: hello version: one ports: - protocol: TCP port: 60000 targetPort: 50000Questo manifest descrive un servizio con le seguenti proprietà:
- Qualsiasi pod con l'etichetta
greeting: helloe l'etichettaversion: oneè membro del servizio. - GKE inoltra le richieste inviate al servizio sulla porta TCP 60000 a uno dei pod membri sulla porta TCP 50000.
- Il tipo di servizio è
NodePort, che è obbligatorio a meno che tu non utilizzi il bilanciamento del carico nativo dei container. Se utilizzi il bilanciamento del carico nativo del container, non esiste alcuna limitazione sul tipo di servizio, ma ti consigliamo di utilizzare un servizio ditype ClusterIP, a meno che tu non abbia esplicitamente bisogno del nodePort fornito da un servizio NodePort. I servizi LoadBalancer non sono supportati come backend Ingress.
- Qualsiasi pod con l'etichetta
Applica il manifest al cluster:
kubectl apply -f hello-world-service-1.yamlSalva il seguente manifest come
hello-world-deployment-2.yaml:apiVersion: apps/v1 kind: Deployment metadata: name: hello-world-deployment-2 spec: selector: matchLabels: greeting: hello version: two replicas: 3 template: metadata: labels: greeting: hello version: two spec: containers: - name: hello-app-2 image: "us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0" env: - name: "PORT" value: "8080"Questo manifest descrive un deployment di esempio con tre repliche.
Applica il manifest al cluster:
kubectl apply -f hello-world-deployment-2.yamlSalva il seguente manifest come
hello-world-service-2.yaml:apiVersion: v1 kind: Service metadata: name: hello-world-2 spec: type: NodePort selector: greeting: hello version: two ports: - protocol: TCP port: 80 targetPort: 8080Questo manifest descrive un servizio con le seguenti proprietà:
- Qualsiasi pod con l'etichetta
greeting: helloe l'etichettaversion: twoè membro del servizio. - GKE inoltra le richieste inviate al servizio sulla porta TCP 80 a uno dei pod membri sulla porta TCP 8080.
- Qualsiasi pod con l'etichetta
Applica il manifest al cluster:
kubectl apply -f hello-world-service-2.yaml
Crea una risorsa Ingress
Crea un Ingress che specifica le regole per l'instradamento delle richieste in base al percorso dell'URL nella richiesta. Quando crei Ingress, il controller Ingress di GKE crea e configura un bilanciatore del carico delle applicazioni esterno.
Salva il seguente manifest come
my-ingress.yaml:apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-ingress annotations: # If the class annotation is not specified it defaults to "gce". kubernetes.io/ingress.class: "gce" spec: rules: - http: paths: - path: /* pathType: ImplementationSpecific backend: service: name: hello-world-1 port: number: 60000 - path: /v2 pathType: ImplementationSpecific backend: service: name: hello-world-2 port: number: 80Questo manifest descrive un Ingress con le seguenti proprietà:
Esistono due classi GKE Ingress. Per specificare una classe Ingress, devi utilizzare l'annotazione
kubernetes.io/ingress.class. Non puoi specificare un GKE Ingress utilizzandospec.ingressClassName.La classe
gceesegue il deployment di un bilanciatore del carico delle applicazioni esterno.La classe
gce-internalesegue il deployment di un bilanciatore del carico delle applicazioni interno.Quando esegui il deployment di una risorsa Ingress senza le annotazioni
spec.ingressClassNameekubernetes.io/ingress.class, GKE crea un bilanciatore del carico delle applicazioni esterno. Questo è lo stesso comportamento che si verifica se specifichi l'annotazionekubernetes.io/ingress.class: gce. Per saperne di più, consulta Comportamento del controller Ingress GKE.GKE crea un Google Cloud servizio di backend per ogni
backend.service. Ciascuno dei servizi di backend corrisponde a un servizio Kubernetes e ogni servizio di backend deve fare riferimento a un controllo di integritàGoogle Cloud . Questo controllo di integrità è diverso da un probe di attività o idoneità di Kubernetes perché viene implementato al di fuori del cluster. Per saperne di più, consulta Controlli di integrità.Quando un client invia una richiesta al bilanciatore del carico con percorso dell'URL
/, GKE inoltra la richiesta al serviziohello-world-1sulla porta 60000. Quando un client invia una richiesta al bilanciatore del carico utilizzando il percorso dell'URL/v2, GKE inoltra la richiesta al serviziohello-world-2sulla porta 80. Per saperne di più sulle proprietàpathepathType, consulta Percorsi URL.Se vuoi prenotare un indirizzo IP esterno statico globale, includi un'annotazione
kubernetes.io/ingress.global-static-ip-namenell'oggetto Ingress come mostrato qui:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-ingress annotations: kubernetes.io/ingress.global-static-ip-name: my-static-address ```Applica il manifest al cluster:
kubectl apply -f my-ingress.yaml
Testa il bilanciatore del carico delle applicazioni esterno
Attendi circa cinque minuti per la configurazione del bilanciatore del carico, quindi testa il bilanciatore del carico delle applicazioni esterno:
Visualizza la risorsa Ingress:
kubectl get ingress my-ingress --output yamlL'output mostra l'indirizzo IP del bilanciatore del carico delle applicazioni esterno:
status: loadBalancer: ingress: - ip: 203.0.113.1Testa il percorso
/:curl LOAD_BALANCER_IP_ADDRESS/Sostituisci
LOAD_BALANCER_IP_ADDRESScon l'indirizzo IP esterno del bilanciatore del carico.L'output è simile al seguente:
Hello, world! Version: 1.0.0 Hostname: ...Se l'output include un errore 404, attendi qualche minuto.
Testa il percorso
/v2:curl load-balancer-ip/v2L'output è simile al seguente:
Hello, world! Version: 2.0.0 Hostname: ...
Come funziona Ingress per il bilanciamento del carico esterno
Questa sezione descrive i componenti e le configurazioni che consentono il bilanciamento del carico esterno per le tue applicazioni GKE, tra cui la corrispondenza del percorso URL, i gruppi di endpoint di rete e l'integrazione di VPC condiviso.
Percorsi URL
L'unico carattere jolly supportato per il campo path di un 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, ma *, /foo/bar* e /foo/*/bar non lo sono.
Un pattern più specifico ha la precedenza su un pattern meno specifico. Se hai sia /foo/* che /foo/bar/*, /foo/bar/bat viene preso in considerazione per corrispondere a /foo/bar/*. Per ulteriori informazioni sulle limitazioni dei percorsi e sulla corrispondenza dei pattern,
consulta la
documentazione sulle mappe URL.
Per i cluster GKE che eseguono versioni precedenti alla 1.21.3-gke.1600,
l'unico valore supportato per il campo pathType è ImplementationSpecific.
Per i cluster che eseguono la versione 1.21.3-gke.1600 o successive, sono supportati anche i valori Prefix e Exact per pathType.
Gruppi di endpoint di rete
Se il tuo cluster supporta il bilanciamento del carico nativo del container, ti consigliamo di utilizzare i gruppi di endpoint di rete (NEG). Quando crei l'ingresso, GKE crea un bilanciatore del carico delle applicazioni nel progetto e i NEG vengono creati in ogni zona in cui viene eseguito il cluster. Gli endpoint nel
NEG e gli endpoint del servizio vengono mantenuti sincronizzati. Per i cluster GKE
1.17 e versioni successive, il bilanciamento del carico nativo dei container è predefinito e non
richiede un'annotazione esplicita del servizio cloud.google.com/neg: '{"ingress": true}', in determinate condizioni.
Per i cluster in cui i NEG non sono l'impostazione predefinita, ti consigliamo vivamente di utilizzare il bilanciamento del carico nativo dei container, ma deve essere abilitato esplicitamente per ogni servizio. L'annotazione deve essere applicata ai servizi nel seguente modo:
kind: Service
...
annotations:
cloud.google.com/neg: '{"ingress": true}'
...
Quando aggiungi questa annotazione, viene creato un nuovo BackendService per il servizio esistente. Ciò può comportare un'interruzione temporanea del servizio.
VPC condiviso
Se il cluster GKE in cui esegui il deployment delle risorse Ingress si trova in un progetto di servizio e vuoi che il control plane GKE gestisca le risorse firewall nel progetto host, al service account GKE del progetto di servizio devono essere concesse le autorizzazioni IAM appropriate nel progetto host, come descritto in Gestione delle risorse firewall per i cluster con VPC condiviso. In questo modo, il controller Ingress può creare regole firewall per consentire sia il traffico in entrata sia il traffico per i controlli di integrità di Google Cloud .
Di seguito è riportato un esempio di evento che potrebbe essere presente nei log delle risorse Ingress. Questo errore si verifica quando il controller Ingress non è in grado di creare una regola firewall per consentire il traffico in entrata per i controlli di integrità Google Cloud se le autorizzazioni non sono configurate correttamente.
Firewall change required by security admin: `gcloud compute firewall-rules update <RULE_NAME> --description "GCE L7 firewall rule" --allow tcp:<PORT> --source-ranges 130.211.0.0/22,35.191.0.0/16 --target-tags <TARGET_TAG> --project <HOST_PROJECT>
Se preferisci eseguire il provisioning manuale delle regole firewall dal progetto host, puoi disattivare gli eventi firewallXPNError aggiungendo l'annotazione networking.gke.io/suppress-firewall-xpn-error: "true" alla risorsa Ingress.
Riepilogo delle annotazioni Ingress esterne
Puoi utilizzare le seguenti annotazioni per configurare il comportamento delle risorse Ingress esterne e degli oggetti Service Kubernetes associati.
Annotazioni Ingress
| Annotazione | Descrizione |
|---|---|
| kubernetes.io/ingress.allow-http | Specifica se consentire il traffico HTTP tra il client e il bilanciatore del carico HTTP(S). I valori possibili sono "true" e "false". Il valore predefinito è "true". Vedi Disabilitare HTTP. |
| ingress.gcp.kubernetes.io/pre-shared-cert | Utilizza questa annotazione per collegare le risorse dei certificati alle risorse GKE Ingress. Per saperne di più, consulta Utilizzo di più certificati SSL con i bilanciatori del carico delle applicazioni esterni. |
| kubernetes.io/ingress.global-static-ip-name | Utilizza questa annotazione per specificare che il bilanciatore del carico deve utilizzare un indirizzo IP esterno statico che hai creato in precedenza. Consulta Indirizzi IP statici per i bilanciatori del carico HTTP(S). |
| networking.gke.io/v1beta1.FrontendConfig | Utilizza questa annotazione per personalizzare la configurazione rivolta al client del bilanciatore del carico. Per saperne di più, consulta la sezione Configurazione di Ingress. |
| networking.gke.io/suppress-firewall-xpn-error | Per i bilanciatori del carico Ingress, se Kubernetes non riesce a modificare le regole firewall a causa di
autorizzazioni insufficienti, viene creato un evento firewallXPNError ogni
qualche minuto. In GLBC 1.4
e versioni successive, puoi disattivare l'audio dell'evento firewallXPNError
aggiungendo l'annotazione networking.gke.io/suppress-firewall-xpn-error: "true" alla
risorsa di ingresso. Puoi rimuovere questa annotazione per riattivare l'audio. I valori possibili sono true e false.
Il valore predefinito è false. |
Annotazioni del servizio relative all'ingresso
| Annotation | Descrizione |
|---|---|
| cloud.google.com/app-protocols | Utilizza questa annotazione per impostare il protocollo per la comunicazione tra il bilanciatore del carico e l'applicazione. I protocolli possibili sono HTTP, HTTPS e HTTP2. |
| cloud.google.com/backend-config | Utilizza questa annotazione per configurare il servizio di backend associato a un servizio. Per saperne di più, consulta la sezione Configurazione di Ingress. |
| cloud.google.com/neg | Utilizza questa annotazione per specificare che il bilanciatore del carico deve utilizzare i gruppi di endpoint di rete. Consulta Utilizzo del bilanciamento del carico nativo del container. |
Passaggi successivi
Leggi una panoramica concettuale di Ingress per i bilanciatori del carico delle applicazioni esterni in GKE.
Segui il tutorial su Configurazione di un bilanciatore del carico delle applicazioni esterno con Ingress.
Leggi una panoramica concettuale dei servizi in GKE.
Implementa un Ingress esterno di base.