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.