开始

本节让你从一个非常简单的配置开始,并提供了一些配置示例。

开始使用 Envoy 的最快速方式就是 安装预制的二进制文件。你也可以选择从源码进行 构建

这些示例使用 v3 Envoy API,但是仅仅使用了 API 的静态配置特性,这些对于简单需求来讲是最有用的。动态配置 支持更多的复杂需求。

快速开始运行简单示例

这些指导说明使用 Envoy 仓库中的文件来运行示例。下面的章节对配置文件和相同配置下的执行步骤做了更详细的解释。

configs/google_com_proxy.v2.yaml 中提供了一个非常简单的 Envoy 配置,可以用来验证基本的纯 HTTP 代理。但这并不代表真实的 Envoy 部署:

$ docker pull envoyproxy/envoy-dev:9ff59124bd5e494acf3667c5ebe441fe5981a783
$ docker run --rm -d -p 10000:10000 envoyproxy/envoy-dev:9ff59124bd5e494acf3667c5ebe441fe5981a783
$ curl -v localhost:10000

使用的 Docker 镜像将包含最新版本的 Envoy 和一个基本的 Envoy 配置。这个基本的配置告诉 Envoy 将传入请求路由到 *.google.com。

简单配置

可以在命令行中以参数的形式传入一个简单的 YAML 文件来配置 Envoy。

需要 管理信息 来配置管理服务器。address 键指定了监听 地址,在这个例子中是 0.0.0.0:9901

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

static_resources 包含了当 Envoy 启动时静态配置的一切资源,与之相反的是当 Envoy 运行时动态配置的资源。v2 API 概览 描述了这些。

static_resources:

监听器 说明。

listeners:
- name: listener_0
  address:
    socket_address: { address: 0.0.0.0, port_value: 10000 }
  filter_chains:
  - filters:
    - name: envoy.filters.network.http_connection_manager
      typed_config:
        "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
        stat_prefix: ingress_http
        codec_type: AUTO
        route_config:
          name: local_route
          virtual_hosts:
          - name: local_service
            domains: ["*"]
            routes:
            - match: { prefix: "/" }
              route: { host_rewrite_literal: www.google.com, cluster: service_google }
        http_filters:
        - name: envoy.filters.http.router

集群 说明。

clusters:
- name: service_google
  connect_timeout: 0.25s
  type: LOGICAL_DNS
  # Comment out the following line to test on v6 networks
  dns_lookup_family: V4_ONLY
  lb_policy: ROUND_ROBIN
  load_assignment:
    cluster_name: service_google
    endpoints:
    - lb_endpoints:
      - endpoint:
          address:
            socket_address:
              address: www.google.com
              port_value: 443
  transport_socket:
    name: envoy.transport_sockets.tls
    typed_config:
      "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext
      sni: www.google.com

使用 Envoy Docker 镜像

创建一个简单的 Dockerfile 运行 Envoy,这需要假定在你本地的目录中有 envoy.yaml (如上描述)文件。

FROM envoyproxy/envoy-dev:9ff59124bd5e494acf3667c5ebe441fe5981a783
COPY envoy.yaml /etc/envoy/envoy.yaml

使用你的配置并用如下命令构建 Docker 镜像:

$ docker build -t envoy:v1 .

现在,你可以用如下命令启动 Envoy 容器了:

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

最后,你可以用如下命令来进行测试:

$ curl -v localhost:10000

如果你想用 docker-compose 来使用 Envoy,你可以用一个 volume 来覆写提供的配置文件。

默认情况下,Docker 镜像将以构建时创建的 envoy 用户来运行。

envoy 用户的 uidgid 可以在运行时使用 ENVOY_UIDENVOY_GID 这两个环境变量来设定。这也可以在 Docker 命令行中来完成设定,比如:

$ docker run -d --name envoy -e ENVOY_UID=777 -e ENVOY_GID=777 -p 9901:9901 -p 10000:10000 envoy:v1

如果你想对容器内部的 unix 套接字进行限制或者提供访问,抑或从容器外部控制 envoy 套接字的访问,这种方式是非常有用的。

如果你想以 root 用户来运行容器,你可以将 ENVOY_UID 设置为 0

默认情况下,envoy 镜像会把应用程序的日志发送到 /dev/stdout/dev/stderr ,这样就可以在容器日志中看到了。

如果你把应用程序日志、管理和访问日志输出到一个文件,envoy 用户将需要足够的权限来写这个文件。这个可以通过设置 ENVOY_UID 和/或者通过将文件变成 envoy 用户可写的方法来实现。

例如,在主机上挂载一个日志文件夹并且让它是可写的,你可以采取如下操作:

$ mkdir logs
$ chown 777 logs
$ docker run -d -v `pwd`/logs:/var/log --name envoy -e ENVOY_UID=777 -p 9901:9901 -p 10000:10000 envoy:v1

随后,你可以配置 envoy 将日志文件输出在 /var/log 文件里。

envoy uidgid 的默认值都是 101

envoy 用户还需要权限能够去访问被挂载到容器内部的任何需要的配置文件。

如果你运行的环境中有一个严格的 umask 设置,你可能需要通过设置文件的 uidgid 来给 envoy 提供访问权限,或者将配置文件设置为对 envoy 用户可读的。

有一种可以不用改变任何文件的权限或者在容器内部使用 root 用户的方法就是在启动容器的时候使用宿主机用户的 uid ,例如:

$ docker run -d --name envoy -e ENVOY_UID=`id -u` -p 9901:9901 -p 10000:10000 envoy:v1

沙盒

我们已经创建了一些使用 Docker 组件的沙盒环境,来设定不同的环境以进行 Envoy 特性的测试和示例配置的展示。随着我们对人们兴趣的判定,我们将添加更多的沙盒来验证不同的特性,如下是一些可用的沙盒: