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 funge da 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 alla tua 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, creerai un deployment, un servizio e un Ingress. Inserisci un'annotazione
cloud.google.com/app-protocols nel manifest del servizio per specificare
che il bilanciatore del carico deve utilizzare HTTP/2 per comunicare con la tua applicazione.
Dopodiché chiami il tuo servizio e verifichi che la tua 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à,
installala e poi
inizializza
gcloud CLI. Se hai già installato gcloud CLI, scarica l'ultima
versione eseguendo il comando
gcloud components update. Le versioni precedenti di gcloud CLI potrebbero non supportare l'esecuzione dei comandi in questo documento.
- Scopri di più sulle risorse Ingress e Service di Kubernetes.
- Scopri di più sulle 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: 8443Questo 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: echoheadersQuesto 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 è membro del servizio.cloud.google.com/app-protocols: specifica chemy-portdeve utilizzare il protocollo HTTP/2.port: 443,protocol: TCPetargetPort: 8433: specifica che il traffico indirizzato al servizio sulla porta TCP 443 deve essere instradato alla porta TCP 8443 su uno dei pod membri.
Applica il manifest al cluster:
kubectl apply -f my-service.yamlVisualizza il servizio:
kubectl get service echoheaders --output yamlL'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 la risorsa 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: 443Questo manifest descrive un Ingress che specifica che le richieste in entrata vengono inviate a un pod membro del servizio
echoheaders. Le richieste vengono indirizzate al pod sutargetPortspecificato nel manifest del servizioechoheaders. In questo esercizio, il podtargetPortè8443.Applica il manifest al cluster:
kubectl apply -f my-ingress.yamlIl completamento di questo comando può richiedere diversi minuti mentre il controller Ingress di Kubernetes configura il bilanciamento del carico delle applicazioni.
Visualizza l'ingresso:
kubectl get ingress echomap --output yamlL'output è simile al seguente:
kind: Ingress metadata: ... name: echomap ... spec: backend: serviceName: echoheaders servicePort: 443 status: loadBalancer: ingress: - ip: 203.0.113.2In questo output, l'indirizzo IP dell'ingresso è
203.0.113.2.
testa il bilanciatore del carico
gcloud
Elenca i servizi di backend:
gcloud compute backend-services listDescrivi il servizio di backend:
gcloud beta compute backend-services describe BACKEND_SERVICE_NAME --globalSostituisci
BACKEND_SERVICE_NAMEcon il nome del tuo 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
Nella console Google Cloud , vai alla pagina Bilanciamento del carico.
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 endpoint per il servizio di backend sia HTTP/2.
Chiama il tuo servizio
Attendi alcuni minuti 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 statico e un nome di dominio per la tua applicazione utilizzando Ingress.
Configura i certificati SSL per il bilanciatore del carico Ingress.