Configura Ingress per i bilanciatori del carico delle applicazioni esterni


Questo documento illustra come configurare Application Load Balancer esterno mediante la creazione di un Oggetto Ingress Kubernetes.

Prima di leggere questo documento, assicurati di acquisire familiarità con Concetti di networking di GKE.

Prima di iniziare

Prima di iniziare, assicurati di aver eseguito le seguenti attività:

  • Attiva l'API Google Kubernetes Engine.
  • Abilita l'API Google Kubernetes Engine .
  • Se vuoi utilizzare Google Cloud CLI per questa attività, install e poi inizializzare con gcloud CLI. Se hai già installato gcloud CLI, scarica la versione più recente eseguendo gcloud components update.

Attiva il componente aggiuntivo HttpLoadBalancing

Nel cluster deve essere abilitato il componente aggiuntivo HttpLoadBalancing. Questo componente aggiuntivo è sono abilitate per impostazione predefinita. Nei cluster Autopilot, non puoi disabilitare questa funzionalità come componente aggiuntivo.

Puoi abilitare il componente aggiuntivo HttpLoadBalancing utilizzando la console Google Cloud oppure Google Cloud CLI.

Console

  1. Vai alla pagina Google Kubernetes Engine nella console Google Cloud.

    Vai a Google Kubernetes Engine

  2. Fai clic sul nome del cluster da modificare.

  3. In Networking, nel campo Bilanciamento del carico HTTP, fai clic su Modifica bilanciamento del carico HTTP.

  4. Seleziona la casella di controllo Abilita bilanciamento del carico HTTP.

  5. 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 indirizzare le richieste a uno o più Servizi. Se vuoi un indirizzo IP permanente, devi prenotare indirizzo IP esterno statico globale prima di creare una risorsa Ingress.

Se modifichi una risorsa Ingress esistente per utilizzare un indirizzo IP statico al posto di un temporaneo, GKE potrebbe cambiare l'indirizzo IP quando GKE ricrea la regola di forwarding del carico con il bilanciatore del carico di rete passthrough esterno regionale.

Crea un bilanciatore del carico delle applicazioni esterno

In questo esercizio configurerai un bilanciatore del carico delle applicazioni esterno per instradare le richieste a a seconda del percorso dell'URL.


Per seguire le indicazioni dettagliate per questa attività direttamente nella console Google Cloud, fai clic su Procedura guidata:

Procedura guidata


Creazione di deployment e servizi

Crea due deployment con servizi denominati hello-world-1 e hello-world-2:

  1. 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.

  2. Applica il manifest al cluster:

    kubectl apply -f hello-world-deployment-1.yaml
    
  3. Salva 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: 50000
    

    Questo manifest descrive un servizio con le seguenti proprietà:

    • Tutti i pod con l'etichetta greeting: hello e L'etichetta version: one fa parte 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, obbligatorio a meno che stai utilizzando bilanciamento del carico nativo del container. Se utilizzi il bilanciamento del carico nativo del container, non sono previste limitazioni al tipo. del servizio. Consiglia di utilizzare type: ClusterIP.
  4. Applica il manifest al cluster:

    kubectl apply -f hello-world-service-1.yaml
    
  5. Salva 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.

  6. Applica il manifest al cluster:

    kubectl apply -f hello-world-deployment-2.yaml
    
  7. Salva 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: 8080
    

    Questo manifest descrive un servizio con le seguenti proprietà:

    • Tutti i pod con l'etichetta greeting: hello e L'etichetta version: two fa parte del servizio.
    • GKE inoltra le richieste inviate al servizio sulla porta TCP 80 a uno dei pod membri sulla porta TCP 8080.
  8. Applica il manifest al cluster:

    kubectl apply -f hello-world-service-2.yaml
    

Crea una risorsa Ingress

Crea una risorsa Ingress che specifichi le regole per il routing delle richieste in base all'URL del percorso di una VM nella richiesta. Quando crei la risorsa Ingress, il cluster GKE Ingress un controller crea e configura un bilanciatore del carico delle applicazioni esterno.

  1. 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: 80
    

    Questo file manifest descrive una risorsa 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 utilizzando spec.ingressClassName.

    • La classe gce esegue il deployment Application Load Balancer esterno.

    • La classe gce-internal esegue il deployment Application Load Balancer interno.

    • Quando esegui il deployment di una risorsa Ingress senza le annotazioni spec.ingressClassName e kubernetes.io/ingress.class, GKE crea un bilanciatore del carico delle applicazioni esterno. Questo è lo stesso comportamento si verifica se specifichi l'annotazione kubernetes.io/ingress.class: gce. Per maggiori informazioni le informazioni, vedi Comportamento del controller Ingress GKE.

    • GKE crea un'istanza Servizio di backend Google Cloud per ogni backend.service.

    • Quando un client invia una richiesta al bilanciatore del carico con il percorso dell'URL /, GKE inoltra la richiesta al servizio hello-world-1 alla porta 60000. Quando un client invia una richiesta al bilanciatore del carico utilizzando un URL percorso /v2, GKE inoltra la richiesta al hello-world-2 Servizio sulla porta 80. Per ulteriori informazioni su path e pathType consulta la sezione Percorsi URL.

  2. 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:

  1. Visualizza Ingress:

    kubectl get ingress my-ingress --output yaml
    

    L'output mostra l'indirizzo IP del bilanciatore del carico delle applicazioni esterno:

    status:
      loadBalancer:
        ingress:
        - ip: 203.0.113.1
    
  2. Testa il percorso /:

    curl LOAD_BALANCER_IP_ADDRESS/
    

    Sostituisci LOAD_BALANCER_IP_ADDRESS con 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.

  3. Testa il percorso /v2:

    curl load-balancer-ip/v2
    

    L'output è simile al seguente:

    Hello, world!
    Version: 2.0.0
    Hostname: ...
    

