Envoy Gzip filter with Gloo Gateway

Gzip is an HTTP option which enables Gloo Gateway to compress data returned from an upstream service upon client request. Compression is useful in situations where large payloads need to be transmitted without compromising the response time.

This guide assumes you already have Gloo Gateway installed.
Support for the Envoy Gzip filter was added to Open Source Gloo Gateway as of version 1.3.4 and to Gloo Gateway Enterprise as of version 1.3.0-beta2.

Configuration

To get started with Gzip, modify the gateway and change the httpGateway object to include the gzip option. For example:

kubectl patch gateway -n gloo-system gateway-proxy --type merge -p '{"spec":{"httpGateway":{"options":{"gzip":{"compressionLevel":"BEST","contentType":["text/plain"]}}}}}'

Here’s an example of an edited gateway:

apiVersion: gateway.solo.io/v1
kind: Gateway
metadata:
  labels:
    app: gloo
  name: gateway-proxy
  namespace: gloo-system
spec:
  bindAddress: '::'
  bindPort: 8080
  httpGateway:
    options:
      gzip:
        compressionLevel: BEST
        contentType:
        - text/plain
  proxyNames:
  - gateway-proxy
  useProxyProto: false

Once that is saved, you’re all set. Traffic on the http gateway will call the gzip filter.

You can learn about the configuration options here.

More information about the Gzip filter can be found in the relevant Envoy docs. If data is not being compressed, you may want to check that all the necessary conditions for the Envoy filter are met. See the How it works section for information on when compression will be skipped.

Example

Let’s see Gzip compression in action.

First let’s add the following Virtual Service:

apiVersion: gateway.solo.io/v1
kind: VirtualService
metadata:
  name: sample-vs
  namespace: gloo-system
spec:
  virtualHost:
    domains:
      - '*'
    routes:
      - matchers:
        - exact: /helloworld
        directResponseAction:
          status: 200
          body: "Hello, world! It's me. I've been wondering if after all these years you'd like to meet."

This can be added by copying the Virtual Service definition and using the pbpaste | kubectl apply -f - command or by saving the Virtual Service definition to a file and using kubectl apply -f myFile.yaml, among other options.

Now, we’ll send a request to the route referenced in our virtual service:

curl -v $(glooctl proxy url)/helloworld -H "Accept-Encoding: gzip"

You should see that the response is in plain text.

Now edit the gateway as described above.

If we send the same request:

curl -v $(glooctl proxy url)/helloworld -H "Accept-Encoding: gzip"

We now see that the response includes the header content-encoding: gzip and that the body is binary.