Utilizzo di HTTP/2 per il bilanciamento del carico con Ingress


Questa pagina mostra come utilizzare gli oggetti Kubernetes Ingress e Service per configurare un bilanciatore del carico delle applicazioni esterno in modo che utilizzi HTTP/2 per la comunicazione con i servizi di backend.

Panoramica

Un bilanciatore del carico delle applicazioni agisce come proxy tra i client e l'applicazione. I client possono utilizzare HTTP/1.1 o HTTP/2 per comunicare con il proxy del bilanciatore del carico. Tuttavia, la connessione dal proxy del bilanciatore del carico all'applicazione utilizza HTTP/1.1 per impostazione predefinita. Se la tua applicazione, in esecuzione in un pod Google Kubernetes Engine (GKE), è in grado di ricevere richieste HTTP/2, configura il bilanciatore del carico esterno in modo che utilizzi HTTP/2 quando inoltra le richieste alla tua applicazione.

In questo esercizio, crei un deployment, un servizio e un Ingress. Inserisci un'annotazione cloud.google.com/app-protocols nel file manifest del servizio per specificare che il bilanciatore del carico deve utilizzare HTTP/2 per comunicare con la tua applicazione. Quindi chiami il servizio e verifichi che l'applicazione abbia ricevuto una richiesta HTTP/2.

Prima di iniziare

Prima di iniziare, assicurati di aver eseguito le seguenti operazioni:

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

Crea il deployment

  1. Copia il seguente manifest in un file denominato my-deployment.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: echoheaders
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: echoheaders
      template:
        metadata:
          labels:
            app: echoheaders
        spec:
          containers:
          - name: echoheaders
            image: registry.k8s.io/echoserver:1.10
            ports:
            - containerPort: 8443
    

    Questo manifest descrive un deployment con due repliche dell'applicazione web echoheaders.

  2. Applica il manifest al cluster:

    kubectl apply -f my-deployment.yaml
    

Crea il servizio

  1. Copia il seguente manifest in un file denominato my-service.yaml:

    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        cloud.google.com/app-protocols: '{"my-port":"HTTP2"}'
      name: echoheaders
      labels:
        app: echoheaders
    spec:
      type: NodePort
      ports:
      - port: 443
        targetPort: 8443
        protocol: TCP
        name: my-port
      selector:
        app: echoheaders
    

    Questo manifest descrive un servizio con le seguenti proprietà:

    • type: NodePort: specifica che si tratta di un servizio di tipo NodePort.
    • app: echoheaders: specifica che qualsiasi pod con questa etichetta è un membro del servizio.
    • cloud.google.com/app-protocols: specifica che my-port deve utilizzare il protocollo HTTP/2.
    • port: 443, protocol: TCP e targetPort: 8433: specifica che il traffico indirizzato al servizio sulla porta TCP 443 deve essere indirizzato alla porta TCP 8422 su uno dei pod membri.
  2. Applica il manifest al cluster:

    kubectl apply -f my-service.yaml
    
  3. Visualizza il servizio:

    kubectl get service echoheaders --output yaml
    

    L'output è simile al seguente:

    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        cloud.google.com/app-protocols: '{"my-port":"HTTP2"}'
        ...
      labels:
        app: echoheaders
      name: echoheaders
      ...
    spec:
      clusterIP: 10.39.251.148
      ...
      ports:
      - name: my-port
        nodePort: 30647
        port: 443
        protocol: TCP
        targetPort: 8443
      selector:
        app: echoheaders
      ...
      type: NodePort
    ...
    

Crea l'elemento Ingress

  1. Copia il seguente manifest in un file denominato my-ingress.yaml:

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: echomap
    spec:
      defaultBackend:
        service:
          name: echoheaders
          port:
            number: 443
    

    Questo manifest descrive un Ingress che specifica che le richieste in arrivo vengono inviate a un pod che è membro del servizio echoheaders. Le richieste vengono indirizzate al pod sull'targetPort specificato nel manifest del servizio echoheaders. In questo esercizio, il pod targetPort è 8443.

  2. Applica il manifest al cluster:

    kubectl apply -f my-ingress.yaml
    

    Il completamento di questo comando può richiedere diversi minuti mentre il controller Ingress di Kubernetes configura l'Application Load Balancer.

  3. Visualizza l'elemento Ingress:

    kubectl get ingress echomap --output yaml
    

    L'output è simile al seguente:

    kind: Ingress
    metadata:
      ...
      name: echomap
      ...
    spec:
      backend:
        serviceName: echoheaders
        servicePort: 443
    status:
      loadBalancer:
        ingress:
        - ip: 203.0.113.2
    

    In questo output, l'indirizzo IP dell'Ingress è 203.0.113.2.

Testa il bilanciatore del carico

gcloud

  1. Elenca i servizi di backend:

    gcloud compute backend-services list
    
  2. Descrivi il servizio di backend:

    gcloud beta compute backend-services describe BACKEND_SERVICE_NAME --global
    

    Sostituisci BACKEND_SERVICE_NAME con il nome del servizio di backend.

    L'output specifica che protocol è HTTP2:

    backends:
    ...
    description: '{...,"kubernetes.io/service-port":"443","x-features":["HTTP2"]}'
    ...
    kind: compute#backendService
    loadBalancingScheme: EXTERNAL
    protocol: HTTP2
    ...
    

Console

  1. Vai alla pagina Bilanciamento del carico nella console Google Cloud.

    Vai a Bilanciamento del carico

  2. In Nome, individua il bilanciatore del carico.

  3. Fai clic sul nome del bilanciatore del carico per visualizzare il servizio di backend.

  4. Verifica che il protocollo dell'endpoint per il servizio di backend sia HTTP/2.

Chiama il servizio

Attendi qualche minuto affinché GKE configuri il bilanciatore del carico e il servizio di backend, quindi inserisci l'indirizzo IP esterno del bilanciatore del carico nella barra degli indirizzi del browser.

L'output è simile al seguente:

Hostname: echoheaders-7886d5bc68-xnrwj
...
Request Information:
  ...
  method=GET
  real path=/
  query=
  request_version=2
  request_scheme=https
  ...

Request Headers:
  ...
  x-forwarded-for=[YOUR_IP_ADDRESS], 203.0.113.2
  x-forwarded-proto=http
...

Queste informazioni di output sulla richiesta dal bilanciatore del carico al pod:

  • request_version=2: indica che la richiesta tra il bilanciatore del carico e il pod ha utilizzato HTTP/2.
  • x-forwarded-proto=http: indica che la richiesta tra il browser e il bilanciatore del carico ha utilizzato HTTP 1.1, non HTTP/2.

Passaggi successivi