Como configurar o balanceamento de carga HTTP com a Entrada

Neste tutorial, você aprenderá a executar um aplicativo da Web por trás de um balanceador de carga HTTP configurando o recurso Entrada.

Informações complementares

O GKE oferece compatibilidade integrada com dois tipos de balanceamento de carga do Cloud para um aplicativo publicamente acessível:

  1. Crie balanceadores de carga TCP/UDP com a especificação de type: LoadBalancer em um manifesto do recurso de serviço. Um balanceador de carga TCP funciona em servidores da Web HTTP, mas não é projetado para encerrar o tráfego HTTP(S), já que não reconhece solicitações HTTP(S) individuais. O GKE não configura nenhuma verificação de integridade para balanceadores de carga TCP/UDP. Consulte o tutorial do livro de visitas para ver um exemplo desse tipo de balanceador de carga.

  2. Crie balanceadores de carga HTTP(S) usando um recurso do Ingress. Balanceadores de carga HTTP(S) são projetados para encerrar solicitações HTTP(S) e são responsáveis por melhores decisões de balanceamento de carga contextual. Recursos como mapas de URL personalizáveis e encerramento de TLS são oferecidos pelos balanceadores de carga. O GKE configura automaticamente verificações de integridade para balanceadores de carga HTTP(S).

Se você estiver expondo um serviço HTTP(S) hospedado no GKE, o balanceamento de carga HTTP(S) é o método recomendado para balanceamento de carga.

[hc:] /kubernetes-engine/docs/concepts/ingress#health_checks

Antes de começar

Siga estas etapas para ativar a API do Kubernetes Engine:
  1. Acesse a página do Kubernetes Engine no Console do Google Cloud Platform.
  2. Crie ou selecione um projeto.
  3. Aguarde a ativação da API e dos serviços relacionados. Isso pode demorar alguns minutos.
  4. Verifique se o faturamento foi ativado para o projeto.

    Saiba como ativar o faturamento

Instale as seguintes ferramentas de linha de comando usadas neste tutorial:

  • O gcloud é usado para criar e excluir clusters do Kubernetes Engine. O gcloud está incluso no SDK do Google Cloud.
  • A kubectl é utilizada para gerenciar o Kubernetes, o sistema de orquestração de clusters do Kubernetes Engine. É possível instalar a kubectl usando a gcloud:
    gcloud components install kubectl

Definir padrões da ferramenta de linha de comando gcloud

Para não perder tempo digitando o código do projeto e as opções de zona do Compute Engine na ferramenta de linha de comando gcloud, defina os padrões:
gcloud config set project [PROJECT_ID]
gcloud config set compute/zone us-central1-b

Criar um cluster de contêiner

Crie um cluster de contêiner denominado loadbalancedcluster executando:

gcloud container clusters create loadbalancedcluster

Etapa 1: implantar um aplicativo da Web

Crie uma implantação usando a imagem de amostra do contêiner de aplicativo da Web para detectar em um servidor HTTP na porta 8080:

kubectl run web --image=gcr.io/google-samples/hello-app:1.0 --port=8080

Etapa 2: expor a implantação como um serviço internamente

Crie um recurso de serviço para que a implantação web possa ser acessada no cluster de contêiner:

kubectl expose deployment web --target-port=8080 --type=NodePort

Quando você cria um serviço do tipo NodePort com esse comando, o GKE o disponibiliza em um número de porta alto selecionado aleatoriamente (por exemplo, 32640) em todos os nós do cluster.

Verifique se o serviço foi criado e se uma porta de nó foi alocada:

kubectl get service web
Saída:
NAME      TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
web       NodePort   10.35.245.219   <none>        8080:32640/TCP   5m

Na amostra de saída acima, a porta de nó do serviço web é 32640. Além disso, observe que não há IP externo alocado para esse serviço. Como os nós do GKE não podem ser acessados externamente por padrão, criar esse serviço não faz com que o aplicativo possa ser acessado pela Internet.

Para que o aplicativo de servidor da Web HTTP(S) possa ser acessado publicamente, crie um recurso Ingress.

Etapa 3: criar um recurso Ingress

