Configura un bilanciatore del carico delle applicazioni esterno con Ingress


Questo tutorial mostra come eseguire un'applicazione web su un Application Load Balancer esterno configurando la risorsa Ingress.

Questa pagina è rivolta agli specialisti di networking che progettano e progettano la rete per la propria organizzazione e installare, configurare e supportare le apparecchiature di rete. A scopri di più sui ruoli comuni e sulle attività di esempio a cui facciamo riferimento per i contenuti di Google Cloud, consulta Ruoli e attività utente comuni di GKE Enterprise.

Sfondo

Google Kubernetes Engine (GKE) offre supporto integrato per due tipi di Cloud Load Balancing per un'applicazione accessibile pubblicamente:

  1. In entrata

  2. Bilanciatore del carico di rete passthrough esterno

In questo tutorial utilizzerai Ingresso.

In entrata

Quando specifichi kind: Ingress in un manifest della risorsa, indichi GKE per creare una risorsa Ingress. Includendo annotazioni e che supportano carichi di lavoro e servizi, puoi creare un controller Ingress personalizzato. Altrimenti, GKE effettua le chiamate API Google Cloud appropriate Un bilanciatore del carico delle applicazioni esterno Il carico le regole host e i matcher di percorso della mappa URL del bilanciatore fanno riferimento a uno o più backend in cui ogni servizio di backend corrisponde a un cluster GKE Servizio di tipo NodePort, come indicato in Ingress. I backend per ciascun servizio di backend è un gruppo di istanze o gruppi di endpoint di rete (NEG). I NEG vengono creati quando configuri il caricamento nativo del container di bilanciamento della configurazione del tuo traffico in entrata. Per ogni servizio di backend, GKE crea un controllo di integrità di Google Cloud, basato impostazioni del probe di idoneità del carico di lavoro a cui fa riferimento Servizio GKE.

Se stai esponendo un servizio HTTP(S) ospitato su GKE, HTTP(S) il bilanciamento del carico è 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 basata sull'utilizzo previsto, utilizza il Calcolatore prezzi. I nuovi utenti di Google Cloud potrebbero essere idonei per una prova gratuita.

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

Per abilitare l'API Kubernetes Engine, segui questi passaggi:
  1. Visita la pagina di Kubernetes Engine nella console Google Cloud.
  2. Crea o seleziona un progetto.
  3. Attendi che l'API e i relativi servizi siano abilitati. L'operazione può richiedere diversi minuti.
  4. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

Installa i seguenti strumenti a riga di comando usati in questo tutorial:

  • gcloud viene utilizzato per creare ed eliminare i cluster Kubernetes Engine. gcloud è incluso nell'interfaccia a riga di comando gcloud.
  • kubectl viene utilizzato per gestire Kubernetes, il sistema di orchestrazione dei cluster utilizzato in Kubernetes Engine. Puoi installare kubectl utilizzando gcloud:
    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 valori predefiniti per lo strumento a riga di comando gcloud

Per risparmiare tempo, digita il tuo ID progetto e le opzioni per la zona di Compute Engine in gcloud a strumento a riga di comando, 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 manifest seguente descrive un deployment che esegue immagine container dell'applicazione web di esempio su un server HTTP sulla porta 8080:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
  namespace: default
spec:
  selector:
    matchLabels:
      run: web
  template:
    metadata:
      labels:
        run: web
    spec:
      containers:
      - image: us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0
        imagePullPolicy: IfNotPresent
        name: web
        ports:
        - containerPort: 8080
          protocol: TCP

Applica la risorsa al cluster:

kubectl apply -f web-deployment.yaml

Esposizione del deployment all'interno del cluster

Il file manifest seguente descrive un Servizio che rende il Deployment di web accessibile all'interno del tuo cluster di container:

apiVersion: v1
kind: Service
metadata:
  name: web
  namespace: default
