Esta página mostra como usar objetos Ingress do Kubernetes e Service para configurar um balanceador de carga de aplicações externo para usar o HTTP/2 para comunicação com serviços de back-end.
Vista geral
Um Application Load Balancer funciona como um proxy entre os seus clientes e a sua aplicação. Os clientes podem usar HTTP/1.1 ou HTTP/2 para comunicar com o proxy do balanceador de carga. No entanto, a ligação do proxy do equilibrador de carga à sua aplicação usa HTTP/1.1 por predefinição. Se a sua aplicação, em execução num pod do Google Kubernetes Engine (GKE), for capaz de receber pedidos HTTP/2, pode configurar o balanceador de carga externo para usar HTTP/2 quando encaminha pedidos para a sua aplicação.
Neste exercício, vai criar uma implementação, um serviço e uma entrada. Coloca uma anotação cloud.google.com/app-protocols
no manifesto do serviço para especificar que o balanceador de carga deve usar HTTP/2 para comunicar com a sua aplicação.
Em seguida, chama o seu serviço e verifica se a sua aplicação recebeu um pedido HTTP/2.
Antes de começar
Antes de começar, certifique-se de que realizou as seguintes tarefas:
- Ative a API Google Kubernetes Engine. Ative a API Google Kubernetes Engine
- Se quiser usar a CLI gcloud para esta tarefa,
instale-a e, em seguida,
inicialize-a. Se instalou anteriormente a CLI gcloud, execute
gcloud components update
para obter a versão mais recente.
- Leia acerca dos recursos Kubernetes Ingress e Service.
- Leia acerca das limitações do HTTP/2 para um balanceador de carga de aplicações externo.
Crie a implementação
Copie o seguinte manifesto para um ficheiro com o nome
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
Este manifesto descreve uma implementação com duas réplicas da aplicação Web
echoheaders
.Aplique o manifesto ao cluster:
kubectl apply -f my-deployment.yaml
Crie o serviço
Copie o seguinte manifesto para um ficheiro com o nome
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
Este manifesto descreve um serviço com as seguintes propriedades:
type: NodePort
: especifica que se trata de um serviço do tipo NodePort.app: echoheaders
: especifica que qualquer Pod que tenha esta etiqueta é membro do serviço.cloud.google.com/app-protocols
: especifica quemy-port
deve usar o protocolo HTTP/2.port: 443
,protocol: TCP
etargetPort: 8433
: especifique que o tráfego direcionado para o serviço na porta TCP 443 deve ser encaminhado para a porta TCP 8443 num dos pods membros.
Aplique o manifesto ao cluster:
kubectl apply -f my-service.yaml
Ver o serviço:
kubectl get service echoheaders --output yaml
O resultado é semelhante ao seguinte:
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 ...
Crie o Ingress
Copie o seguinte manifesto para um ficheiro com o nome
my-ingress.yaml
:apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: echomap spec: defaultBackend: service: name: echoheaders port: number: 443
Este manifesto descreve um Ingress que especifica que os pedidos recebidos são enviados para um pod que é membro do serviço
echoheaders
. Os pedidos são encaminhados para o Pod notargetPort
especificado noechoheaders
manifesto de serviço. Neste exercício, o podtargetPort
é8443
.Aplique o manifesto ao cluster:
kubectl apply -f my-ingress.yaml
Este comando pode demorar vários minutos a ser concluído enquanto o controlador de entrada do Kubernetes configura o equilibrador de carga da aplicação.
Veja a entrada:
kubectl get ingress echomap --output yaml
O resultado é semelhante ao seguinte:
kind: Ingress metadata: ... name: echomap ... spec: backend: serviceName: echoheaders servicePort: 443 status: loadBalancer: ingress: - ip: 203.0.113.2
Neste resultado, o endereço IP do Ingress é
203.0.113.2
.
Teste o balanceador de carga
gcloud
Liste os seus serviços de back-end:
gcloud compute backend-services list
Descreva o seu serviço de back-end:
gcloud beta compute backend-services describe BACKEND_SERVICE_NAME --global
Substitua
BACKEND_SERVICE_NAME
pelo nome do serviço de back-end.O resultado especifica que
protocol
éHTTP2
:backends: ... description: '{...,"kubernetes.io/service-port":"443","x-features":["HTTP2"]}' ... kind: compute#backendService loadBalancingScheme: EXTERNAL protocol: HTTP2 ...
Consola
Aceda à página Equilíbrio de carga na Trusted Cloud consola.
Em Nome, localize o balanceador de carga.
Clique no nome do balanceador de carga para ver o serviço de back-end.
Confirme se o protocolo de ponto final do seu serviço de back-end é HTTP/2.
Ligue para o seu serviço
Aguarde alguns minutos para que o GKE configure o balanceador de carga e o serviço de back-end e, em seguida, introduza o endereço IP externo do balanceador de carga na barra de endereço do navegador.
O resultado é semelhante ao seguinte:
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
...
Estas informações de saída sobre o pedido do balanceador de carga para o Pod:
request_version=2
: indica que o pedido entre o equilibrador de carga e o pod usou HTTP/2.x-forwarded-proto=http
: indica que o pedido entre o navegador e o balanceador de carga usou HTTP 1.1 e não HTTP/2.
O que se segue?
Configure um balanceador de carga de aplicações externo com entrada.
Configure um endereço IP estático e um nome de domínio para a sua aplicação através do Ingress.
Configure certificados SSL para o balanceador de carga de entrada.