Balanceamento de carga avançado em clusters do GKE
Nesta página, mostramos como configurar o balanceamento de carga avançado em clusters do GKE para usuários gerenciados do Cloud Service Mesh (TD) usando a API Kubernetes. Para conferir o guia do usuário correspondente e configurar o balanceamento de carga avançado usando a APIGoogle Cloud , consulte Configurar o balanceamento de carga avançado.
É possível usar o balanceamento de carga avançado para:
- Mantenha o tráfego em uma zona de serviço até que a capacidade local seja esgotada.
- Envie o tráfego para o serviço em um local "principal" com failover para um local secundário quando endpoints suficientes no local principal ficarem sem integridade.
- Controle quando o failover acontece (com base na porcentagem de hosts íntegros).
Limitações
- Limitações gerais ao usar o balanceamento de carga avançado em Google Cloud apply.
- Esse recurso está disponível apenas para usuários do Cloud Service Mesh gerenciado que usam o Traffic Director como plano de controle e exige a versão 1.19.10-asm.22 ou mais recente do plano de dados.
- Nem todos os campos em GCPTrafficDistributionPolicy e GCPBackendPolicy são compatíveis com o Cloud Service Mesh gerenciado (TD). Os campos aceitos são:
- GCPTrafficDistributionPolicy
- ServiceLbAlgorithm
- AutoCapacityDrain
- FailoverConfig
- GCPBackendPolicy
- MaxRatePerEndpoint
- BackendPreference
- GCPTrafficDistributionPolicy
- O balanceamento de carga avançado só pode ser aplicado a serviços do Kubernetes com suporte de cargas de trabalho executadas no Google Cloud. Serviços ou cargas de trabalho externos (como ServiceEntry) não são compatíveis.
- As políticas de balanceamento de carga só podem ser aplicadas a serviços individuais do Kubernetes. Não há suporte para políticas de balanceamento de carga em todo o namespace/malha.
- Há suporte apenas para capacidade de QPS.
- Somente as versões do GKE >= 1.31.1 são compatíveis.
- As políticas avançadas de balanceamento de carga da malha de serviço só podem ser aplicadas a serviços que atendem apenas ao tráfego da malha. Não pode ser aplicado a serviços que atuam como back-ends do GKE Gateway. Os comportamentos de tráfego são indefinidos quando um destino de tráfego de balanceamento de carga avançado é um serviço do Kubernetes que atende ao tráfego da malha e ao tráfego de um gateway do GKE.
Configurar o balanceamento de carga avançado
É possível usar os seguintes recursos personalizados para configurar o balanceamento de carga avançado no GKE. Confira a definição detalhada do recurso no repositório gke-gateway-api.
GCPTrafficDistributionPolicy
O GCPTrafficDistributionPolicy configura a política de balanceamento de carga no nível do serviço para serviços do Kubernetes. Com ela, é possível:
- Escolha um algoritmo de balanceamento de carga personalizado. Os algoritmos compatíveis são descritos na tabela de balanceamento de carga avançado.
- Ative a diminuição automática de capacidade.
- Ajuste o limite de integridade para failover.
Se várias GCPTrafficDistributionPolicies segmentarem o mesmo serviço, a política mais antiga será aplicada.
GCPBackendPolicy
O GCPBackendPolicy configura propriedades de back-ends de serviço que afetam o comportamento do balanceamento de carga, incluindo:
- Capacidade de back-end do serviço.
- Designar back-ends preferenciais.
Se várias GCPBackendPolicies segmentarem o mesmo serviço em um cluster, a política mais antiga será aplicada.
Status da política
GCPTrafficDistributionPolicy e GCPBackendPolicy têm um campo de status que indica o status de vinculação da política.
Por exemplo, executar
kubectl describe gcpbackendpolicies example-policy -n example
resultaria em uma
saída semelhante a:
...
Status:
Ancestors:
Ancestor Ref:
Group:
Kind: Service
Name: example-svc
Namespace: example
Conditions:
Last Transition Time: 2024-10-13T01:15:03Z
Message:
Observed Generation: 1
Reason: Attached
Status: True
Type: Attached
Controller Name: gsmconfig.gke.io/controller
Configuração preliminar
Antes de concluir este guia, provisione o Cloud Service Mesh em um cluster do GKE.
Verifique se os CRDs estão instalados:
kubectl get crd
A saída é semelhante a:
... gcptrafficdistributionpolicies.networking.gke.io 2024-07-18T21:50:12Z gcpbackendpolicies.networking.gke.io 2024-07-18T21:50:12Z ...
Instale o CRD GCPBackendPolicy se ele ainda não estiver instalado:
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/gke-gateway-api/refs/heads/main/config/crd/networking.gke.io_gcpbackendpolicies.yaml
Instale o CRD GCPTrafficDistributionPolicy se ele ainda não estiver instalado:
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/gke-gateway-api/refs/heads/main/config/crd/networking.gke.io_gcptrafficdistributionpolicies.yaml
As políticas de exemplo neste guia do usuário têm como destino o serviço foo no namespace foo para fins de demonstração. Execute o comando a seguir para criar o serviço e o namespace de teste ou, se preferir, use seu próprio serviço e namespace:
kubectl apply -f - <<EOF
kind: Namespace
apiVersion: v1
metadata:
name: foo
labels:
istio-injection: enabled
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: foo
namespace: foo
spec:
replicas: 2
selector:
matchLabels:
app: test-backend
template:
metadata:
labels:
app: test-backend
spec:
containers:
- name: whereami
image: gcr.io/google-samples/whereami:v1.2.23
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: foo
namespace: foo
spec:
selector:
app: test-backend
ports:
- port: 8080
targetPort: 8080
EOF
Como configurar o algoritmo de balanceamento de carga
Por padrão, o tráfego para um serviço é distribuído igualmente para cada back-end de serviço em bom estado em uma malha de serviço do Cloud Service Mesh. É possível criar a GCPTrafficDistributionPolicy a seguir para que o tráfego seja distribuído para a zona mais próxima até a capacidade do back-end:
kubectl apply -f - <<EOF
apiVersion: networking.gke.io/v1
kind: GCPTrafficDistributionPolicy
metadata:
name: lb-policy
namespace: foo
spec:
targetRefs:
- kind: Service
group: ""
name: foo-service
default:
serviceLbAlgorithm: WATERFALL_BY_ZONE
EOF
Por padrão, os back-ends de serviço são tratados como se tivessem capacidade infinita. Quando houver hosts íntegros suficientes na zona local/mais próxima, o tráfego nunca será distribuído fora dessa zona para uma determinada localidade do cliente. Você pode configurar a capacidade do back-end do serviço usando GCPBackendPolicy para que uma única zona não fique sobrecarregada.
kubectl apply -f - <<EOF
apiVersion: networking.gke.io/v1
kind: GCPBackendPolicy
metadata:
name: backend-policy
namespace: foo
spec:
targetRef:
kind: Service
group: ""
name: foo-backend
default:
maxRatePerEndpoint: 5
EOF
Ajustar o comportamento de failover
Por padrão, o failover não será acionado enquanto uma porcentagem suficiente de hosts estiver íntegra nos back-ends principais. Para mais informações sobre back-ends principais e outras terminologias, consulte a Visão geral do balanceamento de carga avançado. Com a GCPTrafficDistributionPolicy, é possível configurar o limite de porcentagem de hosts íntegros até que o tráfego seja alternado dos back-ends principais para os back-ends de failover. O failover é acionado mais cedo com um limite maior. Por exemplo, se você quiser que o failover seja acionado assim que a porcentagem de hosts íntegros cair abaixo de 90% nos back-ends principais, configure a seguinte GCPTrafficDistributionPolicy:
kubectl apply -f - <<EOF
apiVersion: networking.gke.io/v1
kind: GCPTrafficDistributionPolicy
metadata:
name: lb-policy
namespace: foo
spec:
targetRefs:
- kind: Service
group: ""
name: foo-service
default:
failoverConfig:
failoverHealthThreshold: 90
EOF
Como configurar o balanceamento de carga avançado em uma malha de serviço de vários clusters
GCPTrafficDistributionPolicy e GCPBackendPolicy são aplicadas em escopos diferentes em uma malha de serviço de vários clusters.
Quando uma GCPTrafficDistributionPolicy tem como destino um serviço de vários clusters, ela define o comportamento de balanceamento de carga no nível do serviço em todos os clusters. Apenas uma GCPTrafficDistributionPolicy precisa ser criada para um serviço de vários clusters específico. Se você estiver usando a API Istio para configurar sua malha de serviço, poderá criar GCPTrafficDistributionPolicy em qualquer cluster da frota. Para verificar se uma política entra em conflito com outra, inspecione o status da política.
Quando uma GCPBackendPolicy tem como destino um serviço de vários clusters, ela define configurações no nível do back-end (por exemplo, capacidade por pod) para os pods de back-end selecionados pelo serviço de destino no cluster local. Para o mesmo serviço de vários clusters, é possível definir configurações diferentes no nível do back-end em clusters diferentes.
No exemplo a seguir, uma GCPTrafficDistributionPolicy é criada no cluster A para definir o algoritmo de balanceamento de carga a ser usado em toda a frota, enquanto GCPBackendPolicies estão em cada cluster. Ambas as GCPBackendPolicy configuram uma capacidade de 10 qps por pod para os pods de back-end no cluster local, enquanto a GCPBackendPolicy no cluster A configura os pods de back-end no cluster A como back-end preferido.
Juntas, essas políticas configuram os comportamentos de balanceamento de carga para o tráfego na malha enviado ao serviço foo:
- O tráfego de qualquer lugar prefere back-ends no cluster A até que os pods de back-end no cluster A precisem processar 10 qps por pod.
- Esse comportamento é definido principalmente pela GCPBackendPolicy que define
backendPreference
comoPREFERRED
no cluster A.
- Esse comportamento é definido principalmente pela GCPBackendPolicy que define
- O tráfego que excede a capacidade configurada dos back-ends no cluster A é
roteado usando o algoritmo
WATERFALL_BY_ZONE
para o cluster B. Para uma explicação mais detalhada dos back-ends preferenciais, consulte Visão geral do balanceamento de carga avançado.- Esse comportamento é definido principalmente pela GCPTrafficDistributionPolicy, que define o algoritmo, no cluster A, e pela GCPBackendPolicy, que define a capacidade do back-end, nos clusters A e B.
No Istio, os serviços regulares do Kubernetes se tornam implicitamente "multicluster" quando há vários clusters na malha de serviço e o serviço é criado em limites de cluster. Embora a GCPTrafficDistributionPolicy a seguir tenha como destino o serviço regular do Kubernetes foo, ela se aplica ao serviço multicluster foo que consiste em cargas de trabalho correspondentes em dois clusters.
Crie o GCPTrafficDistributionPolicy para o cluster A:
kubectl apply --context cluster-a-context -f - <<EOF kind: GCPTrafficDistributionPolicy apiVersion: networking.gke.io/v1 metadata: name: foo-traffic-distribution-policy namespace: foo spec: targetRefs: - kind: Service group: "" name: foo-service default: serviceLbAlgorithm: WATERFALL_BY_ZONE EOF
Crie a GCPBackendPolicy para o cluster A:
kubectl apply --context cluster-a-context -f - <<EOF kind: GCPBackendPolicy apiVersion: networking.gke.io/v1 metadata: name: foo-backend-policy namespace: foo spec: default: maxRatePerEndpoint: 100 backendPreference: PREFERRED targetRef: group: "" kind: Service name: foo-service EOF
Crie o GCPBackendPolicy para o cluster B:
kubectl apply --context cluster-b-context -f - <<EOF kind: GCPBackendPolicy apiVersion: networking.gke.io/v1 metadata: name: foo-backend-policy namespace: foo spec: default: maxRatePerEndpoint: 10 targetRef: group: "" kind: Service name: foo-service EOF
A seguir
- Saiba mais sobre o balanceamento de carga avançado