Neste documento, mostramos como configurar e verificar o balanceamento de carga do Maglev para serviços no GKE Dataplane V2.
O Maglev é um algoritmo hashing consistente que oferece balanceamento de carga de alta capacidade e baixa latência. O Maglev minimiza as quedas de pacotes e a interrupção da conexão quando os pods de back-end são escalonados, atualizados ou reagendados, ajudando a garantir que o mesmo fluxo seja mapeado de forma consistente para o mesmo back-end.
Para mais informações, consulte o artigo de pesquisa Maglev hashing consistente algorithm.
Recomendamos esse recurso para cargas de trabalho com conexões de longa duração ou aplicativos com estado em que as mudanças de back-end não devem interromper os fluxos atuais.
Para informações sobre sobrecarga de recursos e considerações de escalonabilidade, consulte Conceitos do GKE Dataplane V2.
Antes de começar
Antes de começar, verifique se você realizou as tarefas a seguir:
- Ative a API Google Kubernetes Engine. Ativar a API Google Kubernetes Engine
- Para usar a Google Cloud CLI nesta tarefa,
instale e
inicialize a
CLI gcloud. Se você instalou a CLI gcloud anteriormente, instale a versão
mais recente executando o comando
gcloud components update. Talvez as versões anteriores da CLI gcloud não sejam compatíveis com a execução dos comandos neste documento.
Pré-requisitos e limites
- Versão do GKE:1.36.0-gke.2882000 e mais recentes
- GKE Dataplane V2:ativado
- Modos de cluster:Autopilot e Standard
Criar um cluster do GKE com o GKE Dataplane V2
Para usar o Maglev, você precisa ter um cluster do GKE com o GKE Dataplane V2 ativado.
Piloto automático
Os clusters do Autopilot têm o GKE Dataplane V2 ativado por padrão. Para criar um cluster do Autopilot e recuperar a configuração dele, execute o seguinte comando:
gcloud container clusters create-auto CLUSTER_NAME \
--region=COMPUTE_REGION \
--release-channel=rapid
gcloud container clusters get-credentials CLUSTER_NAME \
--region=COMPUTE_REGION
Padrão
Para ativar o GKE Dataplane V2 em um cluster padrão, use a flag --enable-dataplane-v2. Para criar um cluster padrão e recuperar a configuração dele, execute o seguinte comando:
gcloud container clusters create CLUSTER_NAME \
--zone=COMPUTE_ZONE \
--enable-dataplane-v2 \
--cluster-version=1.36.0-gke.2882000
gcloud container clusters get-credentials CLUSTER_NAME \
--zone=COMPUTE_ZONE
Implantar um aplicativo de back-end
Antes de configurar os serviços de balanceamento de carga, implante um aplicativo de back-end
para processar o tráfego. Essa implantação executa cinco réplicas do aplicativo de exemplo hello-app.
Salve o seguinte manifesto como
echo-backend.yaml:apiVersion: apps/v1 kind: Deployment metadata: name: echo-backend spec: replicas: 5 selector: matchLabels: app: echo-backend template: metadata: labels: app: echo-backend spec: containers: - name: hello image: "us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0" ports: - containerPort: 8080Aplique o manifesto:
kubectl apply -f echo-backend.yaml
Configurar serviços de balanceamento de carga
É possível configurar os serviços para usar o algoritmo de balanceamento de carga do Maglev
ou o algoritmo de balanceamento de carga aleatório padrão. Os dois serviços têm como destino a implantação echo-backend criada na etapa anterior.
Configurar um serviço do Maglev
Para ativar o balanceamento de carga do Maglev, adicione a anotação gke.networking.io/lb-algorithm: "maglev" aos metadados do serviço durante a criação.
Salve o seguinte manifesto como
maglev-service.yaml:apiVersion: v1 kind: Service metadata: name: maglev-service annotations: gke.networking.io/lb-algorithm: "maglev" spec: selector: app: echo-backend ports: - protocol: TCP port: 80 targetPort: 8080Aplique o manifesto:
kubectl apply -f maglev-service.yaml
Configurar um serviço aleatório
Por padrão, os serviços usam um algoritmo de balanceamento de carga aleatório. Não é necessário especificar uma anotação para usar o algoritmo padrão, mas o exemplo a seguir o configura explicitamente para comparação.
Salve o seguinte manifesto como
random-service.yaml:apiVersion: v1 kind: Service metadata: name: random-service annotations: gke.networking.io/lb-algorithm: "random" spec: selector: app: echo-backend ports: - protocol: TCP port: 80 targetPort: 8080Aplique o manifesto:
kubectl apply -f random-service.yaml
Verificar a consistência do tráfego
É possível verificar as diferenças de consistência de roteamento entre o Maglev e o balanceamento de carga aleatório implantando pods de cliente de teste que enviam tráfego de uma porta de origem fixa.
Verificar a consistência do tráfego do Maglev
O Maglev encaminha solicitações da mesma porta de origem de maneira consistente para o mesmo pod de back-end.
Salve o seguinte manifesto como
client-maglev.yaml:apiVersion: v1 kind: Pod metadata: name: client-maglev spec: restartPolicy: Never containers: - name: curl image: curlimages/curl:8.2.0 command: ["/bin/sh", "-c"] args: - | while true; do curl -s -H "Connection: close" http://maglev-service:80 --local-port 54321 | grep Hostname sleep 0.5 doneA flag
--local-portforça a porta de origem, e o cabeçalhoConnection: closeajuda a garantir que o cliente possa reutilizar a porta de origem imediatamente para solicitações subsequentes.Aplique o manifesto:
kubectl apply -f client-maglev.yamlEnquanto o pod estiver em execução, verifique os registros:
kubectl logs client-maglevResposta esperada:
A saída mostra o mesmo nome do host impresso repetidamente, indicando que todo o tráfego do cliente é roteado consistentemente para o mesmo pod de back-end:
Hostname: echo-backend-5c78f66dbf-abcde Hostname: echo-backend-5c78f66dbf-abcde
Verificar a distribuição de tráfego padrão (aleatória)
O serviço padrão distribui o tráfego da mesma porta de origem entre diferentes pods de back-end.
Salve o seguinte manifesto como
client-random.yaml:apiVersion: v1 kind: Pod metadata: name: client-random spec: restartPolicy: Never containers: - name: curl image: curlimages/curl:8.2.0 command: ["/bin/sh", "-c"] args: - | while true; do curl -s -H "Connection: close" http://random-service:80 --local-port 54321 | grep Hostname sleep 0.5 doneAplique o manifesto:
kubectl apply -f client-random.yamlEnquanto o pod estiver em execução, verifique os registros:
kubectl logs client-randomResposta esperada:
A saída mostra vários nomes de host diferentes, indicando que o tráfego é distribuído entre vários pods:
Hostname: echo-backend-5c78f66dbf-abcde Hostname: echo-backend-5c78f66dbf-fghij Hostname: echo-backend-5c78f66dbf-klmno ...
Limpeza
Para limpar os recursos usados neste tutorial, execute os comandos a seguir:
Exclua os pods, serviços e implantações do cliente:
kubectl delete service maglev-service random-service kubectl delete deployment echo-backend kubectl delete pod client-maglev client-randomExclua os clusters do GKE:
Piloto automático
gcloud container clusters delete CLUSTER_NAME --region=COMPUTE_REGION
Padrão
gcloud container clusters delete CLUSTER_NAME --zone=COMPUTE_ZONE