Explorar E-books
Categorias
Explorar Audiolivros
Categorias
Explorar Revistas
Categorias
Explorar Documentos
Categorias
São José - SC
agosto/2019
IMPLANTAÇÃO DE UMA APLICAÇÃO DISTRIBUÍDA BASEADA EM HTTP/2
PARA BALANCEAMENTO DE CARGA, SERVIÇOS DISTRIBUÍDOS E PROXY
REVERSO PARA SISTEMAS WEB
São José - SC
agosto/2019
Valmir da Cruz de Medeiros
Implantação de uma aplicação distribuída baseada em HTTP/2 para balanceamento de carga,
serviços distribuídos e proxy reverso para sistemas Web/ Valmir da Cruz de Medeiros. – São José -
SC, agosto/2019-
71 p. : il. (algumas color.) ; 30 cm.
Este trabalho foi julgado adequado para obtenção do título de Tecnólogo em Sistemas de
Telecomunicações, pelo Instituto Federal de Educação, Ciência e Tecnologia de Santa Catarina, e
aprovado na sua forma final pela comissão avaliadora abaixo indicada.
Agradeço de forma geral a todos aqueles que contribuíram para que eu pudesse chegar a este
momento, onde defendo meu trabalho de conclusão de curso afim de obter minha graduação.
Agradeço em especial à minha tia, Marli dos Santos Medeiros, que sempre me apoiou e por quem
tenho muito respeito e gratidão por tudo na vida. Agradeço aos meus amigos Jailson Manoel Venera e
Jefferson Antônio, amigos que conheço de muitos anos e que também me deram força e me apoiaram,
apoio esse de fora das salas de aula mas igualmente importante.
Meu muito obrigado também vai aos amigos que tive o prazer de conhecer durante o curso, amigos
com quem superei desafios, compartilhei conhecimentos e momentos gratificantes, em especial, obrigado
Alfredo Luiz, Giovana Lopes de Oliveira e Joseane Bortoli.
Em paralelo também agradeço ao meu orientador Ederson Torresini, pela paciência e dedicação
ao me auxiliar na conclusão deste trabalho, obrigado pelo conhecimento que compartilhou comigo durante
estes anos em todas as oportunidades.
Por fim, obrigado ao Instituto Federal de Santa Catarina - Câmpus São José (IFSC-SJ), a todos
os funcionários que contribuem para que o trabalho não pare, em especial ao corpo docente com quem
pude aprender muito durante os anos que aqui passei.
RESUMO
A demanda de aplicações voltadas para a Web no IFSC-SJ vem crescendo consideravelmente nos últimos
anos, sendo necessário adequar a estrutura dos servidores para atendê-la. Deste modo, este trabalho
propõe a implantação de uma infraestrutura de nuvem privada de aplicações Web em contêineres que
centralize o gerenciamento por meio de um front-end que recebe todas as requisições dos clientes e gerencia
a comunicação com os servidores das aplicações Web, atuando também como um balanceador de carga
que dimensiona estas requisições entre os servidores disponíveis. A aplicação é baseada no novo protocolo
HTTP/2, que promete superioridade no desempenho em relação aos seus antecessores e economia de
recursos no servidor, diminuindo a influência da latência da rede no acesso ao conteúdo, além de reduzir o
número de conexões Transmission Control Protocol (TCP) para os servidores Web.
Figura 1 – Modelo de referência TCP/Internet Protocol (IP) conforme Kurose e Ross (2010). . . 21
Figura 2 – Handshake TCP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Figura 3 – Servidor estabelecendo valor para rwnd. . . . . . . . . . . . . . . . . . . . . . . . . . 23
Figura 4 – Fluxo de dados sobre uma nova conexão TCP. . . . . . . . . . . . . . . . . . . . . . . 23
Figura 5 – Fluxo de dados sobre uma conexão TCP já estabelecida. . . . . . . . . . . . . . . . . . 24
Figura 6 – Controle e prevenção de congestionamentos. . . . . . . . . . . . . . . . . . . . . . . . . 25
Figura 7 – Janela de congestionamento do TCP. . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Figura 8 – Handshake TLS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
Figura 9 – Handshahe Transport Layer Security (TLS) com extensão Application-Layer Protocol
Negotiation (ALPN). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
Figura 10 – Requisição HTTP/1.1 utilizando pipelining. . . . . . . . . . . . . . . . . . . . . . . . . 31
Figura 11 – Conexões paralelas em uma requisição HTTP. . . . . . . . . . . . . . . . . . . . . . . 31
Figura 12 – Segmentação de domínio no navegador. . . . . . . . . . . . . . . . . . . . . . . . . . . 32
Figura 13 – Estrutura do quadro de HTTP/2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
Figura 14 – Estrutura de camadas com o quandro HTTP/2 . . . . . . . . . . . . . . . . . . . . . . 33
Figura 15 – Stream HTTP/2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Figura 16 – Streams HTTP/2 multiplexados em uma única conexão TCP. . . . . . . . . . . . . . . 34
Figura 17 – Streams de push enviados pelo servidor. . . . . . . . . . . . . . . . . . . . . . . . . . . 34
Figura 18 – Exemplo de um balanceador de carga. . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
Figura 19 – Exemplo de um proxy reverso. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Figura 20 – Diagrama de um cluster Kubernetes. . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Figura 21 – Sintaxe da interface de comando Kubectl. . . . . . . . . . . . . . . . . . . . . . . . . . 37
Figura 22 – Dashboard Kubernetes: alocação de recursos. . . . . . . . . . . . . . . . . . . . . . . . 38
Figura 23 – Dashboard Kubernetes: Deployment. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
Figura 24 – Diagrama de um Cluster Kubernetes com uma aplicação em contêiner. . . . . . . . . 39
Figura 25 – Ilustração de um Ingress Controller. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Figura 26 – Ingress Controller com as instruções do Ingress. . . . . . . . . . . . . . . . . . . . . . 44
Figura 27 – Interface adicionada à Virtual Machine (VM) do Minikube. . . . . . . . . . . . . . . . 48
Figura 28 – Uso de CPU de um Pod com balanceamento de carga. . . . . . . . . . . . . . . . . . . 50
Figura 29 – Aplicações em back-end. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
Figura 30 – Operações da interface de comando Kubectl. . . . . . . . . . . . . . . . . . . . . . . . 62
LISTA DE CÓDIGOS
IP Internet Protocol . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
RSA Rivest–Shamir–Adleman . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
SPDY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
VM Virtual Machine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1 INTRODUÇÃO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
1.1 Objetivo Geral . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
1.1.1 Objetivos específicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
1.2 Organização do texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2 FUNDAMENTAÇÃO TEÓRICA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.1 Camada de Transporte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.1.1 Conexão TCP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.1.2 Controle de fluxo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.1.3 Controle de congestionamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.1.4 Partida lenta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.1.5 Recuperação rápida . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.2 Criptografia e segurança Transport Layer Security (TLS) . . . . . . . . . . . . . . . 25
2.2.1 Handshake TLS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
2.2.2 Mecanismos de troca de chave criptográficas . . . . . . . . . . . . . . . . . . . . . . . . . 26
2.2.3 Application-Layer Protocol Negotiation (ALPN) . . . . . . . . . . . . . . . . . . . . . . . 27
2.3 HTTP/0.9 e HTTP/1.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.4 HTTP/1.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.4.1 Conexões Persistentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.4.2 Pipelining . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
2.4.3 Conexões Paralelas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
2.5 HTTP/2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
2.5.1 Quadro HTTP/2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
2.5.2 Streams e Multiplexação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
2.5.3 Server Push . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
2.6 Balanceamento de carga . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
2.7 Proxy reverso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
2.8 Kubernetes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
2.8.1 Cluster . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
2.8.2 Kubectl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
2.8.3 Pod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
2.8.4 Deployment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
2.8.5 Ingress . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
2.8.6 Ingress Controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
3 DESENVOLVIMENTO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3.1 Cenários de testes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3.2 Aplicação Front-end . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3.2.1 Configurações do Ingress . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
3.2.2 Habilitando TLS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
3.2.3 Suporte a IPv4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
3.2.4 Suporte a IPv6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
3.2.5 HTTP/2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
3.2.6 HTTP/1.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
3.2.7 Balanceamento de carga . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
3.3 Back-end . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
3.3.1 nginx-backend . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
3.3.2 apache-backend . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
3.3.3 mediawiki . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
4 CONCLUSÕES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
4.1 Trabalhos futuros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
REFERÊNCIAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
ANEXOS 57
1 INTRODUÇÃO
A Web já era quase uma realidade, e agora precisava de padrões e diretrizes. No ano seguinte
a criação do Mosaic veio a fundação do World Wide Web Consortium (W3C), um consórcio formado
por empresas, instituições e especialistas convidados e que cria grupos de trabalho para desenvolverem
padrões para Web (W3C, 2019).
Os primeiros navegadores Web utilizaram como base a primeira versão do protocolo HTTP,
conhecido como HTTP/0.9 (BERNERS-LEE, 1991), um protocolo simples que funcionava sobre TCP
e tinha requisições e respostas simples: cada requisição representava uma conexão TCP ao servidor
(BERNERS-LEE, 1991). Em pouco tempo, isso não era mais suficiente para atender a demanda dos
usuários da Word Wide Web (WWW). Vieram então seus sucessores HTTP/1.0 e HTTP/1.1, onde este
último permaneceu operacional por 20 anos, mas a demanda da Web exigiu novamente uma atualização, e
a versão 1.1 já não era suficiente sem o emprego de várias ferramentas para melhorar seu desempenho.
O IFSC-SJ tem acompanhado a evolução da Web de um modo geral. De fato, muitas das aplicações
estão migrando para a Web: desde impressão até ferramentas de ensino, isso para beneficiar-se de vantagens
como uso de dispositivos estáticos e móveis, diferentes tamanhos de telas e resoluções; ou seja, na medida do
possível independência dos recursos do usuário final. Na prática, uma plataforma em comum e facilmente
encontrada nos dispositivos terminais.
Deste modo, será preciso otimizar o processamento e o acesso ao conteúdo, tanto no servidor
quanto no cliente, e por isso a proposta da utilização de um protocolo que propõe melhoria de desempenho
e economia de recursos na utilização das aplicações Web: o HTTP/2.
20 Capítulo 1. Introdução
Este trabalho propõe a implantação de uma aplicação que utiliza o protocolo HTTP/2 e seus
novos recursos para melhorar o desempenho e a experiência com aplicações Web, atuais e futuras, do
IFSC-SJ, tanto para o cliente quanto para o servidor. A aplicação deverá funcionar como um front-end
para intermediar as conexões e sessões HTTP entre os usuários e os servidores da estrutura do IFSC-SJ.
Deverá também manter o suporte ao protocolo HTTP/1.1 para atender os servidores e clientes que ainda
utilizam esses em suas aplicações. O servidor front-end contará ainda com suporte na Camada de Rede
aos protocolos IPv4 e IPv6 tendo em vista que a versão 4 do IP ainda é muito utilizada, inclusive dentro
do câmpus.
• Escolher uma aplicação que utilize contêiner e que contemple a proposta de front-end deste docu-
mento.
– Balanceamento de carga.
– Gerenciamento centralizado.
– HTTP/1.1 e HTTP/2.
– Hyper Text Transfer Protocol Secure (HTTPS).
– IPv4 e IPv6.
– Proxy reverso.
2 FUNDAMENTAÇÃO TEÓRICA
Neste capítulo são abordadas as tecnologias que dão base a esta proposta. Serão apresentados
conceitos sobre o Hypertext Transfer Protocol (HTTP), com um comparativo da evolução de suas versões
em aplicações Web e sobre balanceamento de carga, com foco nos protocolos que fazem parte do objeto de
estudo deste trabalho.
O protocolo HTTP utiliza a Camada de Transporte para enviar e receber suas requisições e
informações. O padrão HTTP não prevê a obrigatoriedade de um protocolo da Camada de Transporte
específico (GRIGORIK, 2013), porém as conexões do HTTP trabalham basicamente sobre TCP devido a
sua garantia de entrega. O TCP faz o trabalho de garantir que os pacotes com as informações da aplicação
sejam entregues com segurança, tratando eventuais falhas de um canal não confiável, eliminando assim a
necessidade de implementações complexas de comunicação de rede nas aplicações (GRIGORIK, 2013).
Neste trabalho estamos considerando a versão 4 do TCP (POSTEL, 1981).
Uma conexão TCP é sempre inciada através de um three-way handshake (“aperto de mão de
três vias”) entre um cliente e um servidor (Figura 2). O cliente envia um pacote ao servidor com uma
mensagem SYN contendo um número de sequência gerado aleatoriamente ao servidor (x=rand()), que
aloca buffer em seu sistema para receber os dados da aplicação e o responde com uma mensagem SYN
ACK incrementando o valor de sequência recebido em (x+1) e encaminhando seu próprio identificador de
sequência, também gerado aleatoriamente (y=rand()), assim que o cliente recebe a mensagem enviada
pelo servidor, retorna um pacote com uma mensagem de confirmação ACK, incrementando o identificador
de sequência enviado pelo servidor (y+1) e enviando os dados da aplicação. Assim, a conexão TCP está
22 Capítulo 2. Fundamentação teórica
completa e tanto o servidor quanto o cliente estão prontos para trocar os dados recebidos da aplicação
(GRIGORIK, 2013).
É importante observar que o estabelecimento de uma conexão TCP tem um custo de tempo
diretamente ligado à latência da rede. No caso da Figura 2 a latência está estabelecida em 56 milissegundos,
então esse é o tempo Round-trip Time (RTT), desconsiderando o tempo de processamento do pacote no
servidor, que o handshake levará para ser completado. Como o protocolo HTTP trabalha sobre TCP, o
tempo que a aplicação demorará para receber a primeira informação enviada do servidor será, no melhor
caso, o dobro da latência da rede (2 * RTT ou 112 ms).
O mecanismo de controle de fluxo evita que o remetente, em uma conexão TCP sature o receptor
com um fluxo de dados que ele pode não conseguir processar, compatibiliza a velocidade que o remetente
transmite com a que o receptor consegue ler (KUROSE; ROSS, 2010).
O controle de fluxo funciona com a troca de informações entre o cliente e o servidor, ambos
anunciam seus valores de Receiver Window (rwnd) (“Janela de Recebimento”) de acordo com o
tamanho do buffer de recepção TCP de cada um, e os comunicam através de pacotes com mensagens ACK
durante a conexão. A Figura 3 ilustra o envio de um valor para rwnd pelo servidor para que o cliente
ajuste seu fluxo de dados.
Originalmente o valor inicial de cwnd foi definido como uma vez o valor do Maximum Segment
24 Capítulo 2. Fundamentação teórica
Size (MSS) (1 * MSS), em 1999 a Request for Comments (RFC) 2581 (ALLMAN; PAXSON; STEVENS,
1999) atualizou este valor para quatro vezes o valor de MSS (4 * MSS) e a RFC 6928 (CHU et al., 2013),
em 2013, propôs o tamanho inicial para cwnd como dez vezes o valor do MSS (10 * MSS = 14600 bytes),
onde todo o fluxo de dados será iniciado com esse valor e o remetente incrementará cwnd em uma vez
o MSS a cada pacote ACK de confirmação recebido do cliente, dessa forma o TCP consegue aumentar o
fluxo de dados de acordo com a confirmação de que os pacotes estão sendo entregues ao destinatário
(GRIGORIK, 2013). Mesmo que a largura de banda entre cliente e servidor seja muito superior ao valor
inicial da janela, está taxa somente será alcançada após idas e voltas suficientes para alcançar o máximo
valor de throughput da rede (GRIGORIK, 2013). O limite para cwnd sempre será o congestionamento da
rede ou o valor de rwnd.
A Figura 4 ilustra uma requisição HTTP sobre uma conexão TCP. Pode-se verificar o fluxo de
dados sendo aumentado de acordo com as confirmações de recebimento por parte do servidor e o tempo
necessário até que os dados solicitados sejam completamente transferidos ao cliente. Comparando agora
com a Figura 5, que ilustra a mesma requisição sobre a mesma conexão TCP já estabelecida e com o valor
de cwnd em 65535 bytes é possível perceber a redução de tempo.
Na Figura 6 podemos ver um gráfico com os valores de cwnd começando com dez vezes o valor
de MSS e crescendo exponencialmente de acordo com a confirmação do recebimento das informações por
parte do servidor. O gráfico também ilustra a queda do valor de cwnd quando há uma perda de pacotes,
interrompendo o crescimento exponencial, o que faz com que o multiplicador retorne ao último valor onde
obteve êxito (40 * MSS) e o crescimento exponencial recomece dese valor.
Uma versão antiga do TCP conhecida como TCP Tahoe reduzia diretamente o valor de cwnd
para 1 * MSS fazendo com que se inicia-se a fase de partida lenta após um evento de perda, sendo por
esgotamento ou por recebimento de ACKs duplicados. Uma versão mais recente do protocolo, conhecida
2.2. Criptografia e segurança Transport Layer Security (TLS) 25
como TCP Reno incluiu a recuperação rápida. Com a recuperação rápida, ao detectar um evento de perda
por triplo ACK duplicado o TCP reduz o valor da variável de estado do limiar de partida lenta (ssthresh)
para 0,5 * cwnd e ajusta o valor de cwnd para 6 * MSS (o valor de ssthresh).
O precursor do TLS foi o protocolo Secure Socket Layer (SSL), que foi desenvolvido para
habilitar segurança em transações de comércio eletrônico na Web, transações que precisavam proteger os
dados pessoais dos clientes e ter garantia de autenticação para uma transação segura. O protocolo foi
implementado na Camada de Aplicação imediatamente acima do TCP, permitindo que protocolos acima,
26 Capítulo 2. Fundamentação teórica
como o HTTP, permaneçam inalterados enquanto fornecem segurança na comunicação através da rede
(GRIGORIK, 2013).
Inicialmente, com o SSL, houve um esforço do Internet Engineering Task Force (IETF) para
documentá-lo, o que culminou na RFC 6101 (FREIER; KARLTON; KOCHER, 2011) para fins históricos.
Ao longo do tempo, diversas falhas críticas de segurança foram encontradas no SSL, mesmo em sua última
versão (3.0).
Sobre o TLS, sua primeira versão, a 1.0, foi publicada na RFC 2246 (DIERKS; ALLEN, 1999).
Apesar de o TLS ter surgido do SSL, os protocolos não são interoperáveis. Para este documento, será
considerado apenas o protocolo TLS.
Hoje o uso de TLS para conexões HTTP seguras, HTTPS, se tornou essencial, mas o processo
de handshake TLS implica negociações com pedidos e respostas que aumentam os valores de RTT. O
protocolo permite o uso de extensões como o TLS False Start e abbreviated handshake, que quando
combinados podem oferecer um handshake TLS de 1-RTT (GRIGORIK, 2013).
o servidor quanto para criptografar a chave de sessão simétrica enviada para o servidor. Como resultado,
se um atacante ganhar acesso à chave privada do servidor e ouvir a troca, então eles podem decifrar a
sessão inteira. E mesmo que um invasor não tenha acesso à chave privada no momento, ele ainda pode
gravar a sessão criptografada e desencriptá-la mais tarde, assim que obter a chave privada (GRIGORIK,
2013).
Já o mecanismo Diffie-Hellman não permite que a chave simétrica compartilhada deixe o cliente
ou o servidor, o segredo não é compartilhado durante o handshake TLS, dificultando assim a ação de
invasores. Segundo (GRIGORIK, 2013), razões comerciais e históricas são responsáveis pela escolha do
RSA ao invés da chave Diffie-Hellman em aplicações TLS.
O ALPN possibilita que a aplicação utilize o handshake TLS para realizar as negociações do
protocolo da Camada de Aplicação, evitando assim a adesão de mais RTTs à conexão. A Figura 9
exemplifica o handshake TLS com a inclusão da extensão ALPN. O cliente adiciona ALPN extension
& list of protocols na mensagem ClientHello contendo uma lista de protocolos de aplicativos
suportados, o servidor verifica a lista e retorna um ALPN extension & selected protocol indicando
o protocolo selecionado como parte da mensagem ServerHello (GRIGORIK, 2013). Após concluído
o handshake TLS o cliente e o servidor já podem trocar mensagem através do protocolo negociado
(GRIGORIK, 2013).
3 (hypertext response)
4 (connection closed)
O HTTP/1.0 também trabalha instanciando uma conexão TCP para cada requisição, que também
era encerrada logo após a resposta do servidor. Esta versão do protocolo introduziu novas possibilidades
ao HTTP e a Web, como a opção de requisitar imagens, não mais ficando restrito ao HTML e novos
cabeçalhos. A versão 1.0 trouxe ideias que são utilizadas até hoje: cabeçalhos, códigos de resposta,
redirecionamentos, erros, pedidos condicionais, codificação de conteúdo (compressão) e mais métodos de
requisição (LUDIN; GARZA, 2017). O Código 2.2 exemplifica uma requisição HTTP/1.0 com algumas das
novidades do protocolo, como o código de resposta HTTP 200 OK (linha 9) que indica que uma requisição
foi bem sucedida.
A versão 1.0 trouxe muitos avanços ao HTTP, porém ainda tinha uma forma ineficiente de
administrar as conexões TCP, que sempre eram fechadas após as respostas do servidor. Todas as vezes
que uma requisição era realizada era necessário um novo processo de hanshake TCP e adição de RTT à
conexão (abordamos as conexões na seção 2.1). A versão 1.1 (seção 2.4) propôs ferramentas para resolver
este problema.
2.4 HTTP/1.1
Diversas melhorias foram incorporadas ao protocolo original, como por exemplo o uso de conexões
persistentes, culminando a revisão da HTTP na versão oficial 1.1.
As conexões persistentes mantêm as conexões TCP abertas ao invés de encerrá-las após a resposta
de uma requisição HTTP ao servidor, permitindo que outras requisições sejam enviadas na mesma conexão.
Com essa possibilidade, requisições seguintes não precisam enfrentar um novo processo de handshake TCP
e as penalidades de um processo de partida lenta (abordamos o handshake e a partida lenta do TCP na
seção 2.1).
O HTTP/1.1 assume que todas as conexões são persistentes, a não ser que se indique o contrário, e
para encerrar uma conexão persistente é preciso informar no cabeçalho a intenção de encerrar a conexão. Na
Código 2.3 podemos ver um exemplo de requisição HTTP/1.1 utilizando o recurso de conexão persistente e,
nas linhas 29 e 61 respectivamente, as informações de cabeçalho indicando a persistência e o encerramento
da conexão.
2.4.2 Pipelining
Uma outra funcionalidade introduzida no HTTP/1.1 foi o pipelining, um recurso que otimiza o
desempenho do HTTP sobre conexões persistentes. As requisições HTTP precisavam de uma resposta
do servidor para cada solicitação enviada, o cliente realiza a requisição e o servidor responde, e após, o
cliente na mesma conexão poderia encaminhar uma nova requisição.
O pipelining propôs que o cliente enviasse mais de uma requisição por vez, e aguardasse o servidor
processá-las e respondê-las, porém essas respostas precisavam chegar na ordem em que foram enviadas.
Mesmo que uma requisição secundária fosse processada primeiro no servidor, está deveria ficar armazenada
em buffer até que a primária fosse respondida.
Apesar do recurso melhorar o desempenho, esta otimização apresenta muitas implicações sutis e
ilustra uma limitação importante dos protocolos HTTP/1.x: serialização rigorosa das respostas. HTTP/1.x
não permite que dados de múltiplas respostas sejam intercalados (multiplexados) na mesma conexão,
forçando cada resposta a ser devolvida completamente antes que os bytes para a próxima possam ser
transferidos. Devido a estas e outras complicações, e a falta de orientação no padrão HTTP/1.1 para esses
casos, a adoção de pipeline HTTP permaneceu muito limitada, apesar de muitos benefícios. Hoje, alguns
navegadores suportam pipelining, geralmente como uma opção de configuração avançada, mas a maioria a
dos navegadores desabilitou (GRIGORIK, 2013).
O número de seis conexões simultâneas foi definido como um meio termo para não extrapolar as
despesas gerais com recursos que navegadores e servidores precisariam para atender múltiplos fluxos TCP
2.5. HTTP/2 31
simultâneos. Mas para algumas aplicações Web isso não era suficiente, o que fez com que se começasse a
utilizar um recurso chamado sharding. O sharding de domínio (Figura 12) consistia basicamente em dividir
o conteúdo em diversos subdomínio com hostnames diferentes, como o navegador limita o número de
conexões simultâneas por nome de host, o número de conexões utilizado para cada aplicação era ampliado.
2.5 HTTP/2
Antes de iniciar a discussão sobre o HTTP/2 é necessário citar o SPDY, um protocolo criado
em 2009 por Mike Belshe e Roberto Peon, do Google, e que tinha como objetivo reduzir os impactos da
latência no carregamento de páginas Web explorando algumas das limitações do HTTP/1.1. O SPDY
estabeleceu as bases para o HTTP/2 e foi responsável por provar algumas de suas características principais,
como multiplexação, enquadramento e compactação de cabeçalho, entre outros (LUDIN; GARZA, 2017).
32 Capítulo 2. Fundamentação teórica
A proposta do HTTP/2 começou com o grupo de trabalho Hypertext Transfer Protocol Working
Group (HTTP-WG) que iniciou um esforço para aproveitar os resultados alcançados pelo protocolo
proprietário (SPDY) e lançar um padrão oficial que seria a versão 2 do HTTP. Então em maio de 2015
foi lançada a RFC 7540 (BELSHE; PEON; THOMSON, 2015) que regulamentou oficialmente o protocolo
HTTP/2. Esta especificação descreve uma expressão otimizada da semântica do (HTTP), conhecido como
HTTP versão 2 (HTTP/2), que permite um uso mais eficiente de recursos de rede e uma percepção
reduzida de latência ao introduzir a compressão de campo de cabeçalho e permitir trocas múltiplas e
simultâneas na mesma conexão.
O HTTP/2 não altera conceitos da aplicação como métodos, códigos de status, URIs e campos
de cabeçalhos. O HTTP/2 altera como os dados são formatados e transportados (GRIGORIK, 2013).
Falaremos sobre as principais implementações de HTTP/2 nas próximas seções.
O HTTP/2 utiliza um quadro para trocar informações da aplicação entre o cliente e o servidor, a
(Figura 13) ilustra o formato do quadro com seus campos e com o tamanho de cada um deles em bits.
A troca de mensagens sob o enquadramento binário de HTTP/2 acontece sobre streams (fluxos).
Cada vez que um cliente deseja realizar uma requisição é aberto um fluxo, que é identificado através do
campo Stream Identifier no quadro de HTTP/2. Este campo existe devido a capacidade de HTTP/2
abrir múltiplos fluxos e enviá-los na mesma conexão TCP através de multiplexação. A Figura 15 ilustra o
cliente enviando uma requisição ao servidor que em seguida o responde em vários quadros, o enquadramento
binário (visto na subseção 2.5.1) dividiu a resposta em um quandro com as informações de cabeçalho
(HEADERS) e fragmentou os dados reais da solicitação em cabeçalhos de dados (DATA).
ganhos de utilizar uma conexão já aberta (abordamos conexões TCP e handshake TLS na subseção 2.1.1
e na subseção 2.2.1). A Figura 16 ilustra os vários fluxos de HTTP/2 em uma mesma conexão.
A maioria das transferências HTTP são curtas e rápidas, enquanto o TCP é otimizado para
transferências de dados em longo prazo. Ao reutilizar a mesma conexão HTTP/2 é capaz de fazer um
uso mais eficiente de cada conexão TCP, e também reduzir significativamente a sobrecarga do protocolo.
Além disso, o uso de menos conexões reduz a memória e o processamento ao longo do caminho de conexão,
o que reduz os custos operacionais e melhora a utilização e a capacidade da rede (GRIGORIK, 2013).
• Algoritmos estáticos: Não consideram o estado atual do sistema, distribuem o tráfego de forma
uniforme entre os servidores disponíveis.
• Algoritmos dinâmicos: Pesquisam os servidores com a menor demanda para equilibrar o tráfego,
consideram o estado atual do sistema. Acabam gerando um tráfego adicional na rede pela constante
comunicação para monitorar o estado dos servidores.
Alguns dos algoritmos mais utilizados em computação em nuvem, segundo Kashyap e Viradiya
(2014), são: Round-Robin, Opportunistic, Min-Min, Max-Min, The two phase scheduling, Honeybee
Foraging, Biased Random Sampling e Active Clustering.
36 Capítulo 2. Fundamentação teórica
O proxy reverso atua como um front-end ficando na borda da rede e recebendo as conexões dos
clientes e encaminhando-as a servidores da back-end que possam atendê-las. O proxy reverso pode também
receber todas as requisições direcionadas a uma server farm através de um único endereço de IP, o que
gera segurança eliminando o contato direto com os servidores reais das aplicações e permite concentrar
recursos como gerência da rede e armazenamento de cache (NGINX, Inc., 2017).
Um servidor proxy pode prover recursos para o administrador da rede controlar os acessos
dos usuários aos servidores internos, os usuários acessam somente as URLs associadas a este servidor.
O administrador configura regras no proxy para que as requisições HTTP vindas da Internet sejam
encaminhadas ao servidor interno adequado (IBM Knowledge Center, 2019).
A Figura 19 ilustra o funcionamento de um proxy reverso. Os clientes requisitam uma página Web
que está localizada dentro dos servidores de aplicação, atrás servidor proxy. Cada cliente deseja acessar
um conteúdo diferente, por isso cada um requisita uma URL distinta, o servidor então é responsável por
associar cada URL com a aplicação correta e encaminhar as requisições ao respectivo servidor na back-end.
2.8 Kubernetes
2.8.1 Cluster
O Kubernetes gerencia um cluster formado de um ou mais computadores para operarem como
uma só unidade. As aplicações são implantadas em contêineres dentro de um cluster sem vínculo com
máquinas individuais (The Linux Foundation, 2019c). A Figura 20 ilustra um cluster Kubernetes básico.
• Mestre: O Mestre (“Master”) é responsável por gerenciar o cluster, atualizar os aplicativos, manter
o estado das aplicações e executar as alterações solicitadas pelo usuário. É o Mestre que decide o
2.8. Kubernetes 37
’
Figura 20 – Diagrama de um cluster Kubernetes.
que é executado dentro de todos os nós. Ao adicionar uma aplicação no Kubernetes o usuário envia
comandos ao Mestre para iniciar os contêineres do aplicativo (The Linux Foundation, 2019c).
• Nós: Um nó é uma VM ou máquina física onde ficarão os contêineres com as aplicações dentro do
cluster. Os nós se comunicam com o mestre através da Application Programming Interface (API)
(“Interface de programação de aplicativos”) do Kubernetes (The Linux Fundation, 2019).
2.8.2 Kubectl
O Kubernetes também possui um Dashboard (“Painel de Controle”) que conta com uma interface
de administração Web (Figura 22 e Figura 23). Através do Dashboard também é possível interagir com a
API do Kubernetes para gerenciar os clusters.
38 Capítulo 2. Fundamentação teórica
2.8.3 Pod
De acordo com a documentação de conceitos do (Google Cloud, 2019b) os pods são os menores e
mais básicos objetos implantáveis no Kubernetes. Um pod representa uma única instância de um processo
em execução no seu cluster.
Os Pods executam os contêineres das aplicações, podendo haver mais de um contêiner sendo
executado pelo mesmo Pod. Quando isso acontece, os contêineres funcionam como uma só entidade
compartilhando os recursos daquele Pod. Entre os recursos que são compartilhados estão os de rede e
armazenamento (The Linux Fundation, 2019).
2.8. Kubernetes 39
• Rede: Os Pods possuem endereços de rede exclusivos. Os contêineres de um mesmo Pod comparti-
lham este endereço assim como as portas de rede (Google Cloud, 2019b).
Os Pods são executados dentro dos Nós em um cluster, após criado permanece no Nó até que
seja excluído, removido ou até que o Nó falhe.
2.8.4 Deployment
2.8.5 Ingress
Existe mais de um tipo de Ingress, abaixo são citados e ilustrados os três tipos declarados na
documentação de (The Linux Foundation, 2019a).
• Single Service Ingress (Tabela 1): Expõe um único serviço, o tráfego HTTP é roteado para um
único serviço no back-end.
Host IP Serviço:Porta
dominio.com.br/servico1 192.0.2.100 servico1:80
• Simple fanout (Tabela 2): O tráfego de um único IP é roteado para mais de um serviço baseando-se
no URI HTTP solicitado.
Host IP Serviço:Porta
dominio.com.br/servico1 192.0.2.100 servico1:80
dominio.com.br/servico2 192.0.2.100 servico2:80
dominio.com.br/servico3 192.0.2.100 servico3:80
• Name based virtual hosting (Tabela 3): Neste tipo de Ingress o tráfego HTTP é roteado através
de nomes de hosts distintos utilizando o mesmo endereço de IP.
Host IP Serviço:Porta
servico1.dominio.com.br 192.0.2.100 servico1:80
servico2.dominio.com.br 192.0.2.100 servico2:80
servico3.dominio.com.br 192.0.2.100 servico3:80
É possível encontrar uma lista de aplicações Ingress Controller (Anexo A), porém atualmente
o Kubernetes somente suporta e mantém como um projeto os controladores GCE e NGINX (The Linux
Foundation, 2019b).
2.8. Kubernetes 41
3 DESENVOLVIMENTO
O NGINX Ingress Controller foi escolhido por atender aos requisitos da proposta deste trabalho,
ter grande escala de utilização e principalmente por possuir suporte e manutenção pelo orquestrador de
contêineres Kubernetes, que atualmente somente mantém suporte para mais uma aplicação.
Para testar os recursos propostos pela aplicação implantada foi necessário a criação de um cenário
para simular um ambiente de produção. Neste cenário foram realizados os testes para validar o suporte da
solução para os recursos listados abaixo.
• IPv4 e IPv6.
• HTTPS.
• Balanceamento de carga.
• Proxy reverso.
Para criar os cenários de testes, com um cluster Kubernetes, foi utilizado o Google Cloud
Platform (GCP)1 , que é uma plataforma de computação em nuvem do Google onde é possível alocar
recursos de maquinas virtuais e endereços de IP para desenvolvimento de aplicações. O GCP é uma
solução paga, mas atualmente o Google oferece um crédito de U$$ 300 válidos por até 12 meses para
testar a plataforma. O crédito é consumido de acordo com os recursos que o usuário utilizar da plataforma.
Neste trabalho o GCP foi utilizado para criar um cluster Kubernetes2 com dois nós. Neste cluster
foram criadas três aplicações back-end mais o Ingress Controller como front-end para realização dos testes.
Também foi utilizado o Minikube, que é uma ferramenta que possibilita montar um cluster de
Kubernetes com um único nó dentro de uma VM (“Maquina Virtual”) (The Linux Fundation, 2019).
A versão do Minikube utilizada para a criação do cenário e realização dos testes foi a: 0.22.2.
A VM do Minikube foi virtualizada através do software VirtualBox na versão 5.1.38, instalado sobre
um sistema operacional Ubuntu 16.04 e Kubernetes versão 1.7.
Nesta seção são abordadas as principais configurações para o funcionamento do NGINX Ingress
Controller como front-end. São apresentados também os testes realizados para demostrar que a aplicação
cumpre as funcionalidades operacionais propostas neste trabalho. Abaixo são apresentados os principais
1 Disponível em https://cloud.google.com
2 A versão do cluster Kubernetes utilizada foi a 1.14.6-gke.1
44 Capítulo 3. Desenvolvimento
• Número de réplicas: 1.
• Imagem: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.25.0.
O Código 3.1 apresenta as configurações do recurso Ingress. Para este cenário as configurações
foram realizadas em um único arquivo ingress.yaml, mas pode-se criar um recurso separado com
instruções especificas para cada aplicação.
• annotations: recebe instruções para personalizar os parâmetros do Ingress Controller para configu-
rações diferentes das padrões da imagem utilizada.
3.2. Aplicação Front-end 45
• rules: aqui estão as regras do balanceamento de carga, de acordo com a URL requisitada o tráfego
HTTP será roteado para um dos serviços da back-end na porta configurada.
Uma documentação completa dos recursos de personalização do Ingress Controller, como: suporte
a Websocket, alterações na versão do HTTP utilizada na comunicação entre controlador e back-end, limite
do número de conexões simultâneas por IP e por IP a cada segundo, entre muitas outras que o controlador
permite (Kubernetes Community, 2019).
46 Capítulo 3. Desenvolvimento
Os resultados obtidos e apresentados no Código 3.2 mostram uma requisição HTTP/2 utilizando
o método GET para uma das aplicações encontradas no back-end, um servidor Apache.
A linha 116 do Código 3.2 mostra o endereço remoto juntamente com a porta TCP para onde foi
enviada a requisição HTTP com HTTPS através do protocolo IPv4.
Nas linhas 133 e 134 respectivamente, podemos observar a confirmação da resposta e a identificação
do servidor que respondeu a requisição. A informação requisitada, a página Web, teve como origem o
servidor encontrado no back-end, dentro do cluster, redirecionada através das configurações do Ingress,
mas a negociação foi realizada com a aplicação front-end, o Ingress Controller.
Para o teste apresentado no Código 3.2 foi utilizada a ferramenta Programador Web do navegador
de internet Firefox v68.0 (linha 122).
142 X-Firefox-Spdy: h2
Para o teste apresentado no Código 3.3 foi utilizada a ferramenta Programador Web do navegador
de internet Firefox v68.0 (linha 152).
Como a ferramenta Minikube cria uma rede local que fica atrás de um Network Address Translation
(NAT) (“Tradução do Endereço da Rede”) e a alteração desta interface ocasionou a falha de comunicação
da máquina real com a interface de linha de comando Kubectl, foi preciso adicionar uma terceira interface
48 Capítulo 3. Desenvolvimento
na VM da aplicação, além das duas criadas pela própria ferramenta, e configurá-la em bridge para
comunicação com a rede local do notebook utilizado para realização dos testes (Figura 27).
Na interface criada manualmente, que foi identificada na VM do Minikube como eth2, foi fixado
manualmente o endereço IPv6 “2001:db8::100/64” para os testes com a versão 6 do protocolo IP.
O Código 3.4 apresenta o comando “ip” (linha 179), utilizado para adicionar o endereços IPv6 à
interface “eth2”, e o comando “ipconfig” (linha 180) para visualização das informações da interface.
3.2.5 HTTP/2
No Código 3.2 realizamos um GET para testar a comunicação de uma conexão IPv4. No mesmo
código, na linha 133, podemos verificar que o servidor front-end respondeu à requisição validando a
comunicação através do protocolo HTTP/2. O mesmo aconteceu com o protocolo IPv6 no Código 3.3
(linha 165).
3.2. Aplicação Front-end 49
3.2.6 HTTP/1.1
É apresentado abaixo, no Código 3.5, uma requisição HTTP/1.1 (linha 214) para a URL3 . Para
a realização desste teste foi utilizada a aplicação curl4 . Foram utilizados os parâmetros -v (verbose)
para detalhar o cabeçalho da requisição e -K (insecure ) para permitir conexões sem certificado SSL.
Para gerar dos requisições foi criado um Shell script que através da aplicação curl realizava
requisições para a URL desejada. O script foi executado varias vezes simultaneamente até gerar um trafego
que download de requisições de aproximadamente 1 Mbps durante o período de monitoramento do gráfico
apresentado na Figura 28. O código do script está exposto a abaixo.
#!/bin/bash
echo “curl repetido 100 vezes”
for i in {100..0};
do
curl https://35.247.226.228/nginx-backend -kv
done
3.3 Back-end
Para simular o cenário da proposta foram colocadas três aplicações em back-end Figura 29. Na
sequência serão apresentadas as configurações e especificações de cada aplicação.
A comunicação para os serviços no back-end acontece através de conexões com o protocolo IPv4
e por padrão através de HTTP/1.1.
3.3.1 nginx-backend
A primeira aplicação ilustrada pela Figura 29 é um servidor Web NGINX. As principais configurações
são descritas abaixo, o código completo com as configurações foi adicionado ao Anexo D.
• Imagem: nginx.
– Protocolo: TCP.
3.3.2 apache-backend
A segunda aplicação também é um servidor Web muito conhecido, o Apache. O código completo
com as configurações foi adicionado ao Anexo E.
• Imagem: httpd:alpine.
– Protocolo: TCP.
3.3.3 mediawiki
As principais configurações são descritas abaixo, o código completo com as configurações foi
adicionado ao Anexo F.
• Imagem: mediawiki:stable.
52 Capítulo 3. Desenvolvimento
– Protocolo: TCP.
53
4 CONCLUSÕES
Este trabalho propôs a implantação de uma aplicação que utilizasse o protocolo HTTP/2 e seus
novos recursos para melhorar o desempenho e a experiência com aplicações Web do IFSC-SJ. A aplicação
deveria utilizar contêiner e funcionar como um front-end intermediando as conexões entre os usuários e os
servidores da estrutura do câmpus.
A principal aplicação estudada neste trabalho foi o controlador de ingresso NGINX Ingress
Controller, foram realizados testes e configurados parâmetros para que o controlador operasse de forma
a atender aos requisitos da proposta. A aplicação com suas configurações, em sua maioria padrão, já
atendeu a maioria dos requisitos: balanceamento de carga, suporte a IPv4 e IPv6, suporte a HTTP/1.1
para aplicações legadas, HTTP/2 para melhorar o acesso ao conteúdo e o processamento e gerenciamento
centralizado. Isso é justificado pois o cenário proposto é um cenário onde a aplicação é projetada para
atuar. As dificuldade ficaram sobre como configurar o Ingress para realizar o balanceamento de carga,
roteamento HTTP e o proxy reverso.
Dentro da proposta da aplicação com gerência centralizada, é também desejado o suporte a cache
no front-end, que até a conclusão deste trabalho o NGINX Ingress Controller não possuía suporte na
versão estável (testada e homologada). A alternativa seria o desenvolvimento manual, faria com que
possivelmente passasse pelos testes automatizados do orquestrador Kubernetes. Porém, devido ao tempo
hábil para a conclusão do trabalho optou-se por propor como sugestão de trabalho futuro a implementação
desta funcionalidade.
No desenvolvimento, os cenários para a realização dos testes foram criados sobre as plataformas
GCP e Minikube. Ambos mostraram-se de fácil instalação e operação, porém como a ampla documentação
é para máquinas reais o fato de o Minikube criar uma rede local com NAT acabou trazendo dificuldades
ao adaptar os tutoriais no que se refere aos redirecionamentos de porta para os serviços no cluster.
Foram criadas aplicações Web em back-end (nginx-backend, apache-backend e mediawiki) e uma
aplicação front-end (Nginx Ingress Controller) para representarem a estrutura da proposta. Em
seguida, configurou-se o Ingress com as instruções do proxy reverso para que a aplicação front-end receba
as requisições dos usuários e às encaminhe para o serviço correspondente de cada URL. Em todas as
aplicações foram configuradas a quantidade de réplicas para o balanceamento de carga, selecionadas as
imagens dos contêineres e configuradas as portas de cada serviço.
Os primeiros testes realizados foram para o suporte aos protocolos IPv4 e IPv6. A aplicação
front-end funcionou com exito para ambos os testes, porém nos testes deste trabalho as conexões IPv6
ficaram entre os usuários e o front-end, as conexões internas do cluster utilizaram a versão 4 do protocolo.
Sugeriu-se como trabalho futuro uma implementação com suporte total a IPv6 dentro e fora do cluster.
Testou-se também o suporte aos protocolos HTTP/1.1 e HTTP/2 com HTTPs, todos com exito.
Aqui é possível salientar a possibilidade de exigir conexões criptografadas a todas as requisições recebidas
pelo front-end mesmo que a aplicação em back-end não ofereça suporte.
A aplicação não foi testada no IFSC-SJ, pois não havia estrutura na nuvem de teste no momento
54 Capítulo 4. Conclusões
do desenvolvimento. Os testes para evidenciar o real ganho de desempenho de HTTP/2 também exigiriam
uma aplicação Web de grande porte (um site completo), o que também optou-se por não realizar devido
ao tempo disponível para a conclusão do trabalho.
Além disso, é interessante o estudo de tráfego para construir uma solução de cache associada ao
front-end para as diversas aplicações de back-end, uma vez que estas possuem suas próprias especificidades,
como por exemplo tipos de arquivos e seus respectivos tempos de vida, entre outros.
1 *.sj.ifsc.edu.br
55
REFERÊNCIAS
ALLMAN, M.; PAXSON, V.; STEVENS, W. TCP Congestion Control. [S.l.], 1999. Citado na página 24.
BELSHE, M.; PEON, R.; THOMSON, M. Hypertext Transfer Protocol Version 2 (HTTP/2). [S.l.], 2015.
<http://www.rfc-editor.org/rfc/rfc7540.txt>. Disponível em: <http://www.rfc-editor.org/rfc/rfc7540.
txt>. Citado 2 vezes nas páginas 32 e 33.
BERNERS-LEE, T. The original http as defined in 1991. In: . [s.n.], 1991. Disponível em:
<https://www.w3.org/Protocols/HTTP/AsImplemented.html>. Acesso em: 21 de nov. 2017. Citado na
página 19.
Board of Trustees of the University of Illinois. Ncsa mosaic. In: . ILLINOIS - NATIONAL CENTER FOR
SUPERCOMPUTING APPLICATIONS, 2019. Disponível em: <http://www.ncsa.illinois.edu/enabling/
mosaic>. Acesso em: 12 de ago. 2019. Citado na página 19.
DIERKS, T.; ALLEN, C. The TLS Protocol Version 1.0. [S.l.], 1999. <http://www.rfc-editor.org/rfc/
rfc2246.txt>. Disponível em: <http://www.rfc-editor.org/rfc/rfc2246.txt>. Citado na página 26.
FIELDING, R. et al. Hypertext Transfer Protocol – HTTP/1.1. [S.l.], 1997. Citado na página 29.
FREIER, A.; KARLTON, P.; KOCHER, P. The Secure Sockets Layer (SSL) Protocol
Version 3.0. [S.l.], 2011. <http://www.rfc-editor.org/rfc/rfc6101.txt>. Disponível em: <http:
//www.rfc-editor.org/rfc/rfc6101.txt>. Citado na página 26.
FRIEDL, S. et al. Application-Layer Protocol Negotiation Extension. [S.l.], 2014. Disponível em:
<https://tools.ietf.org/html/rfc7301>. Acesso em: 21 de nov. 2017. Citado 2 vezes nas páginas 26 e 27.
Google Cloud. Implantação. In: . Google Cloud, 2019. Disponível em: <https://cloud.google.com/
kubernetes-engine/docs/concepts/deployment>. Citado na página 39.
Google Cloud. Pod. In: . Google Cloud, 2019. Disponível em: <https://cloud.google.com/
kubernetes-engine/docs/concepts/pod>. Citado 2 vezes nas páginas 38 e 39.
GOURLEY, D. et al. HTTP: The Definitive Guide. [S.l.]: O’Reilly Media, 2002. Citado 2 vezes nas
páginas 29 e 31.
GRIGORIK, I. High-Performance Browser Networking. O’Reilly Media, 2013. 383 p. Disponível em:
<https://hpbn.co/>. Acesso em: 28 de nov. 2017. Citado 13 vezes nas páginas 21, 22, 23, 24, 25, 26, 27,
28, 30, 31, 32, 33 e 34.
IBM Knowledge Center. O que É um servidor proxy reverso? In: . IBM Knowledge Center, 2019.
Disponível em: <https://www.ibm.com/support/knowledgecenter/pt-br/SSKTXQ_9.0.0/admin/config/
st_adm_port_rvprxy_overview_c.html>. Citado na página 36.
JUNIOR, B. Redes de computadores. In: . [S.l.]: Universidade Federal de Mato Grosso do Sul, 2017.
Citado na página 25.
56 Referências
KASHYAP, D.; VIRADIYA, J. A survey of various load balancing algorithms in cloud computing.
INTERNATIONAL JOURNAL OF SCIENTIFIC TECHNOLOGY RESEARCH, v. 2, n. 11, 2014.
Citado na página 35.
Kubernetes Community. Nginx ingress controller. In: . MKDocs, 2019. Disponível em:
<https://kubernetes.github.io/ingress-nginx/>. Citado na página 45.
KUROSE, J. F.; ROSS, K. W. Redes de Computadores e a Internet: Uma abordagem top-down. 5. ed.
[S.l.]: Pearson, 2010. Citado 3 vezes nas páginas 11, 21 e 22.
KUROSE, J. F.; ROSS, K. W. Redes de Computadores e a Internet: Uma abordagem top-down. 6. ed.
[S.l.]: Pearson, 2014. Citado 2 vezes nas páginas 22 e 24.
LUDIN, S.; GARZA, J. Learning HTTP/2 : A practical guide for beginners. [S.l.]: O’Reilly Media, 2017.
156 p. Citado 3 vezes nas páginas 28, 31 e 33.
MIT. Internet browser technology. In: . Lemelson-MIT Program, 2019. Disponível em:
<https://lemelson.mit.edu/resources/marc-andreeson-and-eric-bina>. Acesso em: 12 de ago. 2019.
Citado na página 19.
NGINX, Inc. What is a reverse proxy vs. load balancer? In: . NGINX, INC., 2017. Disponível em:
<https://www.nginx.com/resources/glossary/reverse-proxy-vs-load-balancer/>. Citado 2 vezes nas
páginas 35 e 36.
NGINX, Inc. Nginx ingress controller for kubernetes. In: . NGINX, INC., 2018. Disponível em:
<https://www.nginx.com/products/nginx/kubernetes-ingress-controller#resources>. Citado na página
41.
OpenSSL Software Foundation. Openssl cryptography and ssl/tls toolkit. In: . OpenSSL Software
Foundation, 2018. Disponível em: <https://www.openssl.org/>. Citado na página 46.
POSTEL, J. Transmission Control Protocol. [S.l.], 1981. <http://www.rfc-editor.org/rfc/rfc793.txt>.
Disponível em: <http://www.rfc-editor.org/rfc/rfc793.txt>. Citado na página 21.
RESCORLA, E. Diffie-Hellman Key Agreement Method. [S.l.], 1999. <http://www.rfc-editor.org/rfc/
rfc2631.txt>. Disponível em: <http://www.rfc-editor.org/rfc/rfc2631.txt>. Citado na página 26.
SARANYA, D.; MAHESWARI, L. S. Load balancing algorithms in cloud computing: A review.
International Journal of Advanced Research in Computer Science and Software Engineering, v. 5, n. 7,
2015. Citado na página 35.
SHARMA, S.; SINGH, S.; SHARMA, M. Performance analysis of load balancing algorithms. World
Academy of Science, Engineering and Technology, v. 2, n. 2, 2008. Citado na página 35.
The Linux Foundation. Ingress. In: . The Linux Fundation, 2019. Disponível em: <https:
//kubernetes.io/docs/concepts/services-networking/ingress/>. Citado 2 vezes nas páginas 39 e 40.
The Linux Foundation. Ingress controllers. In: . The Linux Fundation, 2019. Disponível em:
<https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/>. Citado na página 40.
The Linux Foundation. Using minikube to create a cluster. In: . The Linux Fundation, 2019. Disponível
em: <https://kubernetes.io/docs/tutorials/kubernetes-basics/create-cluster/cluster-intro/>. Citado 2
vezes nas páginas 36 e 37.
The Linux Fundation. Orquestração de contêiner pronto para produção. In: . The Linux Fundation, 2019.
Disponível em: <https://kubernetes.io/pt/>. Citado 7 vezes nas páginas 36, 37, 38, 39, 43, 59 e 62.
W3C. Facts about w3c. In: . W3C, 2019. Disponível em: <https://www.w3.org/Consortium/facts.html>.
Acesso em: 12 de ago. 2019. Citado na página 19.
World Wide Web Foundation. History of the web. In: . World Wide Web Foundation Editor, 2018.
Disponível em: <https://webfoundation.org/about/vision/history-of-the-web/>. Acesso em: 12 de ago.
2019. Citado na página 19.
Anexos
59
• Ambassador.
• Voyager.
• Contour.
• Citrix.
• Gloo.
• HAProxy.
• Istio.
• Kong.
• NGINX.
• Traefik.
Fonte – The Linux Fundation (2019).
61
ANEXO C – CONFIGURAÇÕES DO
CONTROLADOR DE INGRESSO
264 metadata:
265 annotations:
266 prometheus.io/port: "10254"
267 prometheus.io/scrape: "true"
268 creationTimestamp: null
269 labels:
270 app.kubernetes.io/name: ingress-nginx
271 app.kubernetes.io/part-of: ingress-nginx
272 spec:
273 containers:
274 - args:
275 - /nginx-ingress-controller
276 - --configmap=$(POD_NAMESPACE)/nginx-configuration
277 - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
278 - --udp-services-configmap=$(POD_NAMESPACE)/udp-services
279 - --publish-service=$(POD_NAMESPACE)/ingress-nginx
280 - --annotations-prefix=nginx.ingress.kubernetes.io
281 env:
282 - name: POD_NAME
283 valueFrom:
284 fieldRef:
285 apiVersion: v1
286 fieldPath: metadata.name
287 - name: POD_NAMESPACE
288 valueFrom:
289 fieldRef:
290 apiVersion: v1
291 fieldPath: metadata.namespace
292 image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.25.0
293 imagePullPolicy: IfNotPresent
294 livenessProbe:
295 failureThreshold: 3
296 httpGet:
297 path: /healthz
298 port: 10254
299 scheme: HTTP
300 initialDelaySeconds: 10
301 periodSeconds: 10
302 successThreshold: 1
303 timeoutSeconds: 10
304 name: nginx-ingress-controller
305 ports:
306 - containerPort: 80
307 name: http
308 protocol: TCP
309 - containerPort: 443
310 name: https
311 protocol: TCP
312 readinessProbe:
313 failureThreshold: 3
314 httpGet:
315 path: /healthz
316 port: 10254
317 scheme: HTTP
318 periodSeconds: 10
319 successThreshold: 1
320 timeoutSeconds: 10
321 resources: {}
322 securityContext:
65