Envoy: はじめてみる

# tldr
勉強がてらEnvoyのドキュメントにある[Getting Started](https://www.envoyproxy.io/docs/envoy/latest/start/start)を邦訳してみました。ベースはGoogle Translateで、ところどころ不自然な箇所を直しています。

原文としたのEnvoyのドキュメントは[こちらのディレクトリ以下](https://github.com/envoyproxy/envoy/tree/master/docs)にあります（ライセンス：[Apache License 2.0](https://github.com/envoyproxy/envoy/blob/master/LICENSE), [NOTICE](https://github.com/envoyproxy/envoy/blob/master/NOTICE)）。

# はじめてみる

このセクションでは、非常に単純な設定から始め、いくつかの設定例を紹介します。

Envoy は現在、ビルド済みのバイナリを別に提供していませんが、Dockerイメージを提供しています。これがEnvoyを使い始めるための最速の方法です。 Docker コンテナの外で Envoy を使用したい場合は、それを構築する必要があります。

これらの例では v2 Envoy API を使用しますが、API の静的構成機能のみを使用します。これは単純な要件に最も役立ちます。より複雑な要件については、動的構成がサポートされています。

## シンプルな例を実行するためのクイックスタート

これらの指示は、Envoy リポジトリ内のファイルから実行されます。以下のセクションでは、設定ファイルと同じ設定の実行手順について詳しく説明します。

基本的なプレーン HTTP プロキシを検証するために使用できる最小限の Envoy 設定は、configs/google_com_proxy.v2.yaml にあります。これは現実的な Envoy デプロイを表すことを意図していません。

``` sh
$ docker pull envoyproxy/envoy-dev:56f2f0d0161051a0b0eea1e1bad355a4668f1930
$ docker run --rm -d -p 10000:10000 envoyproxy/envoy-dev:56f2f0d0161051a0b0eea1e1bad355a4668f1930
$ curl -v localhost:10000
```

使用される Docker イメージには、最新バージョンの Envoy と基本的な Envoy 構成が含まれています。この基本設定は Envoy に着信要求を * .google.com にルーティングするように指示します。

## シンプルな構成

Envoy は、コマンドラインで引数として渡された単一の YAML ファイルを使用して設定することができます。

管理サーバーを構成するには管理メッセージが必要です。アドレスキーはリスニングアドレスを指定します。この場合、リスニングアドレスは単に0.0.0.0:9901です。

``` yaml
admin：
  access_log_path：/tmp/admin_access.log
  address：
    socket_address：{address：0.0.0.0、port_value：9901}
```

Envoyの実行時にリソースを動的に構成する手段とは対照的に、static_resources には、Envoy の起動時に静的に構成されるものすべてが含まれます。 v2 API の概要でこれについて説明しています。

``` yaml
listeners:
- name: listener_0
  address:
    socket_address: { address: 0.0.0.0, port_value: 10000 }
  filter_chains:
  - filters:
    - name: envoy.http_connection_manager
      typed_config:
        "@type": type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.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: www.google.com, cluster: service_google }
        http_filters:
        - name: envoy.router
```

クラスタの仕様

``` yaml
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
  tls_context:
    sni: www.google.com
```

## Envoy Docker イメージを使用する

Envoyを実行するための単純な Dockerfile を作成します。これは envoy.yaml（前述）がローカルディレクトリにあることを前提としています。コマンドラインオプションを参照できます。

``` sh
FROM envoyproxy/envoy-dev:56f2f0d0161051a0b0eea1e1bad355a4668f1930
COPY envoy.yaml /etc/envoy/envoy.yaml
```

以下を使用して設定を実行するDockerイメージを構築します。

``` sh
$ docker build -t envoy:v1 .
```

そして今、あなたはそれを実行することができます：

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

そして最後に、次のようにしてテストします。

``` sh
$ curl -v localhost:10000
```

docker-compose で Envoy を使用したい場合は、ボリュームを使用して提供されている設定ファイルを上書きすることができます。

## サンドボックス

Docker Compose を使用して、Envoy の機能をテストし、設定例を示すためにさまざまな環境を設定するためのサンドボックスを多数作成しました。人々の関心度合いを考慮しながら、さまざまな機能を示すサンドボックスを追加します。次のようなサンドボックスがあります。

- CORSフィルター
- フォルトインジェクション
- フロントプロキシ
- gRPCブリッジ
- Jaeguar ネイティブトレース
- Jaeguar トレース
- Lua
- MySQL
- Redis
- Zipkin トレーシング

## その他のユースケース

プロキシ自体に加えて、Envoy は特定のユースケースをターゲットとするいくつかのオープンソースディストリビューションの一部としてもバンドルされています。

- Ambassador と共に Kubernetes のAPIゲートウェイとしての Envoy
- Glooを備えた Kubernetes のための Ingress、APIおよび Function ゲートウェイとしての Envoy