Skip to content

Envoy FiltersπŸ’£

Let’s deploy the web frontend workload first using kubectl apply -f envoy-demo-apps.yaml.

An type of envoy filter is to write filters using Lua scripts. An existing filter called HTTP Lua filter allows you to include a Lua script inline with the configuration. Here’s an example of what a configured Lua HTTP filter that adds a new header to the response would look like: We will create an Envoy filter that adds a header api-version to the HTTP response:

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: api-header-filter
  namespace: default
spec:
  workloadSelector:
    labels:
      app: web-frontend
  configPatches:
  - applyTo: HTTP_FILTER
    match:
      context: SIDECAR_INBOUND
      listener:
        portNumber: 8080
        filterChain:
          filter:
            name: "envoy.filters.network.http_connection_manager"
            subFilter:
              name: "envoy.filters.http.router"
    patch:
      operation: INSERT_BEFORE
      value:
        name: envoy.lua
        typed_config:
          "@type": "type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua"
          inlineCode: |
            function envoy_on_response(response_handle)
              response_handle:headers():add("api-version", "v1")
            end

Save the above file to envoy-header-filter.yaml and deploy it using kubectl apply -f envoy-header-filter.yaml.

To see the header added, you can send a request to the Ingress gateway with the following command:

curl -s -I -X HEAD  https://frontend.bigbang.dev/
HTTP/2 200 
x-powered-by: Express
content-type: text/html; charset=utf-8
content-length: 2471
etag: W/"9a7-hEXE7lJW5CDgD+e2FypGgChcgho"
date: Thu, 19 Aug 2021 14:38:12 GMT
x-envoy-upstream-service-time: 496
api-version: v1
server: istio-envoy

CleanupπŸ’£

To cleanup, delete the workloads and the EnvoyFilter:

kubectl delete -f envoy-demo-apps.yaml
kubectl delete -f envoy-header-filter.yaml