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
.
- Scopri di più sulle risorse Kubernetes Ingress e Service.
- Scopri le limitazioni di HTTP/2 per un bilanciatore del carico delle applicazioni esterno.
Crea il deployment
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
.Applica il manifest al cluster:
kubectl apply -f my-deployment.yaml
Crea il servizio
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 chemy-port
deve utilizzare il protocollo HTTP/2.port: 443
,protocol: TCP
etargetPort: 8433
: specifica che il traffico indirizzato al servizio sulla porta TCP 443 deve essere indirizzato alla porta TCP 8422 su uno dei pod membri.
Applica il manifest al cluster:
kubectl apply -f my-service.yaml
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
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 servizioechoheaders
. In questo esercizio, il podtargetPort
è8443
.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.
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
Elenca i servizi di backend:
gcloud compute backend-services list
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
Vai alla pagina Bilanciamento del carico nella console Google Cloud.
In Nome, individua il bilanciatore del carico.
Fai clic sul nome del bilanciatore del carico per visualizzare il servizio di backend.
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
Configura un bilanciatore del carico delle applicazioni esterno con Ingress.
Configura un indirizzo IP e un nome di dominio statici per la tua applicazione utilizzando Ingress.
Configura i certificati SSL per il bilanciatore del carico Ingress.