Ingresos de Nginx usando hashing consistente para el balanceo de carga
El Nginx nativo soporta múltiples reglas de balanceo de carga, incluidos round robin ponderado y hash IP. Un ingreso de Nginx soporta el balanceo de carga mediante el uso de hash consistente basado en las capacidades nativas de Nginx.
De forma predeterminada, el método hash IP soportado por Nginx utiliza el espacio hash lineal. El servidor backend se selecciona en función del valor hash de la dirección IP. Sin embargo, cuando se utiliza este método para agregar o eliminar un nodo, todas las direcciones IP deben ser hash de nuevo y luego enrutadas de nuevo. Como resultado, se pierde un gran número de sesiones o la caché se vuelve inválida. Por lo tanto, se introduce un hash consistente en la entrada de Nginx para resolver este problema.
El hash consistente es un algoritmo hash especial, que construye un espacio hash de anillo para reemplazar el espacio hash lineal común. Cuando se agrega o elimina un nodo, solo se migra la ruta de destino en el sentido de las agujas del reloj, y no es necesario cambiar otras rutas. De esta manera, el reencaminamiento puede reducirse tanto como sea posible, resolviendo el problema de balanceo de carga causado por la adición y eliminación de nodos dinámicos.
Si se configura una regla de hash consistente, el servidor recién agregado compartirá la carga de todos los demás servidores. Del mismo modo, cuando se elimina un servidor, todos los demás servidores pueden compartir la carga del servidor eliminado. Esto equilibra la carga entre nodos en el clúster y evita el efecto de avalancha causado por la avería de un nodo.
Configuración de una regla de hash coherente
Una entrada Nginx puede usar la anotación nginx.ingress.kubernetes.io/upstream-hash-by para configurar reglas de hash consistentes. A continuación se presenta un ejemplo:
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 las solicitudes son hash basadas en el URI de solicitud.
- nginx.ingress.kubernetes.io/upstream-hash-by: "$request_uri$host" indica que las solicitudes son hash basadas en el URI de solicitud y el nombre de dominio.
- nginx.ingress.kubernetes.io/upstream-hash-by: "${request_uri}-text-value" indica que las solicitudes son hash basadas en el URI de solicitud y el valor de texto.