Ingresses de Nginx usar hashing consistente para balanceamento de carga
O Nginx nativo suporta várias regras de balanceamento de carga, incluindo round robin ponderado e hash IP. Um ingress de Nginx suporta balanceamento de carga usando hash consistente com base nos recursos do Nginx nativo.
Por padrão, o método de hash IP suportado pelo Nginx usa o espaço de hash linear. O servidor back-end é selecionado com base no valor de hash do endereço IP. No entanto, quando esse método é usado para adicionar ou excluir um nó, todos os endereços IP precisam ser hash novamente e, em seguida, roteados novamente. Como resultado, um grande número de sessões são perdidas ou o cache se torna inválido. Portanto, o hashing consistente é introduzido no ingress do Nginx para resolver esse problema.
O hashing consistente é um algoritmo de hash especial, que constrói um espaço de hash em anel para substituir o espaço de hash linear comum. Quando um nó é adicionado ou excluído, apenas a rota de destino é migrada no sentido horário e outras rotas não precisam ser alteradas. Dessa forma, o reencaminhamento pode ser reduzido o máximo possível, resolvendo o problema de balanceamento de carga causado pela adição e exclusão de nó dinâmicos.
Se uma regra de hashing consistente estiver configurada, o servidor recém-adicionado compartilhará a carga de todos os outros servidores. Da mesma forma, quando um servidor é removido, todos os outros servidores podem compartilhar a carga do servidor removido. Isso equilibra a carga entre os nós no cluster e evita o efeito de avalanche causado pela quebra de um nó.
Configurar uma regra de hashing consistente
Um ingress de Nginx pode usar a anotação nginx.ingress.kubernetes.io/upstream-hash-by para configurar regras de hashing consistentes. O seguinte é um exemplo:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-test
namespace: default
annotations:
nginx.ingress.kubernetes.io/upstream-hash-by: "$request_uri" # Perform hashing based on the request URI.
spec:
rules:
- host: ''
http:
paths:
- path: '/'
backend:
service:
name: <your_service_name> # Replace it with the name of your target Service.
port:
number: <your_service_port> # Replace 8080 with the port number of your target Service.
property:
ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
pathType: ImplementationSpecific
ingressClassName: nginx
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: ingress-test
namespace: default
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/upstream-hash-by: "$request_uri" # Perform hashing based on the request URI.
spec:
rules:
- host: ''
http:
paths:
- path: '/'
backend:
serviceName: <your_service_name> # Replace it with the name of your target Service.
servicePort: <your_service_port> # Replace 8080 with the port number of your target Service.
- nginx.ingress.kubernetes.io/upstream-hash-by: "$request_uri" indica que as solicitações são transformadas em hash com base no URI da solicitação.
- nginx.ingress.kubernetes.io/upstream-hash-by: "$request_uri$host" indica que as solicitações são transformadas em hash com base no URI da solicitação e no nome do domínio.
- nginx.ingress.kubernetes.io/upstream-hash-by: "${request_uri}-text-value" indica que as solicitações são hash com base no URI da solicitação e no valor do texto.