O Ingress é um recurso do Kubernetes que encapsula um conjunto de regras e configurações para encaminhar tráfego HTTP(S) externo aos serviços internos.

No GKE, o Ingress é implementado usando o Cloud Load Balancing. Quando você cria um Ingress no seu cluster, o GKE cria um balanceador de carga HTTP(S) e o configura para encaminhar tráfego para seu aplicativo.

O Kubernetes Ingress é um recurso Beta. Isso significa que a forma como você descreve o objeto dele está sujeita a alterações, mas os balanceadores de carga do Cloud provisionados pelo GKE para implementar o Ingress estão prontos para produção.

Com o arquivo de configuração a seguir, você define um recurso Ingress que direciona tráfego para o serviço web:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: basic-ingress
spec:
  backend:
    serviceName: web
    servicePort: 8080

Para implantar esse recurso Entrada, faça o download do basic-ingress.yaml e execute:

kubectl apply -f basic-ingress.yaml

Depois que você implanta esse manifesto, o Kubernetes cria um recurso Entrada no cluster. O controlador da Entrada em execução no cluster é responsável pela criação de um balanceador de carga HTTP(S) para encaminhar todo o tráfego HTTP externo (na porta 80) ao serviço NodePort web que você expôs.

Etapa 4: visitar o aplicativo

Para descobrir o endereço IP externo do balanceador de carga que disponibiliza o aplicativo, execute:

kubectl get ingress basic-ingress
Saída:
NAME            HOSTS     ADDRESS         PORTS     AGE
basic-ingress   *         203.0.113.12    80        2m

Aponte seu navegador para o endereço IP externo do seu aplicativo e veja uma resposta HTTP de texto simples como a seguinte:

Hello, world!
Version: 1.0.0
Hostname: web-6498765b79-fq5q5

Acesse Balanceamento de carga no console do GCP e verifique os recursos de rede criados pelo controlador do Ingress.

Etapa 5: configurar um endereço IP estático (opcional)

Quando você expõe um servidor da Web em um nome de domínio, precisa que o endereço IP externo de um aplicativo seja um IP estático que não seja alterado.

Por padrão, o GKE aloca endereços IP externos temporários de aplicativos HTTP expostos por meio de um Ingress. Endereços temporários estão sujeitos a alterações. Para um aplicativo da Web que você está planejando há bastante tempo, use um endereço IP externo estático.

Note que, depois de configurar um IP estático para o recurso do Ingress, a exclusão do Ingress não excluirá o endereço IP estático associado a ele. Certifique-se de limpar os endereços IP estáticos configurados se você não planeja usá-los novamente.

Opção 1: converter endereços IP temporários em estáticos

Se você já tem um Ingress implantado, é possível converter o endereço IP temporário do aplicativo para estático reservado sem alterar o endereço IP externo. Basta visitar a seção Endereços IP externos no Console do GCP.

Opção 2: reservar um novo endereço IP estático

Reserve um endereço IP externo estático, denominado web-static-ip, executando:

gcloud compute addresses create web-static-ip --global

Agora configure o recurso do Ingress atual para usar o endereço IP reservado. Substitua o conteúdo do manifesto basic-ingress.yaml pelo seguinte manifesto{/}:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: basic-ingress
  annotations:
    kubernetes.io/ingress.global-static-ip-name: "web-static-ip"
spec:
  backend:
    serviceName: web
    servicePort: 8080

Com essa alteração, uma anotação é adicionada ao Ingress para usar o recurso de IP estático chamado web-static-ip. Para aplicar essa modificação ao Ingress atual, execute o seguinte comando:

kubectl apply -f basic-ingress.yaml

Execute o kubectl get ingress basic-ingress e aguarde até que o endereço IP do seu aplicativo seja alterado para usar o endereço IP reservado do recurso web-static-ip.

A atualização do recurso Ingress atual, a reconfiguração do balanceador de carga e a propagação das regras de balanceamento de carga em todo o mundo podem demorar alguns minutos. Após a conclusão da operação, o GKE libera o endereço IP temporário anteriormente alocado para o aplicativo.

Etapa 6: disponibilizar vários aplicativos em um balanceador de carga (opcional)

