Este tutorial mostra como executar uma aplicação Web atrás de um Application Load Balancer externo configurando o recurso Ingress.
Esta página destina-se a especialistas de redes que concebem e arquitetam a rede para a respetiva organização, bem como instalam, configuram e suportam equipamento de rede. Para saber mais sobre as funções comuns e as tarefas de exemplo que referimos no Google Cloud conteúdo, consulte Funções e tarefas comuns do utilizador do GKE.
Contexto
O Google Kubernetes Engine (GKE) oferece suporte integrado para dois tipos de Cloud Load Balancing para uma aplicação acessível publicamente:
Neste tutorial, vai usar Ingresses.
Entrada
Quando especifica kind: Ingress
num manifesto de recursos, indica ao GKE que crie um recurso Ingress. Ao incluir anotações e cargas de trabalho e serviços suportados, pode criar um controlador Ingress personalizado.
Caso contrário, o GKE faz as Google Cloud chamadas API adequadas para criar um balanceador de carga de aplicações externo. As regras de anfitrião e os correspondentes de caminhos do mapa de URLs do balanceador de carga fazem referência a um ou mais serviços de back-end, em que cada serviço de back-end corresponde a um serviço do GKE do tipo NodePort
, conforme referenciado no Ingress
. Os back-ends de cada serviço de back-end são grupos de instâncias ou grupos de pontos finais da rede (NEGs). Os NEGs são criados quando configura o balanceamento de carga nativo do contentor como parte da configuração da sua entrada. Para cada serviço de back-end, o GKE cria uma Google Cloud verificação de estado, com base nas
definições de sondagem de prontidão da carga de trabalho referenciada pelo
serviço do GKE correspondente.
Se estiver a expor um serviço HTTP(S) alojado no GKE, o balanceamento de carga HTTP(S) é o método recomendado para o balanceamento de carga.
Objetivos
- Crie um cluster do GKE.
- Implemente a aplicação Web de exemplo no cluster.
- Exponha a app de exemplo à Internet através de um Application Load Balancer externo.
Custos
Neste documento, usa os seguintes componentes faturáveis do Google Cloud:
Para gerar uma estimativa de custos com base na sua utilização projetada,
use a calculadora de preços.
Quando terminar as tarefas descritas neste documento, pode evitar a faturação contínua eliminando os recursos que criou. Para mais informações, consulte o artigo Limpe.
Antes de começar
Siga os passos abaixo para ativar a API Kubernetes Engine:- Visite a página do Kubernetes Engine na Google Cloud consola.
- Crie ou selecione um projeto.
- Aguarde até que a API e os serviços relacionados sejam ativados. Esta ação pode demorar vários minutos.
-
Verify that billing is enabled for your Google Cloud project.
Instale as seguintes ferramentas de linha de comandos usadas neste tutorial:
-
gcloud
é usado para criar e eliminar clusters do Kubernetes Engine.gcloud
está incluído na CLIgcloud
. -
O
kubectl
é usado para gerir o Kubernetes, o sistema de orquestração de clusters usado pelo Kubernetes Engine. Pode instalar okubectl
através dogcloud
:gcloud components install kubectl
Clone o exemplo de código do GitHub:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples cd kubernetes-engine-samples/networking/load-balancing
Defina predefinições para a ferramenta de linha de comandos gcloud
Para poupar tempo a escrever o ID do projeto
e as opções da zona do Compute Engine na gcloud
ferramenta de linha de comandos, pode definir as predefinições:
gcloud config set project project-id gcloud config set compute/zone compute-zone
Crie um cluster do GKE
Crie um cluster do GKE Autopilot:
gcloud container clusters create-auto loadbalancedcluster
Implementar uma app Web
O manifesto seguinte descreve uma Implementação que executa a imagem do contentor da aplicação Web de exemplo num servidor HTTP na porta 8080:
Aplique o recurso ao cluster:
kubectl apply -f web-deployment.yaml
Expor a sua implementação no cluster
O manifesto seguinte descreve um Service que torna a implementação web
acessível no cluster de contentores:
Aplique o recurso ao cluster:
kubectl apply -f web-service.yaml
Quando cria um serviço do tipo NodePort com este comando, o GKE disponibiliza o seu serviço num número de porta elevado selecionado aleatoriamente (por exemplo, 32640) em todos os nós no seu cluster.
Verifique se o serviço foi criado e se foi atribuída uma porta de nó:
Saída:kubectl get service web
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE web NodePort 10.35.245.219 <none> 8080:32640/TCP 5m
No exemplo de saída, a porta do nó para o serviço
web
é32640
. Tenha também em atenção que não existe nenhum IP externo atribuído a este serviço. Uma vez que os nós do GKE não são acessíveis externamente por predefinição, a criação deste serviço não torna a sua aplicação acessível a partir da Internet.
Para tornar a sua aplicação de servidor Web HTTP(S) acessível publicamente, tem de criar um recurso Ingress.
Criar um recurso Ingress
O Ingress é um recurso do Kubernetes que encapsula uma coleção de regras e configuração para encaminhar tráfego HTTP(S) externo para serviços internos.
No GKE, o Ingress é implementado através do Cloud Load Balancing. Quando cria um Ingress no seu cluster, o GKE cria um balanceador de carga HTTP(S) e configura-o para encaminhar o tráfego para a sua aplicação.
O manifesto seguinte descreve um recurso Ingress que direciona o tráfego para o seu serviço web
:
Aplique o recurso ao cluster:
kubectl apply -f basic-ingress.yaml
Depois de implementar este manifesto, o Kubernetes cria um recurso Ingress no seu cluster. O controlador Ingress do GKE cria e configura um balanceador de carga HTTP(S) de acordo com as informações no Ingress, encaminhando todo o tráfego HTTP externo (na porta 80) para o serviço web
NodePort que expôs.
Visitar a sua aplicação
Descubra o endereço IP externo do balanceador de carga que serve a sua aplicação executando o seguinte comando:
kubectl get ingress basic-ingress
NAME HOSTS ADDRESS PORTS AGE basic-ingress * 203.0.113.12 80 2m
Abra o endereço IP externo da sua aplicação num navegador e veja uma resposta HTTP de texto simples, como a seguinte:
Hello, world! Version: 1.0.0 Hostname: web-6498765b79-fq5q5
Pode visitar o Equilíbrio de carga na Google Cloud consola e inspecionar os recursos de rede criados pelo controlador GKE Ingress.
(Opcional) Configurar um endereço IP estático
Quando expõe um servidor Web num nome de domínio, precisa que o endereço IP externo de uma aplicação seja um IP estático que não se altere.
Por predefinição, o GKE atribui endereços IP externos temporários para aplicações HTTP expostas através de um Ingress. Os endereços efémeros estão sujeitos a alterações. Se planeia executar a sua aplicação durante muito tempo, tem de usar um endereço IP externo estático.
Tenha em atenção que, depois de configurar um IP estático para o recurso Ingress, a eliminação do Ingress não elimina o endereço IP estático associado. Certifique-se de que limpa os endereços IP estáticos que configurou quando já não planeia usá-los novamente.
Para configurar um endereço IP estático, conclua os seguintes passos:
Reserve um endereço IP externo estático denominado
web-static-ip
:gcloud
gcloud compute addresses create web-static-ip --global
Config Connector
Nota: este passo requer o Config Connector. Siga as instruções de instalação para instalar o Config Connector no seu cluster.
Para implementar este manifesto, transfira-o para a sua máquina como compute-address.yaml e execute:kubectl apply -f compute-address.yaml
O manifesto
basic-ingress-static.yaml
adiciona uma anotação na entrada para usar o recurso de IP estático denominadoweb-static-ip
:Veja o manifesto:
cat basic-ingress-static.yaml
Aplique o recurso ao cluster:
kubectl apply -f basic-ingress-static.yaml
Verifique o endereço IP externo:
kubectl get ingress basic-ingress
Aguarde até que o endereço IP da sua aplicação mude para usar o endereço IP reservado do recurso
web-static-ip
.A atualização do recurso Ingress existente, a reconfiguração do equilibrador de carga e a propagação das regras de equilíbrio de carga em todo o mundo podem demorar alguns minutos. Após a conclusão desta operação, o GKE liberta o endereço IP efémero atribuído anteriormente à sua aplicação.
(Opcional) Publicar várias aplicações num balanceador de carga
Pode executar vários serviços num único equilibrador de carga e IP público configurando regras de encaminhamento no Ingress. Ao alojar vários serviços no mesmo Ingress, pode evitar a criação de equilibradores de carga adicionais (que são recursos faturáveis) para cada serviço que expõe à Internet.
O manifesto seguinte descreve uma implementação com a versão 2.0
da mesma aplicação Web:
Aplique o recurso ao cluster:
kubectl apply -f web-deployment-v2.yaml
O manifesto seguinte descreve um serviço que expõe web2
internamente ao cluster num serviço NodePort denominado web2
:
Aplique o recurso ao cluster:
kubectl apply -f web-service-v2.yaml
O manifesto seguinte descreve um recurso Ingress que:
- Encaminha os pedidos com o caminho que começa com
/v2/
para o serviçoweb2
- Encaminha todos os outros pedidos para o
web
serviço
Aplique o recurso ao cluster:
kubectl create -f fanout-ingress.yaml
Após a implementação do Ingress, execute kubectl get ingress fanout-ingress
para saber o endereço IP público do cluster.
Em seguida, aceda ao endereço IP para ver que ambas as aplicações estão acessíveis no mesmo balanceador de carga:
- Aceda a
http://<IP_ADDRESS>/
e repare que a resposta contémVersion: 1.0.0
(uma vez que o pedido é encaminhado para o serviçoweb
) - Aceda a
http://<IP_ADDRESS>/v2/
e repare que a resposta contémVersion: 2.0.0
(uma vez que o pedido é encaminhado para o serviçoweb2
)
O único caráter universal suportado para o campo path
de um Ingress
é o caráter *
. O caráter *
tem de seguir uma barra (/
) e
tem de ser o último caráter no padrão. Por exemplo, /*
, /foo/*
e
/foo/bar/*
são padrões válidos, mas *
, /foo/bar*
e /foo/*/bar
não são.
Um padrão mais específico tem precedência sobre um padrão menos específico. Se tiver /foo/*
e /foo/bar/*
, considera-se que /foo/bar/bat
corresponde a /foo/bar/*
.
Para mais informações sobre as limitações de caminhos e a correspondência de padrões, consulte a documentação dos mapas de URLs.
(Opcional) Monitorizar a disponibilidade e a latência do seu serviço
AsGoogle Cloud verificações de tempo de atividade realizam a monitorização de caixa negra das aplicações do ponto de vista do utilizador, determinando a latência e a disponibilidade de vários IPs externos para o endereço IP do balanceador de carga. Em comparação,as Google Cloud verificações de funcionamento executam uma verificação interna em relação aos IPs dos pods, determinando a disponibilidade ao nível da instância. As verificações são complementares e oferecem uma imagem holística do estado de funcionamento da aplicação.
Pode criar uma verificação de tempo de atividade através da Google Cloud consola, da API Cloud Monitoring ou das bibliotecas cliente do Cloud Monitoring. Para mais informações, consulte o artigo Gerir verificações de tempo de atividade. Se quiser criar uma verificação de tempo de atividade através da Google Cloud consola, faça o seguinte:
Aceda à página Serviços e entrada na Google Cloud consola.
Clique no nome do serviço para o qual quer criar uma verificação de tempo de atividade.
Clique em Criar verificação de tempo de atividade.
No painel Criar verificação de tempo de atividade, introduza um título para a verificação de tempo de atividade e, de seguida, clique em Seguinte para avançar para as definições de Destino.
Os campos Destino da verificação de tempo de atividade são preenchidos automaticamente com as informações do equilibrador de carga do serviço.
Para ver a documentação completa sobre todos os campos numa verificação de tempo de atividade, consulte o artigo Criar uma verificação de tempo de atividade.
Clique em Seguinte para avançar para as definições de Validação da resposta.
Clique em Seguinte para avançar para a secção Alerta e notificação.
Para monitorizar uma verificação de tempo de atividade, pode criar uma política de alertas ou ver o painel de controlo da verificação de tempo de atividade. Uma política de alertas pode enviar-lhe uma notificação por email ou através de um canal diferente se a verificação de tempo de atividade falhar. Para obter informações gerais sobre as políticas de alertas, consulte o artigo Introdução aos alertas.
Clique em Criar.
Observações
Por predefinição, o Ingress realiza uma verificação de funcionamento periódica através de um pedido GET
no caminho /
para determinar o estado da aplicação e espera uma resposta HTTP 200. Se quiser verificar um caminho diferente ou esperar um código de resposta diferente, pode usar um caminho de verificação de estado personalizado.
A entrada suporta exemplos de utilização mais avançados, como:
Alojamento virtual baseado em nomes: pode usar o Ingress para reutilizar o balanceador de carga para vários nomes de domínios, subdomínios e para expor vários serviços num único endereço IP e balanceador de carga. Consulte os exemplos de fanout simples e alojamento virtual baseado em nomes para saber como configurar o Ingress para estas tarefas.
Rescisão de HTTPS: pode configurar o Ingress para rescindir o tráfego HTTPS através do Cloud Load Balancer.
Quando um Ingress é eliminado, o controlador de Ingress do GKE limpa automaticamente os recursos associados (exceto os endereços IP estáticos reservados).
Limpar
Para evitar incorrer em custos na sua conta do Google Cloud pelos recursos usados neste tutorial, elimine o projeto que contém os recursos ou mantenha o projeto e elimine os recursos individuais.
Elimine todas as regras de encaminhamento e proxies de destino criados manualmente que referenciem o Ingress:
Um proxy de destino pendente que faça referência a um mapa de URLs gerido pelo controlador de entrada do GKE faz com que a eliminação da entrada falhe nas versões 1.15.4-gke.22+ do GKE. Inspecione o recurso de entrada para encontrar um evento com uma mensagem de erro semelhante à seguinte:
Error during GC: error running load balancer garbage collection routine: googleapi: Error 400: The url_map resource 'projects/project-id/global/urlMaps/k8s2-um-tlw9rhgp-default-my-ingress-9ifnni82' is already being used by 'projects/project-id/global/targetHttpsProxies/k8s2-um-tlw9rhgp-default-my82-target-proxy', resourceInUseByAnotherResource
Na mensagem de erro anterior,
k8s2-um-tlw9rhgp-default-my82-target-proxy
é um proxy https de destino criado manualmente que ainda faz referência ao mapa de URLsk8s2-um-tlw9rhgp-default-my-ingress-9ifnni82
, que foi criado e gerido por um controlador de entrada.Estes recursos de front-end criados manualmente (regra de encaminhamento e proxy de destino) têm de ser eliminados antes de continuar com a eliminação do Ingress.
Elimine o Ingress: este passo desatribui o endereço IP externo efémero e os recursos de equilíbrio de carga associados à sua aplicação:
kubectl delete ingress basic-ingress
Se seguiu o passo opcional para criar um Ingress para encaminhar pedidos por caminho, elimine o Ingress:
kubectl delete ingress fanout-ingress
Elimine o endereço IP estático: conclua este passo apenas se tiver seguido o passo opcional para criar um endereço IP estático.
Se seguiu a "Opção 1" para converter um endereço IP efémero existente num IP estático, visite a Google Cloud consola para eliminar o endereço IP estático.
Se seguiu a "Opção 2" para criar um novo endereço IP estático, execute o comando seguinte para eliminar o endereço IP estático:
gcloud compute addresses delete web-static-ip --global
Elimine o cluster: este passo elimina os nós de computação do cluster de contentores e outros recursos, como as implementações no cluster:
gcloud container clusters delete loadbalancedcluster
O que se segue?
- Consulte o manual do utilizador do Ingress para ver detalhes sobre as funcionalidades do Ingress.
- Configure um IP estático e um nome de domínio para a sua aplicação de entrada através da entrada.
- Configure certificados SSL para o balanceador de carga de entrada.
- Saiba mais sobre a utilização de certificados SSL geridos pela Google com o Ingress.
Se tiver uma aplicação em execução em vários clusters do Kubernetes Engine em diferentes regiões, configure um Ingress de vários clusters para encaminhar o tráfego para um cluster na região mais próxima do utilizador.
Explore outros tutoriais do Kubernetes Engine.
Explore arquiteturas de referência, diagramas e práticas recomendadas sobre o Google Cloud. Consulte o nosso Centro de arquitetura na nuvem.