[grpc-web] Looking for Envoy example of load balancing

Skip to first unread message

Rob Cecil

Feb 14, 2021, 12:43:42 PMFeb 14
to grpc.io
Looking for an example of an Envoy configuration that implements session affinity (stickiness) to load balance a cluster of backend servers.  Thanks!

I'm open to using the source IP or something in the header, but probably not cookie.


Rob Cecil

Feb 22, 2021, 11:40:36 AMFeb 22
to grpc.io
Just some follow up - in case anyone else is looking for solutions.

There are no obvious usage scenarios documented, but I found a solution using a lb_policy of "ring_hash" where the client provides a header that is unique the client. Just generate a unique, stable identifier throughout the lifetime of the client (browser) and inject that as a header (here using "x-session-hash", but it could be anything) into every request.

I'm using nanoid to generate unique strings in Javascript. I simply generate one and store in local storage.

Here's the relevant .yaml for an example configuration that defines a two-host upstream cluster:

  access_log_path: /tmp/admin_access.log
    socket_address: { address:, port_value: 9901 }

  - name: listener_0
      socket_address: { address:, port_value: 8080 }
    - filters:
      - name: envoy.filters.network.http_connection_manager
          codec_type: auto
          stat_prefix: ingress_http
            name: local_route
            - name: local_service
              domains: ["*"]
              - match: { prefix: "/" }
                  cluster: controlweb_backendservice
                    - header:
                        header_name: x-session-hash
                    grpc_timeout_header_max: 0s
                - prefix: "*"
                allow_methods: GET, PUT, DELETE, POST, OPTIONS
                allow_headers: keep-alive,user-agent,cache-control,content-type,content-transfer-encoding,access-token,x-accept-content-transfer-encoding,x-accept-response-streaming,x-user-agent,x-grpc-web,grpc-timeout,x-session-hash
                max_age: "1728000"
                expose_headers: access-token,grpc-status,grpc-message
          - name: envoy.filters.http.grpc_web
          - name: envoy.filters.http.cors
          - name: envoy.filters.http.router
  - name: controlweb_backendservice
    connect_timeout: 0.25s
    type: strict_dns
    http2_protocol_options: {}
    lb_policy: ring_hash
      cluster_name: cluster_0
        - lb_endpoints:
            - endpoint:
                    port_value: 50251
              load_balancing_weight: 10
            - endpoint:
                    port_value: 50251
              load_balancing_weight: 1

Rob Cecil

Feb 22, 2021, 11:41:28 AMFeb 22
to grpc.io
I am aware of maglev as a potential alternative lb_policy, and also there are problems if the cluster configuration is changed while there are outstand connections through envoy.

Rob Cecil

Feb 22, 2021, 11:42:38 AMFeb 22
to grpc.io
This was , in large part how I found the approach I am using:

Reply all
Reply to author
0 new messages