spec:
  ports:
  - port: 8080
    protocol: TCP
    targetPort: 8080
  selector:
    run: web
  type: NodePort
  1. Applica la risorsa al cluster:

    kubectl apply -f web-service.yaml
    

    Quando crei un servizio di tipo NodePort con questo GKE rende disponibile il tuo servizio tramite un numero di porta elevato selezionato (ad es. 32640) su tutti i nodi del tuo cluster.

  2. Verifica che il servizio sia stato creato e che sia allocata una porta per il nodo:

    kubectl get service web
    
    Uscita:
    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 per questo servizio non è allocato alcun IP esterno. Poiché il I nodi GKE non sono accessibili esternamente per impostazione predefinita, creando questo Servizio non rende la tua applicazione accessibile da internet.

Per rendere la tua applicazione server web HTTP(S) accessibile pubblicamente, devi per creare una risorsa Ingress.

Creazione di una risorsa Ingress

Ingress è una risorsa Kubernetes che incapsula una raccolta regole e configurazione per instradare il traffico HTTP(S) esterno all'indirizzo i servizi di machine learning.

Su GKE, Ingress viene implementato Cloud Load Balancing. Quando crei una risorsa Ingress GKE crea un bilanciatore del carico HTTP(S) lo configura per instradare il traffico alla tua applicazione.

Il manifest seguente descrive una risorsa Ingress che indirizza il traffico a il tuo servizio web:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: basic-ingress
spec:
  defaultBackend:
    service:
      name: web
      port:
        number: 8080

Applica la risorsa al cluster:

kubectl apply -f basic-ingress.yaml

Dopo aver eseguito il deployment di questo manifest, Kubernetes crea una risorsa Ingress in un cluster Kubernetes. Il controller GKE Ingress crea e configura un'istanza Bilanciatore del carico HTTP(S) in base alle informazioni presenti nel file instradando tutto il traffico HTTP esterno (sulla porta 80) al servizio NodePort web esposte.

Visitare l'applicazione

Trova l'indirizzo IP esterno del bilanciatore del carico che gestisce la tua applicazione eseguendo:

kubectl get ingress basic-ingress
Uscita:
NAME            HOSTS     ADDRESS         PORTS     AGE
basic-ingress   *         203.0.113.12    80        2m

Apri l'indirizzo IP esterno della tua applicazione in un browser e visualizza un risposta HTTP in testo normale come la seguente:

Hello, world!
Version: 1.0.0
Hostname: web-6498765b79-fq5q5

Puoi visitare la pagina 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, ti serve l'indirizzo IP esterno di un'applicazione in un IP statico che non cambia.

Per impostazione predefinita, GKE alloca IP esterni temporanei indirizzi IP per applicazioni HTTP esposte tramite una risorsa Ingress. Gli indirizzi temporanei sono soggetti a modifica. Se hai intenzione di eseguire per molto tempo, devi utilizzare un IP esterno statico .

Tieni presente che, dopo aver configurato un IP statico per la risorsa Ingress, l'eliminazione La risorsa Ingress non elimina l'indirizzo IP statico associato. Assicurati di ripulisci gli indirizzi IP statici che hai configurato quando non prevedi più di utilizzare di nuovo.

