New to Voyager? Please start here.

Configure Load Balancing Algorithm

You can configure a backend to use a specific load balancing algorithm using backend.loadBalanceOn. You can specify any HAProxy supported options along with arguments.

Ingress Example:

apiVersion: voyager.appscode.com/v1
kind: Ingress
metadata:
  name: test-ingress
  namespace: demo
spec:
  defaultBackend:
    service:
      name: test-server
      port:
        number: 80
    loadBalanceOn: roundrobin # configure for default backend
  rules:
  - http:
      port: 8989
      paths:
      - backend:
          service:
            name: test-server
            port:
              number: 8989
          loadBalanceOn: static-rr # configure for http backend
  - tcp:
      port: 4545
      backend:
        service:
          name: test-server
          port:
            number: 4545
        loadBalanceOn: leastconn # configure for tcp backend

Generated haproxy.cfg:

# HAProxy configuration generated by https://github.com/appscode/voyager
# DO NOT EDIT!
global
  daemon
  stats socket /var/run/haproxy.sock level admin expose-fd listeners
  server-state-file global
  server-state-base /var/state/haproxy/
  # log using a syslog socket
  log /dev/log local0 info
  tune.ssl.default-dh-param 2048
  ssl-default-bind-ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK
  lua-load /etc/auth-request.lua
  hard-stop-after 30s
defaults
  log global
  # https://cbonte.github.io/haproxy-dconv/1.7/configuration.html#4.2-option%20abortonclose
  # https://github.com/voyagermesh/gateway-docs/pull/403
  option dontlognull
  option http-server-close
  # Timeout values
  timeout client 50s
  timeout client-fin 50s
  timeout connect 5s
  timeout server 50s
  timeout tunnel 50s
  # Configure error files
  # default traffic mode is http
  # mode is overwritten in case of tcp services
  mode http
frontend http-0_0_0_0-8989
  bind *:8989  
  mode http
  option httplog
  option forwardfor
  acl is_proxy_https hdr(X-Forwarded-Proto) https
  acl is_proxy_https ssl_fc
  http-request set-var(req.scheme) str(https) if is_proxy_https
  http-request set-var(req.scheme) str(http) if ! is_proxy_https
  use_backend test-server.demo:8989 
  default_backend default-backend
backend test-server.demo:8989
  balance static-rr
  server pod-test-server-47lck 172.17.0.5:8989        
frontend tcp-0_0_0_0-4545
  bind *:4545     
  mode tcp
  default_backend test-server.demo:4545
backend test-server.demo:4545
  mode tcp
  balance leastconn
  server pod-test-server-47lck 172.17.0.5:4545     
backend default-backend
  balance roundrobin
  server pod-test-server-47lck 172.17.0.5:8080

Instead of configuring backends you can also specify load balancing algorithm in defaults sections. For that, you need to add balance <algorithm> in defaults.cfg using custom template. See here for detailed example on custom template.