Questa pagina mostra come configurare un bilanciatore del carico delle applicazioni esterno creando un oggetto Ingress Kubernetes.
Prima di leggere questa pagina, assicurati di conoscere 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
- 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.
Abilita l'add-on HttpLoadBalancing
Il cluster deve avere l'add-on HttpLoadBalancing abilitato. Questo add-on è abilitato per impostazione predefinita. Nei cluster Autopilot, non puoi disattivare questo add-on.
Puoi abilitare l'add-on HttpLoadBalancing utilizzando la Google Cloud console o la
Google Cloud CLI.
Console
Vai alla pagina Google Kubernetes Engine nella Google Cloud console.
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 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 un Ingress esistente in modo che utilizzi un indirizzo IP statico anziché un indirizzo IP temporaneo, GKE potrebbe modificare l'indirizzo IP del bilanciatore del carico quando GKE 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 Google Cloud console, 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 stia utilizzando il bilanciamento del carico nativo del container. Se utilizzi il bilanciamento del carico nativo del container, non ci sono restrizioni sul tipo di servizio, ma ti consigliamo di utilizzare un servizio ditype ClusterIPa meno che tu non abbia bisogno esplicitamente della porta del nodo fornita 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 un Ingress
Crea un Ingress che specifichi le regole per l'instradamento delle richieste a seconda del percorso dell'URL nella richiesta. Quando crei l'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 Ingress di GKE. Per specificare una classe Ingress, devi utilizzare l'annotazione
kubernetes.io/ingress.class. Non puoi specificare un Ingress GKE 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 di GKE.GKE crea un Google Cloud servizio di backend per ogni
backend.service. Ognuno dei servizi di backend corrisponde a un servizio Kubernetes e ogni servizio di backend deve fare riferimento a un Google Cloud controllo di integrità. Questo controllo di integrità è diverso da un probe di attività o idoneità di Kubernetes perché il controllo di integrità 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'
kubernetes.io/ingress.global-static-ip-nameannotazione nell'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 l'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 applicazioni GKE, tra cui la corrispondenza del percorso dell'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 nel 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/* sia /foo/bar/*, allora /foo/bar/bat viene considerato corrispondente a /foo/bar/*. Per saperne di più sulle limitazioni del percorso e sulla corrispondenza dei pattern,
consulta la
documentazione relativa alle 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, i valori Prefix e Exact sono supportati anche per pathType.
Gruppi di endpoint di rete
Se il cluster supporta
il bilanciamento del carico nativo del container,
ti consigliamo di utilizzare i gruppi di endpoint di rete (NEG). Quando crei l'Ingress, 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 del container è predefinito e non
richiede un'annotazione di servizio cloud.google.com/neg: '{"ingress": true}'esplicita, in determinate condizioni.
Per i cluster in cui i NEG non sono predefiniti, ti consigliamo vivamente di utilizzare il bilanciamento del carico nativo del container, ma deve essere abilitato in modo esplicito 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 piano di controllo 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 Gestire le 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 Google Cloud controlli di integrità.
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 Google Cloud controlli di integrità 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 dall'host
progetto,
puoi disattivare gli eventi firewallXPNError aggiungendo l'
networking.gke.io/suppress-firewall-xpn-error: "true" annotazione alla
risorsa Ingress.
Riepilogo delle annotazioni Ingress esterne
Puoi utilizzare le seguenti annotazioni per configurare il comportamento delle risorse Ingress esterne e degli oggetti di servizio 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". Consulta Disattivare HTTP. |
| ingress.gcp.kubernetes.io/pre-shared-cert | Utilizza questa annotazione per collegare le risorse dei certificati alle risorse Ingress di GKE. Per saperne di più, consulta Utilizzare 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 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 del bilanciatore del carico rivolta al client. Per saperne di più, consulta Configurazione di Ingress. |
| networking.gke.io/suppress-firewall-xpn-error | Per i bilanciatori del carico Ingress, se Kubernetes non può modificare le regole firewall a causa di
autorizzazioni insufficienti, viene creato un evento firewallXPNError ogni pochi
minuti. In GLBC 1.4 e versioni successive, puoi disattivare l'evento firewallXPNError aggiungendo l'annotazione networking.gke.io/suppress-firewall-xpn-error: "true" alla risorsa Ingress. Puoi rimuovere questa annotazione per riattivare l'evento. I valori possibili sono true e false.
Il valore predefinito è false. |
Annotazioni di servizio relative a Ingress
| Annotazione | 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 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 Utilizzare il 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 sulla 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.