Per configurare un indirizzo IP statico, completa i seguenti passaggi:

  1. 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 per l'installazione per installare Config Connector sul tuo cluster.

    apiVersion: compute.cnrm.cloud.google.com/v1beta1
    kind: ComputeAddress
    metadata:
      name: web-static-ip
    spec:
      location: global
    Per eseguire il deployment di questo manifest, scaricalo sulla tua macchina come compute-address.yaml ed esegui:
    kubectl apply -f compute-address.yaml

  2. Il manifest basic-ingress-static.yaml aggiunge un'annotazione su Ingress a utilizza la risorsa IP statico denominata web-static-ip:

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: basic-ingress
      annotations:
        kubernetes.io/ingress.global-static-ip-name: "web-static-ip"
    spec:
      defaultBackend:
        service:
          name: web
          port:
            number: 8080

    Visualizza il manifest:

    cat basic-ingress-static.yaml
    
  3. Applica la risorsa al cluster:

    kubectl apply -f basic-ingress-static.yaml
    
  4. Controlla l'indirizzo IP esterno:

    kubectl get ingress basic-ingress
    

    Attendi che l'indirizzo IP dell'applicazione cambi per utilizzare l'indirizzo IP riservato Indirizzo IP della risorsa web-static-ip.

    L'aggiornamento della risorsa Ingress esistente potrebbe richiedere alcuni minuti, riconfigurare il bilanciatore del carico e propagare le regole di bilanciamento del carico tra a forma di globo. Al termine di questa operazione, GKE rilascia temporaneo allocato in precedenza alla tua applicazione.

(Facoltativo) Gestione di più applicazioni su un bilanciatore del carico

Puoi eseguire più servizi su un singolo bilanciatore del carico e su IP pubblico e configurare regole di routing su Ingress. Ospitando più servizi sul stesso Ingress, puoi evitare di creare bilanciatori del carico aggiuntivi (che sono fatturabili) per ogni servizio esposto su internet.

Il seguente manifest descrive un deployment con la stessa versione 2.0 applicazione web:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web2
  namespace: default
spec:
  selector:
    matchLabels:
      run: web2
  template:
    metadata:
      labels:
        run: web2
    spec:
      containers:
      - image: us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0
        imagePullPolicy: IfNotPresent
        name: web2
        ports:
        - containerPort: 8080
          protocol: TCP

Applica la risorsa al cluster:

kubectl apply -f web-deployment-v2.yaml

Il seguente manifest descrive un servizio che espone internamente web2 a il cluster su un servizio NodePort chiamato web2:

apiVersion: v1
kind: Service
metadata:
  name: web2
  namespace: default
spec:
  ports:
  - port: 8080
    protocol: TCP
    targetPort: 8080
  selector:
    run: web2
  type: NodePort

Applica la risorsa al cluster:

kubectl apply -f web-service-v2.yaml

