Configura un bilanciatore del carico delle applicazioni esterno con Ingress

Questo tutorial mostra come eseguire un'applicazione web dietro un bilanciatore del carico delle applicazioni esterno configurando la risorsa Ingress.

Questa pagina è dedicata agli specialisti di networking che progettano e realizzano l'architettura di rete per la loro organizzazione e installano, configurano e supportano le apparecchiature di rete. Per scoprire di più sui ruoli comuni e sulle attività di esempio a cui facciamo riferimento nei contenuti diGoogle Cloud , consulta Ruoli e attività comuni degli utenti GKE.

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 utilizzi gli ingressi.

In entrata

Quando specifichi kind: Ingress in un manifest della risorsa, indichi a GKE di creare una risorsa Ingress. Se includi annotazioni e supporti per workload e servizi, puoi creare un controller Ingress personalizzato. In caso contrario, GKE effettua le chiamate API appropriate per creare un bilanciatore del carico delle applicazioni esterno. Google Cloud Le regole host e i matcher di percorso della mappa URL del bilanciatore del carico fanno riferimento a uno o più servizi di backend, dove ogni servizio di backend corrisponde a un servizio GKE di tipo NodePort, come indicato in Ingress. I backend per ogni 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 dei container nell'ambito della configurazione di Ingress. Per ogni servizio di backend, GKE crea un controllo di integrità Google Cloud , in base alle impostazioni del probe di preparazione del carico di lavoro a cui fa riferimento il corrispondente servizio GKE.

Se esponi un servizio HTTP(S) ospitato su GKE, il bilanciamento del carico HTTP(S) è il metodo consigliato per il bilanciamento del carico.

Deployment di un'applicazione web

Il seguente manifest descrive un Deployment che esegue l'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 seguente manifest descrive un Service che rende il deployment di web accessibile all'interno del 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 comando, GKE rende disponibile il servizio su un numero di porta elevato selezionato in modo casuale (ad es. 32640) su tutti i nodi del cluster.

  2. Verifica che il servizio sia stato creato e che sia stata 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 è allocato alcun IP esterno per questo servizio. Poiché i nodi GKE non sono accessibili dall'esterno per impostazione predefinita, la creazione di questo servizio non rende l'applicazione accessibile da internet.

Per rendere la tua applicazione server web HTTP(S) accessibile pubblicamente, 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.

Su GKE, Ingress viene implementato utilizzando Cloud Load Balancing. Quando crei un 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:

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 sul tuo cluster. Il controller Ingress di GKE crea e configura un bilanciatore del carico HTTP(S) in base alle informazioni in Ingress, instradando tutto il traffico HTTP esterno (sulla porta 80) al servizio NodePort web che hai esposto.

Visitare l'applicazione

Per scoprire l'indirizzo IP esterno del bilanciatore del carico che gestisce l'applicazione, esegui:

kubectl get ingress basic-ingress
Output:
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 una 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 della Google Cloud console e ispezionare le risorse di rete create dal controller Ingress di GKE.

(Facoltativo) Configurazione di un indirizzo IP statico

Quando esponi un server web su un nome di dominio, devi fare in modo che l'indirizzo IP esterno di un'applicazione sia un IP statico che non cambia.

Per impostazione predefinita, GKE alloca indirizzi IP esterni effimeri per le applicazioni HTTP esposte tramite un Ingress. Gli indirizzi temporanei sono soggetti a modifiche. 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 di Ingress non elimina l'indirizzo IP statico associato. Assicurati di eliminare gli indirizzi IP statici che hai configurato quando non prevedi più di utilizzarli.

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 di installazione per installare Config Connector sul 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 per utilizzare 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 della tua applicazione cambi 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 in tutto il mondo potrebbero richiedere alcuni minuti. Al termine di questa operazione, GKE rilascia l'indirizzo IP effimero 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 IP pubblico configurando le regole di routing in Ingress. Ospitando più servizi sullo stesso Ingress, puoi evitare di creare bilanciatori del carico aggiuntivi (che sono risorse fatturabili) per ogni servizio che esponi a internet.

Il seguente manifest descrive un deployment con la versione 2.0 della stessa 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 web2 internamente al 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:

  • indirizza le richieste con il percorso che inizia con /v2/ al servizio web2
  • indirizza 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 dell'ingresso, esegui kubectl get ingress fanout-ingress per trovare l'indirizzo IP pubblico del cluster.

Quindi visita l'indirizzo IP per verificare che entrambe le applicazioni siano raggiungibili sullo stesso bilanciatore del carico:

  • Visita http://<IP_ADDRESS>/ e tieni presente che la risposta contiene Version: 1.0.0 (poiché la richiesta viene indirizzata al servizio web)
  • Visita http://<IP_ADDRESS>/v2/ e tieni presente 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 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, mentre *, /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 considerato corrispondente a /foo/bar/*.

Per ulteriori informazioni sulle limitazioni del percorso e sulla corrispondenza dei pattern, consulta la documentazione delle mappe URL.

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

I controlli di uptime diGoogle Cloud eseguono il monitoraggio black box 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. Al contrario,i controlli di integrità eseguono un controllo interno sugli IP dei pod, determinando la disponibilità a livello di istanza. Google Cloud I controlli sono complementari e forniscono un quadro olistico dello stato dell'applicazione.

Puoi creare un controllo di uptime utilizzando la console Google Cloud , l'API Cloud Monitoring o le librerie client Cloud Monitoring. Per informazioni, consulta Gestione dei controlli di uptime. Se vuoi creare un controllo di uptime utilizzando la console Google Cloud , segui questi passaggi:

  1. Vai alla pagina Servizi e Ingress nella console Google Cloud .

    Vai a Servizi e Ingress

  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 poi fai clic su Avanti per passare alle impostazioni Destinazione.

    I campi Destinazione del controllo dell'uptime vengono compilati automaticamente utilizzando le informazioni del bilanciamento 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 della 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 del controllo di uptime. Una criterio di avviso può inviarti una notifica via email o tramite un altro canale se il controllo di uptime non viene superato. Per informazioni generali sui criteri di avviso, consulta la pagina 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 prevede una risposta HTTP 200. Se vuoi controllare un percorso diverso o prevedere 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, sottodomini ed esporre più servizi su un unico indirizzo IP e bilanciatore del carico. Consulta gli esempi di fanout semplice e di hosting virtuale basato sul nome per scoprire come configurare Ingress per queste attività.

  • Terminazione HTTPS: puoi configurare Ingress per terminare il traffico HTTPS utilizzando Cloud Load Balancer.

Quando un Ingress viene eliminato, il controller Ingress di GKE pulisce automaticamente le risorse associate (ad eccezione degli indirizzi IP statici riservati).