Getting Started

This section gets you started with a very simple configuration and provides some example configurations.

Envoy does not currently provide separate pre-built binaries, but does provide Docker images. This is the fastest way to get started using Envoy. Should you wish to use Envoy outside of a Docker container, you will need to build it.

These examples use the v2 Envoy API, but use only the static configuration feature of the API, which is most useful for simple requirements. For more complex requirements Dynamic Configuration is supported.

Quick Start to Run Simple Example

These instructions run from files in the Envoy repo. The sections below give a more detailed explanation of the configuration file and execution steps for the same configuration.

A very minimal Envoy configuration that can be used to validate basic plain HTTP proxying is available in configs/google_com_proxy.v2.yaml. This is not intended to represent a realistic Envoy deployment.

Copy both configs/Dockerfile and configs/google_com_proxy.v2.yaml to the same directory on your local disk. Then, build and run the Dockerfile, and test out Envoy by sending a request to port 10000:

  1. $ docker build -t envoy-google-test:v1 .
  2. $ docker run -d -p 10000:10000 envoy-google-test:v1
  3. $ curl -v localhost:10000

The Dockerfile will build a container containing the latest version of Envoy, and copy a basic Envoy configuration into the container. This basic configuration tells Envoy to route incoming requests to *.google.com.

Simple Configuration

Envoy can be configured using a single YAML file passed in as an argument on the command line.

The admin message is required to configure the administration server. The address key specifies the listening address which in this case is simply 0.0.0.0:9901.

  1. admin:
  2. access_log_path: /tmp/admin_access.log
  3. address:
  4. socket_address: { address: 0.0.0.0, port_value: 9901 }

The static_resources contains everything that is configured statically when Envoy starts, as opposed to the means of configuring resources dynamically when Envoy is running. The v2 API Overview describes this.

  1. static_resources:

The specification of the listeners.

  1. listeners:
  2. - name: listener_0
  3. address:
  4. socket_address: { address: 0.0.0.0, port_value: 10000 }
  5. filter_chains:
  6. - filters:
  7. - name: envoy.http_connection_manager
  8. config:
  9. stat_prefix: ingress_http
  10. codec_type: AUTO
  11. route_config:
  12. name: local_route
  13. virtual_hosts:
  14. - name: local_service
  15. domains: ["*"]
  16. routes:
  17. - match: { prefix: "/" }
  18. route: { host_rewrite: www.google.com, cluster: service_google }
  19. http_filters:
  20. - name: envoy.router

The specification of the clusters.

  1. clusters:
  2. - name: service_google
  3. connect_timeout: 0.25s
  4. type: LOGICAL_DNS
  5. # Comment out the following line to test on v6 networks
  6. dns_lookup_family: V4_ONLY
  7. lb_policy: ROUND_ROBIN
  8. hosts: [{ socket_address: { address: google.com, port_value: 443 }}]
  9. tls_context: { sni: www.google.com }

Using the Envoy Docker Image

Create a simple Dockerfile to execute Envoy, which assumes that envoy.yaml (described above) is in your local directory. You can refer to the Command line options.

  1. FROM envoyproxy/envoy:latest
  2. RUN apt-get update
  3. COPY envoy.yaml /etc/envoy.yaml
  4. CMD /usr/local/bin/envoy -c /etc/envoy.yaml

Build the Docker image that runs your configuration using:

  1. $ docker build -t envoy:v1

And now you can execute it with:

  1. $ docker run -d --name envoy -p 9901:9901 -p 10000:10000 envoy:v1

And finally test is using:

  1. $ curl -v localhost:10000

Sandboxes

We’ve created a number of sandboxes using Docker Compose that set up different environments to test out Envoy’s features and show sample configurations. As we gauge peoples’ interests we will add more sandboxes demonstrating different features. The following sandboxes are available:

Other use cases

In addition to the proxy itself, Envoy is also bundled as part of several open source distributions that target specific use cases.