Come funziona Ingress per il bilanciamento del carico esterno

Un bilanciatore del carico delle applicazioni esterno funge da proxy tra i client e un'applicazione. Se vuoi accettare le richieste HTTPS dai tuoi client, il carico il bilanciatore deve avere un certificato per poter dimostrare la propria identità ai client. Il bilanciatore del carico deve inoltre disporre di una chiave privata per completare l'handshake HTTPS. Per ulteriori informazioni, vedi:

Percorsi degli URL

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 saperne di più sulle limitazioni dei percorsi e sulla corrispondenza dei pattern, vedi il documentazione di Maps 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, Prefix e Exact sono supportati anche per pathType.

Disabilitazione di HTTP

Se vuoi che tutto il traffico tra il client e il bilanciatore del carico utilizzi HTTPS, puoi disattivare HTTP. Per ulteriori informazioni, vedi Disabilitazione di HTTP.

HTTPS tra bilanciatore del carico e applicazione

Se la tua applicazione, in esecuzione in un pod GKE, è in grado di ricevere Richieste HTTPS, puoi configurare il bilanciatore del carico in modo che utilizzi HTTPS quando inoltra richieste alla tua applicazione. Per ulteriori informazioni, vedi HTTPS (TLS) tra il bilanciatore del carico e l'applicazione.

HTTP/2 tra client e bilanciatore del carico

I client possono utilizzare HTTP/2 per inviare richieste al bilanciatore del carico. Nessuna configurazione è obbligatorio.

HTTP/2 tra bilanciatore del carico e applicazione

Se la tua applicazione, in esecuzione in un pod GKE, è in grado di ricevere Richieste HTTP/2, puoi configurare il bilanciatore del carico in modo che utilizzi HTTP/2 quando inoltra richieste alla tua applicazione. Per ulteriori informazioni, vedi HTTP/2 per il bilanciamento del carico con Ingress.

Gruppi di endpoint di rete

Se il tuo cluster supporta Bilanciamento del carico nativo del container, si consiglia di utilizzare i gruppi di endpoint di rete (NEG). Per GKE cluster 1.17 e successivi in determinate condizioni, il bilanciamento del carico nativo del container è predefinito e non richiede una richiesta Annotazione del servizio cloud.google.com/neg: '{"ingress": true}'.

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, è necessario concedere all'account di servizio GKE del progetto di servizio le autorizzazioni IAM appropriate nel progetto host. in base a Gestione delle risorse firewall per i cluster con VPC condiviso. Ciò consente al controller Ingress di creare regole firewall per consentire sia il traffico in entrata sia quello 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 riesce a creare una regola firewall per consentire il traffico in entrata per i controlli di integrità di 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 manualmente il provisioning 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

Annotazioni Ingress

Annotazione Descrizione
kubernetes.io/ingress.allow-http Specifica se consentire il traffico HTTP tra il client e HTTP(S) con il bilanciatore del carico di rete passthrough esterno regionale. I valori possibili sono "true" e "false". Il valore predefinito è "true". Vedi Disattivare HTTP.
ingress.gcp.kubernetes.io/pre-shared-cert Utilizza questa annotazione per collegare le risorse dei certificati a GKE Risorse in entrata. Per ulteriori informazioni, vedi Utilizzo di più certificati SSL con 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'immagine a un indirizzo IP esterno che hai creato in precedenza. Consulta: Indirizzi IP statici per bilanciatori del carico HTTP(S).
networking.gke.io/v1beta1.FrontendConfig Utilizza questa annotazione per personalizzare la configurazione con il bilanciatore del carico di rete passthrough esterno regionale. Per ulteriori informazioni, vedi Configurazione in entrata.
networking.gke.io/suppress-firewall-xpn-error Per i bilanciatori del carico Ingress, se Kubernetes non può modificare le regole del firewall a causa di autorizzazione insufficiente, viene creato un evento firewallXPNError a intervalli minuti. In GLBC 1.4 In seguito, puoi disattivare l'evento firewallXPNError aggiungendo l'annotazione networking.gke.io/suppress-firewall-xpn-error: "true" alla in entrata. Puoi rimuovere questa annotazione per riattivare l'audio. I valori possibili sono true e false. Il valore predefinito è false.
Annotazione Descrizione
cloud.google.com/app-protocols Utilizza questa annotazione per impostare il protocollo di comunicazione tra il carico dal bilanciatore del carico e dall'applicazione. I protocolli possibili sono HTTP, HTTPS e HTTP2. Vedi HTTPS tra il bilanciatore del carico e la tua applicazione e HTTP/2 per il bilanciamento del carico con Ingress.
cloud.google.com/backend-config Utilizza questa annotazione per configurare il servizio di backend associato a un assistenza. Per ulteriori informazioni, vedi Configurazione in entrata.
cloud.google.com/neg Utilizza questa annotazione per specificare che il bilanciatore del carico deve utilizzare la rete gruppi di endpoint. Consulta: Utilizzo del bilanciamento del carico nativo del container.

Passaggi successivi