Il seguente manifest descrive una risorsa Ingress che:

  • instrada le richieste con percorso che inizia con /v2/ al servizio web2
  • instrada tutte le altre richieste al servizio web
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: fanout-ingress
spec:
  rules:
  - http:
      paths:
      - path: /*
        pathType: ImplementationSpecific
        backend:
          service:
            name: web
            port:
              number: 8080
      - path: /v2/*
        pathType: ImplementationSpecific
        backend:
          service:
            name: web2
            port:
              number: 8080

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 sul lo stesso bilanciatore del carico:

  • Visita http://<IP_ADDRESS>/ e nota che la risposta contiene Version: 1.0.0 (poiché la richiesta viene indirizzata al servizio web)
  • Visita http://<IP_ADDRESS>/v2/ e nota che la risposta contiene Version: 2.0.0 (poiché la richiesta viene indirizzata al servizio web2)

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 uno meno specifico. Se hanno sia /foo/* che /foo/bar/*, viene utilizzato /foo/bar/bat per trovare la corrispondenza /foo/bar/*.

Per ulteriori informazioni sulle limitazioni dei percorsi e sulla corrispondenza dei pattern, consulta documentazione di Maps URL.

(Facoltativo) Monitoraggio della disponibilità e della latenza del servizio

I controlli di uptime di Google Cloud eseguono una blackbox monitoraggio delle applicazioni dal punto di vista dell'utente, determinando la latenza e la disponibilità da più IP esterni all'indirizzo IP del con il bilanciatore del carico di rete passthrough esterno regionale. In confronto, i controlli di integrità di Google Cloud un controllo interno agli IP dei pod per determinare la disponibilità nell'istanza livello. I controlli sono complementari e forniscono un quadro olistico dell'applicazione l'integrità fisica.

Puoi creare un controllo di uptime utilizzando la console Google Cloud, tramite l'API Cloud Monitoring o le librerie client di Cloud Monitoring. Per informazioni, vedi Gestione dei controlli di uptime. Se vuoi creare un controllo di uptime utilizzando la console Google Cloud, procedi nel seguente modo:

  1. Vai alla scheda Servizi e pagina in entrata nella console Google Cloud.

    Vai a Servizi e In entrata

  2. Fai clic sul nome del servizio per il quale vuoi creare un controllo di uptime.

  3. Fai clic su Crea controllo di uptime.

  4. Nel riquadro Crea controllo di uptime, inserisci un titolo per il controllo di uptime e fai clic su Avanti per passare alle impostazioni di Target.

    I campi Target del controllo di uptime vengono compilati automaticamente nell'uso delle informazioni dal bilanciatore del carico del servizio.

    Per la documentazione completa su tutti i campi di un controllo di uptime, vedi Creazione di un controllo di uptime.

  5. Fai clic su Avanti per passare alle impostazioni di Convalida risposta.

  6. 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 tramite un canale diverso se il controllo di uptime non va a buon fine. Per informazioni generali su sui criteri di avviso, consulta Introduzione agli avvisi.

  7. 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 si aspetta un HTTP 200. Se vuoi verificare un percorso diverso o aspettarti un altro di risposta, puoi utilizzare un percorso del controllo di integrità personalizzato.

Ingress supporta casi d'uso più avanzati, ad esempio:

  • Hosting virtuale basato sui nomi: puoi utilizzare Ingress per riutilizzare il bilanciatore del carico per più nomi di dominio e sottodomini, nonché per esporre più servizi su un con un singolo indirizzo IP e un bilanciatore del carico. Consulta le semplici fan-out e virtuali basate sul nome di hosting esempi per scoprire come configurare Ingress per queste attività.

  • Chiusura HTTPS: puoi configurare il In entrata per terminare il traffico HTTPS usando il bilanciatore del carico Cloud.

di Gemini Advanced.

Quando viene eliminata una risorsa Ingress, il controller GKE Ingress ripulisce gli elementi associati automaticamente (ad eccezione degli 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.

  1. Elimina tutte le regole di forwarding e i proxy di destinazione creati manualmente che fanno riferimento all'oggetto Ingress:

    Un proxy di destinazione pendente che fa riferimento a un controller GKE Ingress gestito La mappa URL causerà l'esito negativo dell'eliminazione della risorsa Ingress in GKE versioni 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 al Mappa URL k8s2-um-tlw9rhgp-default-my-ingress-9ifnni82 creata e gestiti da un controller Ingress.

    Queste risorse di frontend create manualmente (sia regola di forwarding che proxy di destinazione) deve essere eliminato prima di procedere con l'eliminazione del la risorsa Ingress.

  2. Elimina l'oggetto Ingress: questo passaggio trasferisce l'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 da instradare richieste per percorso, quindi elimina il traffico in entrata:

    kubectl delete ingress fanout-ingress

  3. Elimina l'indirizzo IP statico: completa questo passaggio solo se hai seguito le istruzioni passaggio facoltativo per creare un indirizzo IP statico.

    • Se hai seguito "Opzione 1" per convertire un indirizzo IP temporaneo esistente all'IP statico, poi visita la console Google Cloud per eliminare l'indirizzo IP statico.

    • Se hai seguito "Opzione 2" per creare un nuovo indirizzo IP statico, quindi esegui seguente comando per eliminare l'indirizzo IP statico:

      gcloud compute addresses delete web-static-ip --global
  4. Elimina il cluster: questo passaggio elimina i nodi di computing il tuo cluster di container e altre risorse come i deployment cluster:

    gcloud container clusters delete loadbalancedcluster

Passaggi successivi