Execute vários serviços em um único balanceador de carga e IP público configurando regras de encaminhamento no Ingress. Com a hospedagem de vários serviços no mesmo Ingress, você evita a criação de mais balanceadores de carga, que são recursos faturáveis, para cada serviço publicado na Internet.

Crie outro servidor da Web de implantação com a versão 2.0 do mesmo aplicativo da Web:

kubectl run web2 --image=gcr.io/google-samples/hello-app:2.0 --port=8080

Em seguida, publique a implantação do web2 internamente no cluster em um serviço NodePort chamado web:

kubectl expose deployment web2 --target-port=8080 --type=NodePort

O manifesto a seguir descreve um recurso do Ingress que:

  • encaminha as solicitações com o caminho iniciado por /v2/ para o serviço web2;
  • encaminha todas as outras solicitações para o serviço web.
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: fanout-ingress
spec:
  rules:
  - http:
      paths:
      - path: /*
        backend:
          serviceName: web
          servicePort: 8080
      - path: /v2/*
        backend:
          serviceName: web2
          servicePort: 8080

Para implantar esse manifesto, salve-o em um fanout-ingress.yaml e execute:

kubectl create -f fanout-ingress.yaml

Com o Ingress implantado, execute kubectl get ingress fanout-ingress para saber qual é o endereço IP público do cluster.

Em seguida, acesse o endereço IP para ver se os dois aplicativos podem ser acessados no mesmo balanceador de carga:

  • Acesse http://<IP_ADDRESS>/ e observe se a resposta contém Version: 1.0.0 (já que a solicitação é encaminhada para o serviço web).
  • Acesse http://<IP_ADDRESS>/v2/ e observe se a resposta contém Version: 2.0.0 (já que a solicitação é encaminhada para o serviço web2).

A única correspondência de padrão de caractere curinga aceita no campo path no Ingress do GKE é por meio do caractere *. Por exemplo, você pode ter regras com campos path como /* ou /foo/bar/*. Consulte a documentação de mapas de URL para conhecer as limitações de path.

Comentários

Os serviços publicados por meio de um Ingress precisam veicular uma resposta com o status HTTP 200 para solicitações GET no caminho /. Isso é usado para a verificação de integridade. Veja as observações sobre [Verificações de integridade][hc] para saber mais.

Casos de uso mais avançados recebem suporte do Ingress, como os abaixo:

  • Hospedagem virtual baseada em nome: use a Entrada para reaproveitar o balanceador de carga em vários nomes de domínio, subdomínios e para expor vários serviços em um único endereço IP e balanceador de carga. Confira os exemplos de fanout simples e hospedagem virtual baseada em nome para saber como configurar a Entrada para essas tarefas.

  • Encerramento HTTPS: configure a Entrada para encerrar o tráfego HTTPS usando o balanceador de carga do Cloud.

Quando um Ingress é excluído, os recursos associados são limpos automaticamente pelo controlador dele, com exceção dos endereços IP estáticos reservados.

Como fazer a limpeza

Para evitar cobranças dos recursos usados neste tutorial na conta do Google Cloud Platform:

  1. Exclua o Ingress: com essa opção, o endereço IP externo temporário e os recursos de balanceamento de carga associados ao aplicativo são desalocados:

    kubectl delete ingress basic-ingress

    Se você seguiu a "Etapa 6", exclua o Ingress. Basta executar:

    kubectl delete ingress fanout-ingress

  2. Exclua o endereço IP estático: execute apenas se tiver seguido a Etapa 5.

    • Se você tiver seguido a "Opção 1" na Etapa 5 para converter um endereço IP temporário atual em IP estático, visite o Console do GCP para excluir o IP estático.

    • Se você tiver seguido "Opção 2" na Etapa 5, execute o seguinte comando para excluir o endereço IP estático:

      gcloud compute addresses delete web-static-ip --global
  3. Exclua o cluster: com isso, são excluídos os nós de computação do cluster de contêiner e outros recursos, como as implantações:

    gcloud container clusters delete loadbalancedcluster

A seguir

Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…

Tutoriais do Kubernetes Engine