docs: migrate main Envoy repo docs to data-plane-api. (#232)
Signed-off-by: Harvey Tuch <htuch@google.com>pull/233/head
parent
735db49401
commit
320b5afbd0
142 changed files with 10035 additions and 12 deletions
@ -0,0 +1,24 @@ |
||||
# Developer-local docs build |
||||
|
||||
```bash |
||||
./docs/build.sh |
||||
``` |
||||
|
||||
The output can be found in `generated/docs`. |
||||
|
||||
# How the Envoy website and docs are updated |
||||
|
||||
The Envoy website, and docs are automatically built, and pushed on every commit |
||||
to master. This process is handled by Travis CI with the |
||||
[`publish.sh`](https://github.com/envoyproxy/envoy/blob/master/docs/publish.sh) script. |
||||
|
||||
In order to have this automatic process there is an encrypted ssh key at the root |
||||
of the envoy repo (`.publishdocskey.enc`). This key was encrypted with Travis CLI |
||||
and can only be decrypted by commits initiated in the Envoy repo, not PRs that are |
||||
submitted from forks. This is the case because only PRs initiated in the Envoy |
||||
repo have access to the secure environment variables (`encrypted_b1a4cc52fa4a_iv`, |
||||
`encrypted_b1a4cc52fa4a_key`) [used to decrypt the key.](https://docs.travis-ci.com/user/pull-requests#Pull-Requests-and-Security-Restrictions) |
||||
|
||||
The key only has write access to the Envoy repo. If the key, or the variables |
||||
used to decrypt it are ever compromised, delete the key immediately from the |
||||
Envoy repo in `Settings > Deploy keys`. |
@ -1,8 +0,0 @@ |
||||
Envoy v2 API documentation |
||||
========================== |
||||
|
||||
.. toctree:: |
||||
:glob: |
||||
:maxdepth: 2 |
||||
|
||||
** |
@ -0,0 +1,32 @@ |
||||
#!/bin/bash |
||||
|
||||
set -e |
||||
|
||||
DOCS_DIR=generated/docs |
||||
CHECKOUT_DIR=../envoy-docs |
||||
PUBLISH_DIR="$CHECKOUT_DIR"/envoy |
||||
BUILD_SHA=`git rev-parse HEAD` |
||||
|
||||
if [ -z "$CIRCLE_PULL_REQUEST" ] && [ "$CIRCLE_BRANCH" == "master" ] |
||||
then |
||||
echo 'cloning' |
||||
git clone git@github.com:envoyproxy/envoyproxy.github.io "$CHECKOUT_DIR" |
||||
|
||||
git -C "$CHECKOUT_DIR" fetch |
||||
git -C "$CHECKOUT_DIR" checkout -B master origin/master |
||||
rm -fr "$PUBLISH_DIR" |
||||
mkdir -p "$PUBLISH_DIR" |
||||
cp -r "$DOCS_DIR"/* "$PUBLISH_DIR" |
||||
cd "$CHECKOUT_DIR" |
||||
|
||||
git config user.name "envoy-docs(travis)" |
||||
git config user.email envoy-docs@users.noreply.github.com |
||||
echo 'add' |
||||
git add . |
||||
echo 'commit' |
||||
git commit -m "docs @$BUILD_SHA" |
||||
echo 'push' |
||||
git push origin master |
||||
else |
||||
echo "Ignoring PR branch for docs push" |
||||
fi |
After Width: | Height: | Size: 295 KiB |
After Width: | Height: | Size: 67 KiB |
After Width: | Height: | Size: 54 KiB |
After Width: | Height: | Size: 52 KiB |
@ -0,0 +1,19 @@ |
||||
About the documentation |
||||
======================= |
||||
|
||||
The Envoy documentation is composed of a few major sections: |
||||
|
||||
* :ref:`Introduction <intro>`: This section covers a general overview of what Envoy is, an |
||||
architecture overview, how it is typically deployed, etc. |
||||
|
||||
* :ref:`Installation <install>`: How to build/install Envoy using Docker. |
||||
|
||||
* :ref:`Configuration <config>`: Detailed configuration instructions. Where relevant, the |
||||
configuration guide also contains information on statistics, runtime configuration, and REST |
||||
APIs. |
||||
|
||||
* :ref:`Operations <operations>`: General information on how to operate Envoy including the command |
||||
line interface, hot restart wrapper, administration interface, a general statistics overview, |
||||
etc. |
||||
|
||||
* :ref:`Extending Envoy <extending>`: Information on how to write custom filters for Envoy. |
@ -0,0 +1,12 @@ |
||||
Envoy v2 API reference |
||||
====================== |
||||
|
||||
.. CAUTION:: |
||||
This documentation subtree is a work-in-progress and does not yet contain |
||||
complete documentation for the v2 API. Stay tuned for updates. |
||||
|
||||
.. toctree:: |
||||
:glob: |
||||
:maxdepth: 2 |
||||
|
||||
** |
@ -0,0 +1,308 @@ |
||||
.. _config_access_log: |
||||
|
||||
Access logging |
||||
============== |
||||
|
||||
Configuration |
||||
------------------------- |
||||
|
||||
Access logs are configured as part of the :ref:`HTTP connection manager config |
||||
<config_http_conn_man>` or :ref:`TCP Proxy <config_network_filters_tcp_proxy>`. |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"access_log": [ |
||||
{ |
||||
"path": "...", |
||||
"format": "...", |
||||
"filter": "{...}", |
||||
}, |
||||
] |
||||
} |
||||
|
||||
.. _config_access_log_path_param: |
||||
|
||||
path |
||||
*(required, string)* Path the access log is written to. |
||||
|
||||
.. _config_access_log_format_param: |
||||
|
||||
format |
||||
*(optional, string)* Access log format. Envoy supports :ref:`custom access log formats |
||||
<config_access_log_format>` as well as a :ref:`default format |
||||
<config_access_log_default_format>`. |
||||
|
||||
.. _config_access_log_filter_param: |
||||
|
||||
filter |
||||
*(optional, object)* :ref:`Filter <config_http_con_manager_access_log_filters>` which is used to |
||||
determine if the access log needs to be written. |
||||
|
||||
.. _config_access_log_format: |
||||
|
||||
Format rules |
||||
------------ |
||||
|
||||
The access log format string contains either command operators or other characters interpreted as a |
||||
plain string. The access log formatter does not make any assumptions about a new line separator, so one |
||||
has to specified as part of the format string. |
||||
See the :ref:`default format <config_access_log_default_format>` for an example. |
||||
Note that the access log line will contain a '-' character for every not set/empty value. |
||||
|
||||
The same format strings are used by different types of access logs (such as HTTP and TCP). Some |
||||
fields may have slightly different meanings, depending on what type of log it is. Differences |
||||
are noted. |
||||
|
||||
The following command operators are supported: |
||||
|
||||
%START_TIME% |
||||
HTTP |
||||
Request start time including milliseconds. |
||||
|
||||
TCP |
||||
Downstream connection start time including milliseconds. |
||||
|
||||
%BYTES_RECEIVED% |
||||
HTTP |
||||
Body bytes received. |
||||
|
||||
TCP |
||||
Downstream bytes received on connection. |
||||
|
||||
%PROTOCOL% |
||||
HTTP |
||||
Protocol. Currently either *HTTP/1.1* or *HTTP/2*. |
||||
|
||||
TCP |
||||
Not implemented ("-"). |
||||
|
||||
%RESPONSE_CODE% |
||||
HTTP |
||||
HTTP response code. Note that a response code of '0' means that the server never sent the |
||||
beginning of a response. This generally means that the (downstream) client disconnected. |
||||
|
||||
TCP |
||||
Not implemented ("-"). |
||||
|
||||
%BYTES_SENT% |
||||
HTTP |
||||
Body bytes sent. |
||||
|
||||
TCP |
||||
Downstream bytes sent on connection. |
||||
|
||||
%DURATION% |
||||
HTTP |
||||
Total duration in milliseconds of the request from the start time to the last byte out. |
||||
|
||||
TCP |
||||
Total duration in milliseconds of the downstream connection. |
||||
|
||||
%RESPONSE_FLAGS% |
||||
Additional details about the response or connection, if any. For TCP connections, the response codes mentioned in |
||||
the descriptions do not apply. Possible values are: |
||||
|
||||
HTTP and TCP |
||||
* **UH**: No healthy upstream hosts in upstream cluster in addition to 503 response code. |
||||
* **UF**: Upstream connection failure in addition to 503 response code. |
||||
* **UO**: Upstream overflow (:ref:`circuit breaking <arch_overview_circuit_break>`) in addition to 503 response code. |
||||
* **NR**: No :ref:`route configured <arch_overview_http_routing>` for a given request in addition to 404 response code. |
||||
HTTP only |
||||
* **LH**: Local service failed :ref:`health check request <arch_overview_health_checking>` in addition to 503 response code. |
||||
* **UT**: Upstream request timeout in addition to 504 response code. |
||||
* **LR**: Connection local reset in addition to 503 response code. |
||||
* **UR**: Upstream remote reset in addition to 503 response code. |
||||
* **UC**: Upstream connection termination in addition to 503 response code. |
||||
* **DI**: The request processing was delayed for a period specified via :ref:`fault injection <config_http_filters_fault_injection>`. |
||||
* **FI**: The request was aborted with a response code specified via :ref:`fault injection <config_http_filters_fault_injection>`. |
||||
* **RL**: The request was ratelimited locally by the :ref:`HTTP rate limit filter <config_http_filters_rate_limit>` in addition to 429 response code. |
||||
|
||||
%UPSTREAM_HOST% |
||||
Upstream host URL (e.g., tcp://ip:port for TCP connections). |
||||
|
||||
%UPSTREAM_CLUSTER% |
||||
Upstream cluster to which the upstream host belongs to. |
||||
|
||||
%REQ(X?Y):Z% |
||||
HTTP |
||||
An HTTP request header where X is the main HTTP header, Y is the alternative one, and Z is an |
||||
optional parameter denoting string truncation up to Z characters long. The value is taken from |
||||
the HTTP request header named X first and if it's not set, then request header Y is used. If |
||||
none of the headers are present '-' symbol will be in the log. |
||||
|
||||
TCP |
||||
Not implemented ("-"). |
||||
|
||||
%RESP(X?Y):Z% |
||||
HTTP |
||||
Same as **%REQ(X?Y):Z%** but taken from HTTP response headers. |
||||
|
||||
TCP |
||||
Not implemented ("-"). |
||||
|
||||
|
||||
.. _config_access_log_default_format: |
||||
|
||||
Default format |
||||
-------------- |
||||
|
||||
If custom format is not specified, Envoy uses the following default format: |
||||
|
||||
.. code-block:: none |
||||
|
||||
[%START_TIME%] "%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%" |
||||
%RESPONSE_CODE% %RESPONSE_FLAGS% %BYTES_RECEIVED% %BYTES_SENT% %DURATION% |
||||
%RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% "%REQ(X-FORWARDED-FOR)%" "%REQ(USER-AGENT)%" |
||||
"%REQ(X-REQUEST-ID)%" "%REQ(:AUTHORITY)%" "%UPSTREAM_HOST%"\n |
||||
|
||||
Example of the default Envoy access log format: |
||||
|
||||
.. code-block:: none |
||||
|
||||
[2016-04-15T20:17:00.310Z] "POST /api/v1/locations HTTP/2" 204 - 154 0 226 100 "10.0.35.28" |
||||
"nsq2http" "cc21d9b0-cf5c-432b-8c7e-98aeb7988cd2" "locations" "tcp://10.0.2.1:80" |
||||
|
||||
.. _config_http_con_manager_access_log_filters: |
||||
|
||||
Filters |
||||
------- |
||||
|
||||
Envoy supports the following access log filters: |
||||
|
||||
.. contents:: |
||||
:local: |
||||
|
||||
Status code |
||||
^^^^^^^^^^^ |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"filter": { |
||||
"type": "status_code", |
||||
"op": "...", |
||||
"value": "...", |
||||
"runtime_key": "..." |
||||
} |
||||
} |
||||
|
||||
Filters on HTTP response/status code. |
||||
|
||||
op |
||||
*(required, string)* Comparison operator. Currently *>=* and *=* are the only supported operators. |
||||
|
||||
value |
||||
*(required, integer)* Default value to compare against if runtime value is not available. |
||||
|
||||
runtime_key |
||||
*(optional, string)* Runtime key to get value for comparision. This value is used if defined. |
||||
|
||||
Duration |
||||
^^^^^^^^ |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"filter": { |
||||
"type": "duration", |
||||
"op": "..", |
||||
"value": "...", |
||||
"runtime_key": "..." |
||||
} |
||||
} |
||||
|
||||
Filters on total request duration in milliseconds. |
||||
|
||||
op |
||||
*(required, string)* Comparison operator. Currently *>=* and *=* are the only supported operators. |
||||
|
||||
value |
||||
*(required, integer)* Default value to compare against if runtime values is not available. |
||||
|
||||
runtime_key |
||||
*(optional, string)* Runtime key to get value for comparision. This value is used if defined. |
||||
|
||||
|
||||
Not health check |
||||
^^^^^^^^^^^^^^^^ |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"filter": { |
||||
"type": "not_healthcheck" |
||||
} |
||||
} |
||||
|
||||
Filters for requests that are not health check requests. A health check request is marked by |
||||
the :ref:`health check filter <config_http_filters_health_check>`. |
||||
|
||||
Traceable |
||||
^^^^^^^^^ |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"filter": { |
||||
"type": "traceable_request" |
||||
} |
||||
} |
||||
|
||||
Filters for requests that are traceable. See the :ref:`tracing overview <arch_overview_tracing>` for |
||||
more information on how a request becomes traceable. |
||||
|
||||
|
||||
.. _config_http_con_manager_access_log_filters_runtime: |
||||
|
||||
Runtime |
||||
^^^^^^^^^ |
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"filter": { |
||||
"type": "runtime", |
||||
"key" : "..." |
||||
} |
||||
} |
||||
|
||||
Filters for random sampling of requests. Sampling pivots on the header |
||||
:ref:`x-request-id<config_http_conn_man_headers_x-request-id>` being present. If |
||||
:ref:`x-request-id<config_http_conn_man_headers_x-request-id>` is present, the filter will |
||||
consistently sample across multiple hosts based on the runtime key value and the value extracted |
||||
from :ref:`x-request-id<config_http_conn_man_headers_x-request-id>`. If it is missing, the |
||||
filter will randomly sample based on the runtime key value. |
||||
|
||||
key |
||||
*(required, string)* Runtime key to get the percentage of requests to be sampled. |
||||
This runtime control is specified in the range 0-100 and defaults to 0. |
||||
|
||||
And |
||||
^^^ |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"filter": { |
||||
"type": "logical_and", |
||||
"filters": [] |
||||
} |
||||
} |
||||
|
||||
Performs a logical "and" operation on the result of each filter in *filters*. Filters are evaluated |
||||
sequentially and if one of them returns false, the filter returns false immediately. |
||||
|
||||
Or |
||||
^^ |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"filter": { |
||||
"type": "logical_or", |
||||
"filters": [] |
||||
} |
||||
} |
||||
|
||||
Performs a logical "or" operation on the result of each individual filter. Filters are evaluated |
||||
sequentially and if one of them returns true, the filter returns true immediately. |
@ -0,0 +1,66 @@ |
||||
.. _config_cluster_manager_cds: |
||||
|
||||
Cluster discovery service |
||||
========================= |
||||
|
||||
The cluster discovery service (CDS) is an optional API that Envoy will call to dynamically fetch |
||||
cluster manager members. Envoy will reconcile the API response and add, modify, or remove known |
||||
clusters depending on what is required. |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"cluster": "{...}", |
||||
"refresh_delay_ms": "..." |
||||
} |
||||
|
||||
:ref:`cluster <config_cluster_manager_cluster>` |
||||
*(required, object)* A standard definition of an upstream cluster that hosts the cluster |
||||
discovery service. The cluster must run a REST service that implements the :ref:`CDS HTTP API |
||||
<config_cluster_manager_cds_api>`. |
||||
|
||||
refresh_delay_ms |
||||
*(optional, integer)* The delay, in milliseconds, between fetches to the CDS API. Envoy will add |
||||
an additional random jitter to the delay that is between zero and *refresh_delay_ms* |
||||
milliseconds. Thus the longest possible refresh delay is 2 \* *refresh_delay_ms*. Default value |
||||
is 30000ms (30 seconds). |
||||
|
||||
.. _config_cluster_manager_cds_api: |
||||
|
||||
REST API |
||||
-------- |
||||
|
||||
.. http:get:: /v1/clusters/(string: service_cluster)/(string: service_node) |
||||
|
||||
Asks the discovery service to return all clusters for a particular `service_cluster` and |
||||
`service_node`. `service_cluster` corresponds to the :option:`--service-cluster` CLI option. |
||||
`service_node` corresponds to the :option:`--service-node` CLI option. Responses use the following |
||||
JSON schema: |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"clusters": [] |
||||
} |
||||
|
||||
clusters |
||||
*(Required, array)* A list of :ref:`clusters <config_cluster_manager_cluster>` that will be |
||||
dynamically added/modified within the cluster manager. Envoy will reconcile this list with the |
||||
clusters that are currently loaded and either add/modify/remove clusters as necessary. Note that |
||||
any clusters that are statically defined within the Envoy configuration cannot be modified via |
||||
the CDS API. |
||||
|
||||
Statistics |
||||
---------- |
||||
|
||||
CDS has a statistics tree rooted at *cluster_manager.cds.* with the following statistics: |
||||
|
||||
.. csv-table:: |
||||
:header: Name, Type, Description |
||||
:widths: 1, 1, 2 |
||||
|
||||
config_reload, Counter, Total API fetches that resulted in a config reload due to a different config |
||||
update_attempt, Counter, Total API fetches attempted |
||||
update_success, Counter, Total API fetches completed successfully |
||||
update_failure, Counter, Total API fetches that failed (either network or schema errors) |
||||
version, Gauge, Hash of the contents from the last successful API fetch |
@ -0,0 +1,201 @@ |
||||
.. _config_cluster_manager_cluster: |
||||
|
||||
Cluster |
||||
======= |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"name": "...", |
||||
"type": "...", |
||||
"connect_timeout_ms": "...", |
||||
"per_connection_buffer_limit_bytes": "...", |
||||
"lb_type": "...", |
||||
"hosts": [], |
||||
"service_name": "...", |
||||
"health_check": "{...}", |
||||
"max_requests_per_connection": "...", |
||||
"circuit_breakers": "{...}", |
||||
"ssl_context": "{...}", |
||||
"features": "...", |
||||
"http2_settings": "{...}", |
||||
"cleanup_interval_ms": "...", |
||||
"dns_refresh_rate_ms": "...", |
||||
"dns_lookup_family": "...", |
||||
"dns_resolvers": [], |
||||
"outlier_detection": "{...}" |
||||
} |
||||
|
||||
.. _config_cluster_manager_cluster_name: |
||||
|
||||
name |
||||
*(required, string)* Supplies the name of the cluster which must be unique across all clusters. |
||||
The cluster name is used when emitting :ref:`statistics <config_cluster_manager_cluster_stats>`. |
||||
By default, the maximum length of a cluster name is limited to 60 characters. This limit can be |
||||
increased by setting the :option:`--max-obj-name-len` command line argument to the desired value. |
||||
|
||||
.. _config_cluster_manager_type: |
||||
|
||||
type |
||||
*(required, string)* The :ref:`service discovery type <arch_overview_service_discovery_types>` to |
||||
use for resolving the cluster. Possible options are *static*, *strict_dns*, *logical_dns*, |
||||
:ref:`*original_dst* <arch_overview_service_discovery_types_original_destination>`, and *sds*. |
||||
|
||||
connect_timeout_ms |
||||
*(required, integer)* The timeout for new network connections to hosts in the cluster specified |
||||
in milliseconds. |
||||
|
||||
.. _config_cluster_manager_cluster_per_connection_buffer_limit_bytes: |
||||
|
||||
per_connection_buffer_limit_bytes |
||||
*(optional, integer)* Soft limit on size of the cluster's connections read and write buffers. |
||||
If unspecified, an implementation defined default is applied (1MiB). |
||||
|
||||
.. _config_cluster_manager_cluster_lb_type: |
||||
|
||||
lb_type |
||||
*(required, string)* The :ref:`load balancer type <arch_overview_load_balancing_types>` to use |
||||
when picking a host in the cluster. Possible options are *round_robin*, *least_request*, |
||||
*ring_hash*, *random*, and *original_dst_lb*. Note that :ref:`*original_dst_lb* |
||||
<arch_overview_load_balancing_types_original_destination>` must be used with clusters of type |
||||
:ref:`*original_dst* <arch_overview_service_discovery_types_original_destination>`, and may not be |
||||
used with any other cluster type. |
||||
|
||||
hosts |
||||
*(sometimes required, array)* If the service discovery type is *static*, *strict_dns*, or |
||||
*logical_dns* the hosts array is required. Hosts array is not allowed with cluster type |
||||
*original_dst*. How it is specified depends on the type of service discovery: |
||||
|
||||
static |
||||
Static clusters must use fully resolved hosts that require no DNS lookups. Both TCP and unix |
||||
domain sockets (UDS) addresses are supported. A TCP address looks like: |
||||
|
||||
``tcp://<ip>:<port>`` |
||||
|
||||
A UDS address looks like: |
||||
|
||||
``unix://<file name>`` |
||||
|
||||
A list of addresses can be specified as in the following example: |
||||
|
||||
.. code-block:: json |
||||
|
||||
[{"url": "tcp://10.0.0.2:1234"}, {"url": "tcp://10.0.0.3:5678"}] |
||||
|
||||
strict_dns |
||||
Strict DNS clusters can specify any number of hostname:port combinations. All names will be |
||||
resolved using DNS and grouped together to form the final cluster. If multiple records are |
||||
returned for a single name, all will be used. For example: |
||||
|
||||
.. code-block:: json |
||||
|
||||
[{"url": "tcp://foo1.bar.com:1234"}, {"url": "tcp://foo2.bar.com:5678"}] |
||||
|
||||
logical_dns |
||||
Logical DNS clusters specify hostnames much like strict DNS, however only the first host will be |
||||
used. For example: |
||||
|
||||
.. code-block:: json |
||||
|
||||
[{"url": "tcp://foo1.bar.com:1234"}] |
||||
|
||||
.. _config_cluster_manager_cluster_service_name: |
||||
|
||||
service_name |
||||
*(sometimes required, string)* This parameter is required if the service discovery type is *sds*. |
||||
It will be passed to the :ref:`SDS API <config_cluster_manager_sds_api>` when fetching cluster |
||||
members. |
||||
|
||||
:ref:`health_check <config_cluster_manager_cluster_hc>` |
||||
*(optional, object)* Optional :ref:`active health checking <arch_overview_health_checking>` |
||||
configuration for the cluster. If no configuration is specified no health checking will be done |
||||
and all cluster members will be considered healthy at all times. |
||||
|
||||
max_requests_per_connection |
||||
*(optional, integer)* Optional maximum requests for a single upstream connection. This |
||||
parameter is respected by both the HTTP/1.1 and HTTP/2 connection pool implementations. If not |
||||
specified, there is no limit. Setting this parameter to 1 will effectively disable keep alive. |
||||
|
||||
:ref:`circuit_breakers <config_cluster_manager_cluster_circuit_breakers>` |
||||
*(optional, object)* Optional :ref:`circuit breaking <arch_overview_circuit_break>` settings |
||||
for the cluster. |
||||
|
||||
:ref:`ssl_context <config_cluster_manager_cluster_ssl>` |
||||
*(optional, object)* The TLS configuration for connections to the upstream cluster. If no TLS |
||||
configuration is specified, TLS will not be used for new connections. |
||||
|
||||
.. _config_cluster_manager_cluster_features: |
||||
|
||||
features |
||||
*(optional, string)* A comma delimited list of features that the upstream cluster supports. |
||||
The currently supported features are: |
||||
|
||||
http2 |
||||
If *http2* is specified, Envoy will assume that the upstream supports HTTP/2 when making new |
||||
HTTP connection pool connections. Currently, Envoy only supports prior knowledge for upstream |
||||
connections. Even if TLS is used with ALPN, *http2* must be specified. As an aside this allows |
||||
HTTP/2 connections to happen over plain text. |
||||
|
||||
.. _config_cluster_manager_cluster_http2_settings: |
||||
|
||||
http2_settings |
||||
*(optional, object)* Additional HTTP/2 settings that are passed directly to the HTTP/2 codec when |
||||
initiating HTTP connection pool connections. These are the same options supported in the HTTP connection |
||||
manager :ref:`http2_settings <config_http_conn_man_http2_settings>` option. |
||||
|
||||
.. _config_cluster_manager_cluster_cleanup_interval_ms: |
||||
|
||||
cleanup_interval_ms |
||||
*(optional, integer)* The interval for removing stale hosts from an *original_dst* cluster. Hosts |
||||
are considered stale if they have not been used as upstream destinations during this interval. |
||||
New hosts are added to original destination clusters on demand as new connections are redirected |
||||
to Envoy, causing the number of hosts in the cluster to grow over time. Hosts that are not stale |
||||
(they are actively used as destinations) are kept in the cluster, which allows connections to |
||||
them remain open, saving the latency that would otherwise be spent on opening new connections. |
||||
If this setting is not specified, the value defaults to 5000. For cluster types other than |
||||
*original_dst* this setting is ignored. |
||||
|
||||
.. _config_cluster_manager_cluster_dns_refresh_rate_ms: |
||||
|
||||
dns_refresh_rate_ms |
||||
*(optional, integer)* If the dns refresh rate is specified and the cluster type is either *strict_dns*, |
||||
or *logical_dns*, this value is used as the cluster's dns refresh rate. If this setting is not specified, |
||||
the value defaults to 5000. For cluster types other than *strict_dns* and *logical_dns* this setting is |
||||
ignored. |
||||
|
||||
.. _config_cluster_manager_cluster_dns_lookup_family: |
||||
|
||||
dns_lookup_family |
||||
*(optional, string)* The DNS IP address resolution policy. The options are *v4_only*, *v6_only*, |
||||
and *auto*. If this setting is not specified, the value defaults to *v4_only*. When *v4_only* is selected, |
||||
the DNS resolver will only perform a lookup for addresses in the IPv4 family. If *v6_only* is selected, |
||||
the DNS resolver will only perform a lookup for addresses in the IPv6 family. If *auto* is specified, |
||||
the DNS resolver will first perform a lookup for addresses in the IPv6 family and fallback to a lookup for |
||||
addresses in the IPv4 family. For cluster types other than *strict_dns* and *logical_dns*, this setting |
||||
is ignored. |
||||
|
||||
.. _config_cluster_manager_cluster_dns_resolvers: |
||||
|
||||
dns_resolvers |
||||
*(optional, array)* If DNS resolvers are specified and the cluster type is either *strict_dns*, or |
||||
*logical_dns*, this value is used to specify the cluster's dns resolvers. If this setting is not |
||||
specified, the value defaults to the default resolver, which uses /etc/resolv.conf for |
||||
configuration. For cluster types other than *strict_dns* and *logical_dns* this setting is |
||||
ignored. |
||||
|
||||
.. _config_cluster_manager_cluster_outlier_detection_summary: |
||||
|
||||
:ref:`outlier_detection <config_cluster_manager_cluster_outlier_detection>` |
||||
*(optional, object)* If specified, outlier detection will be enabled for this upstream cluster. |
||||
See the :ref:`architecture overview <arch_overview_outlier_detection>` for more information on outlier |
||||
detection. |
||||
|
||||
.. toctree:: |
||||
:hidden: |
||||
|
||||
cluster_hc |
||||
cluster_circuit_breakers |
||||
cluster_ssl |
||||
cluster_stats |
||||
cluster_runtime |
||||
cluster_outlier_detection |
@ -0,0 +1,73 @@ |
||||
.. _config_cluster_manager_cluster_circuit_breakers: |
||||
|
||||
Circuit breakers |
||||
================ |
||||
|
||||
* Circuit breaking :ref:`architecture overview <arch_overview_circuit_break>`. |
||||
* Priority routing :ref:`architecture overview <arch_overview_http_routing_priority>`. |
||||
|
||||
Circuit breaking settings can be specified individually for each defined priority. How the |
||||
different priorities are used are documented in the sections of the configuration guide that use |
||||
them. |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"default": "{...}", |
||||
"high": "{...}" |
||||
} |
||||
|
||||
default |
||||
*(optional, object)* Settings object for default priority. |
||||
|
||||
high |
||||
*(optional, object)* Settings object for high priority. |
||||
|
||||
Per priority settings |
||||
--------------------- |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"max_connections": "...", |
||||
"max_pending_requests": "...", |
||||
"max_requests": "...", |
||||
"max_retries": "...", |
||||
} |
||||
|
||||
.. _config_cluster_manager_cluster_circuit_breakers_max_connections: |
||||
|
||||
max_connections |
||||
*(optional, integer)* The maximum number of connections that Envoy will make to the upstream |
||||
cluster. If not specified, the default is 1024. See the :ref:`circuit breaking overview |
||||
<arch_overview_circuit_break>` for more information. |
||||
|
||||
.. _config_cluster_manager_cluster_circuit_breakers_max_pending_requests: |
||||
|
||||
max_pending_requests |
||||
*(optional, integer)* The maximum number of pending requests that Envoy will allow to the upstream |
||||
cluster. If not specified, the default is 1024. See the :ref:`circuit breaking overview |
||||
<arch_overview_circuit_break>` for more information. |
||||
|
||||
.. _config_cluster_manager_cluster_circuit_breakers_max_requests: |
||||
|
||||
max_requests |
||||
*(optional, integer)* The maximum number of parallel requests that Envoy will make to the upstream |
||||
cluster. If not specified, the default is 1024. See the :ref:`circuit breaking overview |
||||
<arch_overview_circuit_break>` for more information. |
||||
|
||||
.. _config_cluster_manager_cluster_circuit_breakers_max_retries: |
||||
|
||||
max_retries |
||||
*(optional, integer)* The maximum number of parallel retries that Envoy will allow to the upstream |
||||
cluster. If not specified, the default is 3. See the :ref:`circuit breaking overview |
||||
<arch_overview_circuit_break>` for more information. |
||||
|
||||
Runtime |
||||
------- |
||||
|
||||
All four circuit breaking settings are runtime configurable for all defined priorities based on cluster |
||||
name. They follow the following naming scheme ``circuit_breakers.<cluster_name>.<priority>.<setting>``. |
||||
``cluster_name`` is the name field in each cluster's configuration, which is set in the envoy |
||||
:ref:`config file <config_cluster_manager_cluster_name>`. Available runtime settings will override |
||||
settings set in the envoy config file. |
@ -0,0 +1,140 @@ |
||||
.. _config_cluster_manager_cluster_hc: |
||||
|
||||
Health checking |
||||
=============== |
||||
|
||||
* Health checking :ref:`architecture overview <arch_overview_health_checking>`. |
||||
* If health checking is configured for a cluster, additional statistics are emitted. They are |
||||
documented :ref:`here <config_cluster_manager_cluster_stats>`. |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"type": "...", |
||||
"timeout_ms": "...", |
||||
"interval_ms": "...", |
||||
"unhealthy_threshold": "...", |
||||
"healthy_threshold": "...", |
||||
"path": "...", |
||||
"send": [], |
||||
"receive": [], |
||||
"interval_jitter_ms": "...", |
||||
"service_name": "..." |
||||
} |
||||
|
||||
type |
||||
*(required, string)* The type of health checking to perform. Currently supported types are |
||||
*http*, *redis*, and *tcp*. See the :ref:`architecture overview <arch_overview_health_checking>` |
||||
for more information. |
||||
|
||||
timeout_ms |
||||
*(required, integer)* The time in milliseconds to wait for a health check response. If the |
||||
timeout is reached the health check attempt will be considered a failure. |
||||
|
||||
.. _config_cluster_manager_cluster_hc_interval: |
||||
|
||||
interval_ms |
||||
*(required, integer)* The interval between health checks in milliseconds. |
||||
|
||||
unhealthy_threshold |
||||
*(required, integer)* The number of unhealthy health checks required before a host is marked |
||||
unhealthy. Note that for *http* health checking if a host responds with 503 this threshold is |
||||
ignored and the host is considered unhealthy immediately. |
||||
|
||||
healthy_threshold |
||||
*(required, integer)* The number of healthy health checks required before a host is marked |
||||
healthy. Note that during startup, only a single successful health check is required to mark |
||||
a host healthy. |
||||
|
||||
path |
||||
*(sometimes required, string)* This parameter is required if the type is *http*. It species the |
||||
HTTP path that will be requested during health checking. For example */healthcheck*. |
||||
|
||||
send |
||||
*(sometimes required, array)* This parameter is required if the type is *tcp*. It specifies |
||||
the bytes to send for a health check request. It is an array of hex byte strings specified |
||||
as in the following example: |
||||
|
||||
.. code-block:: json |
||||
|
||||
[ |
||||
{"binary": "01"}, |
||||
{"binary": "000000FF"} |
||||
] |
||||
|
||||
The array is allowed to be empty in the case of "connect only" health checking. |
||||
|
||||
receive |
||||
*(sometimes required, array)* This parameter is required if the type is *tcp*. It specified the |
||||
bytes that are expected in a successful health check response. It is an array of hex byte strings |
||||
specified similarly to the *send* parameter. The array is allowed to be empty in the case of |
||||
"connect only" health checking. |
||||
|
||||
interval_jitter_ms |
||||
*(optional, integer)* An optional jitter amount in millseconds. If specified, during every |
||||
internal Envoy will add 0 to *interval_jitter_ms* milliseconds to the wait time. |
||||
|
||||
.. _config_cluster_manager_cluster_hc_service_name: |
||||
|
||||
service_name |
||||
*(optional, string)* An optional service name parameter which is used to validate the identity of |
||||
the health checked cluster. See the :ref:`architecture overview |
||||
<arch_overview_health_checking_identity>` for more information. |
||||
|
||||
.. _config_cluster_manager_cluster_hc_tcp_health_checking: |
||||
|
||||
TCP health checking |
||||
------------------- |
||||
|
||||
The type of matching performed is the following (this is the MongoDB health check request and |
||||
response): |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"send": [ |
||||
{"binary": "39000000"}, |
||||
{"binary": "EEEEEEEE"}, |
||||
{"binary": "00000000"}, |
||||
{"binary": "d4070000"}, |
||||
{"binary": "00000000"}, |
||||
{"binary": "746573742e"}, |
||||
{"binary": "24636d6400"}, |
||||
{"binary": "00000000"}, |
||||
{"binary": "FFFFFFFF"}, |
||||
{"binary": "13000000"}, |
||||
{"binary": "01"}, |
||||
{"binary": "70696e6700"}, |
||||
{"binary": "000000000000f03f"}, |
||||
{"binary": "00"} |
||||
], |
||||
"receive": [ |
||||
{"binary": "EEEEEEEE"}, |
||||
{"binary": "01000000"}, |
||||
{"binary": "00000000"}, |
||||
{"binary": "0000000000000000"}, |
||||
{"binary": "00000000"}, |
||||
{"binary": "11000000"}, |
||||
{"binary": "01"}, |
||||
{"binary": "6f6b"}, |
||||
{"binary": "00000000000000f03f"}, |
||||
{"binary": "00"} |
||||
] |
||||
} |
||||
|
||||
During each health check cycle, all of the "send" bytes are sent to the target server. Each |
||||
binary block can be of arbitrary length and is just concatenated together when sent. (Separating |
||||
into multiple blocks can be useful for readability). |
||||
|
||||
When checking the response, "fuzzy" matching is performed such that each binary block must be found, |
||||
and in the order specified, but not necessarly contiguous. Thus, in the example above, |
||||
"FFFFFFFF" could be inserted in the response between "EEEEEEEE" and "01000000" and the check |
||||
would still pass. This is done to support protocols that insert non-deterministic data, such as |
||||
time, into the response. |
||||
|
||||
Health checks that require a more complex pattern such as send/receive/send/receive are not |
||||
currently possible. |
||||
|
||||
If "receive" is an empty array, Envoy will perform "connect only" TCP health checking. During each |
||||
cycle, Envoy will attempt to connect to the upstream host, and consider it a success if the |
||||
connection succeeds. A new connection is created for each health check cycle. |
@ -0,0 +1,67 @@ |
||||
.. _config_cluster_manager: |
||||
|
||||
Cluster manager |
||||
=============== |
||||
|
||||
.. toctree:: |
||||
:hidden: |
||||
|
||||
cluster |
||||
sds |
||||
sds_api |
||||
outlier |
||||
cds |
||||
|
||||
Cluster manager :ref:`architecture overview <arch_overview_cluster_manager>`. |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"clusters": [], |
||||
"sds": "{...}", |
||||
"local_cluster_name": "...", |
||||
"outlier_detection": "{...}", |
||||
"cds": "{...}" |
||||
} |
||||
|
||||
.. _config_cluster_manager_clusters: |
||||
|
||||
:ref:`clusters <config_cluster_manager_cluster>` |
||||
*(required, array)* A list of upstream clusters that the cluster manager performs |
||||
:ref:`service discovery <arch_overview_service_discovery>`, |
||||
:ref:`health checking <arch_overview_health_checking>`, and |
||||
:ref:`load balancing <arch_overview_load_balancing>` on. |
||||
|
||||
:ref:`sds <config_cluster_manager_sds>` |
||||
*(sometimes required, object)* If any defined clusters use the :ref:`sds |
||||
<arch_overview_service_discovery_sds>` cluster type, a global SDS configuration must be specified. |
||||
|
||||
.. _config_cluster_manager_local_cluster_name: |
||||
|
||||
local_cluster_name |
||||
*(optional, string)* Name of the local cluster (i.e., the cluster that owns the Envoy running this |
||||
configuration). In order to enable |
||||
:ref:`zone aware routing <arch_overview_load_balancing_zone_aware_routing>` this option must be |
||||
set. If *local_cluster_name* is defined then :ref:`clusters <config_cluster_manager_clusters>` |
||||
must contain a definition of a cluster with the same name. |
||||
|
||||
:ref:`outlier_detection <config_cluster_manager_outlier_detection>` |
||||
*(optional, object)* Optional global configuration for outlier detection. |
||||
|
||||
:ref:`cds <config_cluster_manager_cds>` |
||||
*(optional, object)* Optional configuration for the cluster discovery service (CDS) API. |
||||
|
||||
Statistics |
||||
---------- |
||||
|
||||
The cluster manager has a statistics tree rooted at *cluster_manager.* with the following |
||||
statistics. Any ``:`` character in the stats name is replaced with ``_``. |
||||
|
||||
.. csv-table:: |
||||
:header: Name, Type, Description |
||||
:widths: 1, 1, 2 |
||||
|
||||
cluster_added, Counter, Total clusters added (either via static config or CDS) |
||||
cluster_modified, Counter, Total clusters modified (via CDS) |
||||
cluster_removed, Counter, Total clusters removed (via CDS) |
||||
total_clusters, Gauge, Number of currently loaded clusters |
@ -0,0 +1,85 @@ |
||||
.. _config_cluster_manager_cluster_outlier_detection: |
||||
|
||||
Outlier detection |
||||
================= |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"consecutive_5xx": "...", |
||||
"interval_ms": "...", |
||||
"base_ejection_time_ms": "...", |
||||
"max_ejection_percent": "...", |
||||
"enforcing_consecutive_5xx" : "...", |
||||
"enforcing_success_rate" : "...", |
||||
"success_rate_minimum_hosts" : "...", |
||||
"success_rate_request_volume" : "...", |
||||
"success_rate_stdev_factor" : "..." |
||||
} |
||||
|
||||
.. _config_cluster_manager_cluster_outlier_detection_consecutive_5xx: |
||||
|
||||
consecutive_5xx |
||||
*(optional, integer)* The number of consecutive 5xx responses before a consecutive 5xx ejection occurs. Defaults to 5. |
||||
|
||||
.. _config_cluster_manager_cluster_outlier_detection_interval_ms: |
||||
|
||||
interval_ms |
||||
*(optional, integer)* The time interval between ejection analysis sweeps. This can result in both new ejections as well |
||||
as hosts being returned to service. Defaults to 10000ms or 10s. |
||||
|
||||
.. _config_cluster_manager_cluster_outlier_detection_base_ejection_time_ms: |
||||
|
||||
base_ejection_time_ms |
||||
*(optional, integer)* The base time that a host is ejected for. The real time is equal to the base time multiplied by |
||||
the number of times the host has been ejected. Defaults to 30000ms or 30s. |
||||
|
||||
.. _config_cluster_manager_cluster_outlier_detection_max_ejection_percent: |
||||
|
||||
max_ejection_percent |
||||
*(optional, integer)* The maximum % of hosts in an upstream cluster that can be ejected due to outlier detection. |
||||
Defaults to 10%. |
||||
|
||||
.. _config_cluster_manager_cluster_outlier_detection_enforcing_consecutive_5xx: |
||||
|
||||
enforcing_consecutive_5xx |
||||
*(optional, integer)* The % chance that a host will be actually ejected when an outlier status is detected through |
||||
consecutive 5xx. This setting can be used to disable ejection or to ramp it up slowly. |
||||
Defaults to 100 with 1% granularity. |
||||
|
||||
.. _config_cluster_manager_cluster_outlier_detection_enforcing_success_rate: |
||||
|
||||
enforcing_success_rate |
||||
*(optional, integer)* The % chance that a host will be actually ejected when an outlier status is detected through |
||||
success rate statistics. This setting can be used to disable ejection or to ramp it up slowly. |
||||
Defaults to 100 with 1% granularity. |
||||
|
||||
.. _config_cluster_manager_cluster_outlier_detection_success_rate_minimum_hosts: |
||||
|
||||
success_rate_minimum_hosts |
||||
*(optional, integer)* The number of hosts in a cluster that must have enough request volume to detect success rate outliers. |
||||
If the number of hosts is less than this setting, outlier detection via success rate statistics is not |
||||
performed for any host in the cluster. Defaults to 5. |
||||
|
||||
.. _config_cluster_manager_cluster_outlier_detection_success_rate_request_volume: |
||||
|
||||
success_rate_request_volume |
||||
*(optional, integer)* The minimum number of total requests that must be collected in one interval |
||||
(as defined by :ref:`interval_ms <config_cluster_manager_cluster_outlier_detection_interval_ms>` above) |
||||
to include this host in success rate based outlier detection. If the volume is lower than this setting, |
||||
outlier detection via success rate statistics is not performed for that host. Defaults to 100. |
||||
|
||||
.. _config_cluster_manager_cluster_outlier_detection_success_rate_stdev_factor: |
||||
|
||||
success_rate_stdev_factor |
||||
*(optional, integer)* This factor is used to determine the ejection threshold for success rate outlier ejection. |
||||
The ejection threshold is used as a measure to determine when a particular host has fallen below an acceptable |
||||
success rate. |
||||
The ejection threshold is the difference between the mean success rate, and the product of |
||||
this factor and the standard deviation of the mean success rate: |
||||
``mean - (stdev * success_rate_stdev_factor)``. This factor is divided by a thousand to |
||||
get a ``double``. That is, if the desired factor is ``1.9``, the runtime value should be ``1900``. |
||||
Defaults to 1900. |
||||
|
||||
Each of the above configuration values can be overridden via |
||||
:ref:`runtime values <config_cluster_manager_cluster_runtime_outlier_detection>`. |
@ -0,0 +1,130 @@ |
||||
.. _config_cluster_manager_cluster_runtime: |
||||
|
||||
Runtime |
||||
======= |
||||
|
||||
Upstream clusters support the following runtime settings: |
||||
|
||||
Active health checking |
||||
---------------------- |
||||
|
||||
health_check.min_interval |
||||
Min value for the health checking :ref:`interval <config_cluster_manager_cluster_hc_interval>`. |
||||
Default value is 0. The health checking interval will be between *min_interval* and |
||||
*max_interval*. |
||||
|
||||
health_check.max_interval |
||||
Max value for the health checking :ref:`interval <config_cluster_manager_cluster_hc_interval>`. |
||||
Default value is MAX_INT. The health checking interval will be between *min_interval* and |
||||
*max_interval*. |
||||
|
||||
health_check.verify_cluster |
||||
What % of health check requests will be verified against the :ref:`expected upstream service |
||||
<config_cluster_manager_cluster_hc_service_name>` as the :ref:`health check filter |
||||
<arch_overview_health_checking_filter>` will write the remote service cluster into the response. |
||||
|
||||
.. _config_cluster_manager_cluster_runtime_outlier_detection: |
||||
|
||||
Outlier detection |
||||
----------------- |
||||
|
||||
See the outlier detection :ref:`architecture overview <arch_overview_outlier_detection>` for more |
||||
information on outlier detection. The runtime parameters supported by outlier detection are the |
||||
same as the :ref:`static configuration parameters <config_cluster_manager_cluster_outlier_detection>`, namely: |
||||
|
||||
outlier_detection.consecutive_5xx |
||||
:ref:`consecutive_5XX |
||||
<config_cluster_manager_cluster_outlier_detection_consecutive_5xx>` |
||||
setting in outlier detection |
||||
|
||||
outlier_detection.interval_ms |
||||
:ref:`interval_ms |
||||
<config_cluster_manager_cluster_outlier_detection_interval_ms>` |
||||
setting in outlier detection |
||||
|
||||
outlier_detection.base_ejection_time_ms |
||||
:ref:`base_ejection_time_ms |
||||
<config_cluster_manager_cluster_outlier_detection_base_ejection_time_ms>` |
||||
setting in outlier detection |
||||
|
||||
outlier_detection.max_ejection_percent |
||||
:ref:`max_ejection_percent |
||||
<config_cluster_manager_cluster_outlier_detection_max_ejection_percent>` |
||||
setting in outlier detection |
||||
|
||||
outlier_detection.enforcing_consecutive_5xx |
||||
:ref:`enforcing_consecutive_5xx |
||||
<config_cluster_manager_cluster_outlier_detection_enforcing_consecutive_5xx>` |
||||
setting in outlier detection |
||||
|
||||
outlier_detection.enforcing_success_rate |
||||
:ref:`enforcing_success_rate |
||||
<config_cluster_manager_cluster_outlier_detection_enforcing_success_rate>` |
||||
setting in outlier detection |
||||
|
||||
outlier_detection.success_rate_minimum_hosts |
||||
:ref:`success_rate_minimum_hosts |
||||
<config_cluster_manager_cluster_outlier_detection_success_rate_minimum_hosts>` |
||||
setting in outlier detection |
||||
|
||||
outlier_detection.success_rate_request_volume |
||||
:ref:`success_rate_request_volume |
||||
<config_cluster_manager_cluster_outlier_detection_success_rate_request_volume>` |
||||
setting in outlier detection |
||||
|
||||
outlier_detection.success_rate_stdev_factor |
||||
:ref:`success_rate_stdev_factor |
||||
<config_cluster_manager_cluster_outlier_detection_success_rate_stdev_factor>` |
||||
setting in outlier detection |
||||
|
||||
Core |
||||
---- |
||||
|
||||
upstream.healthy_panic_threshold |
||||
Sets the :ref:`panic threshold <arch_overview_load_balancing_panic_threshold>` percentage. |
||||
Defaults to 50%. |
||||
|
||||
upstream.use_http2 |
||||
Whether the cluster utilizes the *http2* :ref:`feature <config_cluster_manager_cluster_features>` |
||||
if configured. Set to 0 to disable HTTP/2 even if the feature is configured. Defaults to enabled. |
||||
|
||||
upstream.weight_enabled |
||||
Binary switch to turn on or off weighted load balancing. If set to non 0, weighted load balancing |
||||
is enabled. Defaults to enabled. |
||||
|
||||
.. _config_cluster_manager_cluster_runtime_ring_hash: |
||||
|
||||
Ring hash load balancing |
||||
------------------------ |
||||
|
||||
upstream.ring_hash.min_ring_size |
||||
The minimum size of the hash ring for the :ref:`ring hash load balancer |
||||
<arch_overview_load_balancing_types>`. The default is 1024. |
||||
|
||||
.. _config_cluster_manager_cluster_runtime_zone_routing: |
||||
|
||||
Zone aware load balancing |
||||
------------------------- |
||||
|
||||
upstream.zone_routing.enabled |
||||
% of requests that will be routed to the same upstream zone. Defaults to 100% of requests. |
||||
|
||||
upstream.zone_routing.min_cluster_size |
||||
Minimal size of the upstream cluster for which zone aware routing can be attempted. Default value |
||||
is 6. If the upstream cluster size is smaller than *min_cluster_size* zone aware routing will not |
||||
be performed. |
||||
|
||||
Circuit breaking |
||||
---------------- |
||||
|
||||
circuit_breakers.<cluster_name>.<priority>.max_connections |
||||
:ref:`Max connections circuit breaker setting <config_cluster_manager_cluster_circuit_breakers_max_connections>` |
||||
|
||||
circuit_breakers.<cluster_name>.<priority>.max_pending_requests |
||||
:ref:`Max pending requests circuit breaker setting <config_cluster_manager_cluster_circuit_breakers_max_pending_requests>` |
||||
|
||||
circuit_breakers.<cluster_name>.<priority>.max_requests |
||||
:ref:`Max requests circuit breaker setting <config_cluster_manager_cluster_circuit_breakers_max_requests>` |
||||
|
||||
circuit_breakers.<cluster_name>.<priority>.max_retries |
||||
:ref:`Max retries circuit breaker setting <config_cluster_manager_cluster_circuit_breakers_max_retries>` |
@ -0,0 +1,82 @@ |
||||
.. _config_cluster_manager_cluster_ssl: |
||||
|
||||
TLS context |
||||
=========== |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"alpn_protocols": "...", |
||||
"cert_chain_file": "...", |
||||
"private_key_file": "...", |
||||
"ca_cert_file": "...", |
||||
"verify_certificate_hash": "...", |
||||
"verify_subject_alt_name": [], |
||||
"cipher_suites": "...", |
||||
"ecdh_curves": "...", |
||||
"sni": "..." |
||||
} |
||||
|
||||
alpn_protocols |
||||
*(optional, string)* Supplies the list of ALPN protocols that connections should request. In |
||||
practice this is likely to be set to a single value or not set at all: |
||||
|
||||
* "h2" If upstream connections should use HTTP/2. In the current implementation this must be set |
||||
alongside the *http2* cluster :ref:`features <config_cluster_manager_cluster_features>` option. |
||||
The two options together will use ALPN to tell a server that expects ALPN that Envoy supports |
||||
HTTP/2. Then the *http2* feature will cause new connections to use HTTP/2. |
||||
|
||||
cert_chain_file |
||||
*(optional, string)* The certificate chain file that should be served by the connection. This is |
||||
used to provide a client side TLS certificate to an upstream host. |
||||
|
||||
private_key_file |
||||
*(optional, string)* The private key that corresponds to the certificate chain file. |
||||
|
||||
ca_cert_file |
||||
*(optional, string)* A file containing certificate authority certificates to use in verifying |
||||
a presented server certificate. |
||||
|
||||
verify_certificate_hash |
||||
*(optional, string)* If specified, Envoy will verify (pin) the hash of the presented server |
||||
certificate. |
||||
|
||||
verify_subject_alt_name |
||||
*(optional, array)* An optional list of subject alt names. If specified, Envoy will verify |
||||
that the server certificate's subject alt name matches one of the specified values. |
||||
|
||||
cipher_suites |
||||
*(optional, string)* If specified, the TLS connection will only support the specified `cipher list |
||||
<https://commondatastorage.googleapis.com/chromium-boringssl-docs/ssl.h.html#Cipher-suite-configuration>`_. |
||||
If not specified, the default list: |
||||
|
||||
.. code-block:: none |
||||
|
||||
[ECDHE-ECDSA-AES128-GCM-SHA256|ECDHE-ECDSA-CHACHA20-POLY1305] |
||||
[ECDHE-RSA-AES128-GCM-SHA256|ECDHE-RSA-CHACHA20-POLY1305] |
||||
ECDHE-ECDSA-AES128-SHA256 |
||||
ECDHE-RSA-AES128-SHA256 |
||||
ECDHE-ECDSA-AES128-SHA |
||||
ECDHE-RSA-AES128-SHA |
||||
AES128-GCM-SHA256 |
||||
AES128-SHA256 |
||||
AES128-SHA |
||||
ECDHE-ECDSA-AES256-GCM-SHA384 |
||||
ECDHE-RSA-AES256-GCM-SHA384 |
||||
ECDHE-ECDSA-AES256-SHA384 |
||||
ECDHE-RSA-AES256-SHA384 |
||||
ECDHE-ECDSA-AES256-SHA |
||||
ECDHE-RSA-AES256-SHA |
||||
AES256-GCM-SHA384 |
||||
AES256-SHA256 |
||||
AES256-SHA |
||||
|
||||
will be used. |
||||
|
||||
ecdh_curves |
||||
*(optional, string)* If specified, the TLS connection will only support the specified ECDH curves. |
||||
If not specified, the default curves (X25519, P-256) will be used. |
||||
|
||||
sni |
||||
*(optional, string)* If specified, the string will be presented as the SNI during the TLS |
||||
handshake. |
@ -0,0 +1,193 @@ |
||||
.. _config_cluster_manager_cluster_stats: |
||||
|
||||
Statistics |
||||
========== |
||||
|
||||
.. contents:: |
||||
:local: |
||||
|
||||
General |
||||
------- |
||||
|
||||
Every cluster has a statistics tree rooted at *cluster.<name>.* with the following statistics: |
||||
|
||||
.. csv-table:: |
||||
:header: Name, Type, Description |
||||
:widths: 1, 1, 2 |
||||
|
||||
upstream_cx_total, Counter, Total connections |
||||
upstream_cx_active, Gauge, Total active connections |
||||
upstream_cx_http1_total, Counter, Total HTTP/1.1 connections |
||||
upstream_cx_http2_total, Counter, Total HTTP/2 connections |
||||
upstream_cx_connect_fail, Counter, Total connection failures |
||||
upstream_cx_connect_timeout, Counter, Total connection timeouts |
||||
upstream_cx_overflow, Counter, Total times that the cluster's connection circuit breaker overflowed |
||||
upstream_cx_connect_ms, Histogram, Connection establishment milliseconds |
||||
upstream_cx_length_ms, Histogram, Connection length milliseconds |
||||
upstream_cx_destroy, Counter, Total destroyed connections |
||||
upstream_cx_destroy_local, Counter, Total connections destroyed locally |
||||
upstream_cx_destroy_remote, Counter, Total connections destroyed remotely |
||||
upstream_cx_destroy_with_active_rq, Counter, Total connections destroyed with 1+ active request |
||||
upstream_cx_destroy_local_with_active_rq, Counter, Total connections destroyed locally with 1+ active request |
||||
upstream_cx_destroy_remote_with_active_rq, Counter, Total connections destroyed remotely with 1+ active request |
||||
upstream_cx_close_notify, Counter, Total connections closed via HTTP/1.1 connection close header or HTTP/2 GOAWAY |
||||
upstream_cx_rx_bytes_total, Counter, Total received connection bytes |
||||
upstream_cx_rx_bytes_buffered, Gauge, Received connection bytes currently buffered |
||||
upstream_cx_tx_bytes_total, Counter, Total sent connection bytes |
||||
upstream_cx_tx_bytes_buffered, Gauge, Send connection bytes currently buffered |
||||
upstream_cx_protocol_error, Counter, Total connection protocol errors |
||||
upstream_cx_max_requests, Counter, Total connections closed due to maximum requests |
||||
upstream_cx_none_healthy, Counter, Total times connection not established due to no healthy hosts |
||||
upstream_rq_total, Counter, Total requests |
||||
upstream_rq_active, Gauge, Total active requests |
||||
upstream_rq_pending_total, Counter, Total requests pending a connection pool connection |
||||
upstream_rq_pending_overflow, Counter, Total requests that overflowed connection pool circuit breaking and were failed |
||||
upstream_rq_pending_failure_eject, Counter, Total requests that were failed due to a connection pool connection failure |
||||
upstream_rq_pending_active, Gauge, Total active requests pending a connection pool connection |
||||
upstream_rq_cancelled, Counter, Total requests cancelled before obtaining a connection pool connection |
||||
upstream_rq_maintenance_mode, Counter, Total requests that resulted in an immediate 503 due to :ref:`maintenance mode<config_http_filters_router_runtime_maintenance_mode>` |
||||
upstream_rq_timeout, Counter, Total requests that timed out waiting for a response |
||||
upstream_rq_per_try_timeout, Counter, Total requests that hit the per try timeout |
||||
upstream_rq_rx_reset, Counter, Total requests that were reset remotely |
||||
upstream_rq_tx_reset, Counter, Total requests that were reset locally |
||||
upstream_rq_retry, Counter, Total request retries |
||||
upstream_rq_retry_success, Counter, Total request retry successes |
||||
upstream_rq_retry_overflow, Counter, Total requests not retried due to circuit breaking |
||||
upstream_flow_control_paused_reading_total, Counter, Total number of times flow control paused reading from upstream. |
||||
upstream_flow_control_resumed_reading_total, Counter, Total number of times flow control resumed reading from upstream. |
||||
upstream_flow_control_backed_up_total, Counter, Total number of times the upstream connection backed up and paused reads from downstream. |
||||
upstream_flow_control_drained_total, Counter, Total number of times the upstream connection drained and resumed reads from downstream. |
||||
membership_change, Counter, Total cluster membership changes |
||||
membership_healthy, Gauge, Current cluster healthy total (inclusive of both health checking and outlier detection) |
||||
membership_total, Gauge, Current cluster membership total |
||||
retry_or_shadow_abandoned, Counter, Total number of times shadowing or retry buffering was canceled due to buffer limits. |
||||
config_reload, Counter, Total API fetches that resulted in a config reload due to a different config |
||||
update_attempt, Counter, Total cluster membership update attempts |
||||
update_success, Counter, Total cluster membership update successes |
||||
update_failure, Counter, Total cluster membership update failures |
||||
version, Gauge, Hash of the contents from the last successful API fetch |
||||
max_host_weight, Gauge, Maximum weight of any host in the cluster |
||||
bind_errors, Counter, Total errors binding the socket to the configured source address. |
||||
|
||||
Health check statistics |
||||
----------------------- |
||||
|
||||
If health check is configured, the cluster has an additional statistics tree rooted at |
||||
*cluster.<name>.health_check.* with the following statistics: |
||||
|
||||
.. csv-table:: |
||||
:header: Name, Type, Description |
||||
:widths: 1, 1, 2 |
||||
|
||||
attempt, Counter, Number of health checks |
||||
success, Counter, Number of successful health checks |
||||
failure, Counter, Number of immediately failed health checks (e.g. HTTP 503) as well as network failures |
||||
passive_failure, Counter, Number of health check failures due to passive events (e.g. x-envoy-immediate-health-check-fail) |
||||
network_failure, Counter, Number of health check failures due to network error |
||||
verify_cluster, Counter, Number of health checks that attempted cluster name verification |
||||
healthy, Gauge, Number of healthy members |
||||
|
||||
.. _config_cluster_manager_cluster_stats_outlier_detection: |
||||
|
||||
Outlier detection statistics |
||||
---------------------------- |
||||
|
||||
If :ref:`outlier detection <arch_overview_outlier_detection>` is configured for a cluster, |
||||
statistics will be rooted at *cluster.<name>.outlier_detection.* and contain the following: |
||||
|
||||
.. csv-table:: |
||||
:header: Name, Type, Description |
||||
:widths: 1, 1, 2 |
||||
|
||||
ejections_total, Counter, Number of ejections due to any outlier type |
||||
ejections_active, Gauge, Number of currently ejected hosts |
||||
ejections_overflow, Counter, Number of ejections aborted due to the max ejection % |
||||
ejections_consecutive_5xx, Counter, Number of consecutive 5xx ejections |
||||
|
||||
.. _config_cluster_manager_cluster_stats_dynamic_http: |
||||
|
||||
Dynamic HTTP statistics |
||||
----------------------- |
||||
|
||||
If HTTP is used, dynamic HTTP response code statistics are also available. These are emitted by |
||||
various internal systems as well as some filters such as the :ref:`router filter |
||||
<config_http_filters_router>` and :ref:`rate limit filter <config_http_filters_rate_limit>`. They |
||||
are rooted at *cluster.<name>.* and contain the following statistics: |
||||
|
||||
.. csv-table:: |
||||
:header: Name, Type, Description |
||||
:widths: 1, 1, 2 |
||||
|
||||
upstream_rq_<\*xx>, Counter, "Aggregate HTTP response codes (e.g., 2xx, 3xx, etc.)" |
||||
upstream_rq_<\*>, Counter, "Specific HTTP response codes (e.g., 201, 302, etc.)" |
||||
upstream_rq_time, Histogram, Request time milliseconds |
||||
canary.upstream_rq_<\*xx>, Counter, Upstream canary aggregate HTTP response codes |
||||
canary.upstream_rq_<\*>, Counter, Upstream canary specific HTTP response codes |
||||
canary.upstream_rq_time, Histogram, Upstream canary request time milliseconds |
||||
internal.upstream_rq_<\*xx>, Counter, Internal origin aggregate HTTP response codes |
||||
internal.upstream_rq_<\*>, Counter, Internal origin specific HTTP response codes |
||||
internal.upstream_rq_time, Histogram, Internal origin request time milliseconds |
||||
external.upstream_rq_<\*xx>, Counter, External origin aggregate HTTP response codes |
||||
external.upstream_rq_<\*>, Counter, External origin specific HTTP response codes |
||||
external.upstream_rq_time, Histogram, External origin request time milliseconds |
||||
|
||||
.. _config_cluster_manager_cluster_stats_alt_tree: |
||||
|
||||
Alternate tree dynamic HTTP statistics |
||||
-------------------------------------- |
||||
|
||||
If alternate tree statistics are configured, they will be present in the |
||||
*cluster.<name>.<alt name>.* namespace. The statistics produced are the same as documented in |
||||
the dynamic HTTP statistics section :ref:`above |
||||
<config_cluster_manager_cluster_stats_dynamic_http>`. |
||||
|
||||
.. _config_cluster_manager_cluster_per_az_stats: |
||||
|
||||
Per service zone dynamic HTTP statistics |
||||
---------------------------------------- |
||||
|
||||
If the service zone is available for the local service (via :option:`--service-zone`) |
||||
and the :ref:`upstream cluster <arch_overview_service_discovery_sds>`, |
||||
Envoy will track the following statistics in *cluster.<name>.zone.<from_zone>.<to_zone>.* namespace. |
||||
|
||||
.. csv-table:: |
||||
:header: Name, Type, Description |
||||
:widths: 1, 1, 2 |
||||
|
||||
upstream_rq_<\*xx>, Counter, "Aggregate HTTP response codes (e.g., 2xx, 3xx, etc.)" |
||||
upstream_rq_<\*>, Counter, "Specific HTTP response codes (e.g., 201, 302, etc.)" |
||||
upstream_rq_time, Histogram, Request time milliseconds |
||||
|
||||
Load balancer statistics |
||||
------------------------ |
||||
|
||||
Statistics for monitoring load balancer decisions. Stats are rooted at *cluster.<name>.* and contain |
||||
the following statistics: |
||||
|
||||
.. csv-table:: |
||||
:header: Name, Type, Description |
||||
:widths: 1, 1, 2 |
||||
|
||||
lb_healthy_panic, Counter, Total requests load balanced with the load balancer in panic mode |
||||
lb_zone_cluster_too_small, Counter, No zone aware routing because of small upstream cluster size |
||||
lb_zone_routing_all_directly, Counter, Sending all requests directly to the same zone |
||||
lb_zone_routing_sampled, Counter, Sending some requests to the same zone |
||||
lb_zone_routing_cross_zone, Counter, Zone aware routing mode but have to send cross zone |
||||
lb_local_cluster_not_ok, Counter, Local host set is not set or it is panic mode for local cluster |
||||
lb_zone_number_differs, Counter, Number of zones in local and upstream cluster different |
||||
|
||||
Load balancer subset statistics |
||||
------------------------------- |
||||
|
||||
Statistics for monitoring `load balancer subset <arch_overview_load_balancer_subsets>` |
||||
decisions. Stats are rooted at *cluster.<name>.* and contain the following statistics: |
||||
|
||||
.. csv-table:: |
||||
:header: Name, Type, Description |
||||
:widths: 1, 1, 2 |
||||
|
||||
lb_subsets_active, Gauge, Number of currently available subsets. |
||||
lb_subsets_created, Counter, Number of subsets created. |
||||
lb_subsets_removed, Counter, Number of subsets removed due to no hosts. |
||||
lb_subsets_selected, Counter, Number of times any subset was selected for load balancing. |
||||
lb_subsets_fallback, Counter, Number of times the fallback policy was invoked. |
@ -0,0 +1,15 @@ |
||||
.. _config_cluster_manager_outlier_detection: |
||||
|
||||
Outlier detection |
||||
================= |
||||
|
||||
Outlier detection :ref:`architecture overview <arch_overview_outlier_detection>`. |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"event_log_path": "..." |
||||
} |
||||
|
||||
event_log_path |
||||
*(optional, string)* Specifies the path to the outlier event log. |
@ -0,0 +1,24 @@ |
||||
.. _config_cluster_manager_sds: |
||||
|
||||
Service discovery service |
||||
========================= |
||||
|
||||
Service discovery service :ref:`architecture overview <arch_overview_service_discovery_sds>`. |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"cluster": "{...}", |
||||
"refresh_delay_ms": "{...}" |
||||
} |
||||
|
||||
:ref:`cluster <config_cluster_manager_cluster>` |
||||
*(required, object)* A standard definition of an upstream cluster that hosts the service |
||||
discovery service. The cluster must run a REST service that implements the :ref:`SDS HTTP API |
||||
<config_cluster_manager_sds_api>`. |
||||
|
||||
refresh_delay_ms |
||||
*(required, integer)* The delay, in milliseconds, between fetches to the SDS API for each |
||||
configured SDS cluster. Envoy will add an additional random jitter to the delay that is between |
||||
zero and *refresh_delay_ms* milliseconds. Thus the longest possible refresh delay is |
||||
2 \* *refresh_delay_ms*. |
@ -0,0 +1,60 @@ |
||||
.. _config_cluster_manager_sds_api: |
||||
|
||||
Service discovery service REST API |
||||
================================== |
||||
|
||||
Envoy expects the service discovery service to expose the following API (See Lyft's |
||||
`reference implementation <https://github.com/lyft/discovery>`_): |
||||
|
||||
.. http:get:: /v1/registration/(string: service_name) |
||||
|
||||
Asks the discovery service to return all hosts for a particular `service_name`. `service_name` |
||||
corresponds to the :ref:`service_name <config_cluster_manager_cluster_service_name>` cluster |
||||
parameter. Responses use the following JSON schema: |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"hosts": [] |
||||
} |
||||
|
||||
hosts |
||||
*(Required, array)* A list of :ref:`hosts <config_cluster_manager_sds_api_host>` that make up |
||||
the service. |
||||
|
||||
.. _config_cluster_manager_sds_api_host: |
||||
|
||||
Host JSON |
||||
--------- |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"ip_address": "...", |
||||
"port": "...", |
||||
"tags": { |
||||
"az": "...", |
||||
"canary": "...", |
||||
"load_balancing_weight": "..." |
||||
} |
||||
} |
||||
|
||||
ip_address |
||||
*(required, string)* The IP address of the upstream host. |
||||
|
||||
port |
||||
*(required, integer)* The port of the upstream host. |
||||
|
||||
.. _config_cluster_manager_sds_api_host_az: |
||||
|
||||
az |
||||
*(optional, string)* The optional zone of the upstream host. Envoy uses the zone for various |
||||
statistics and load balancing tasks documented elsewhere. |
||||
|
||||
canary |
||||
*(optional, boolean)* The optional canary status of the upstream host. Envoy uses the canary |
||||
status for various statistics and load balancing tasks documented elsewhere. |
||||
|
||||
load_balancing_weight |
||||
*(optional, integer)* The optional load balancing weight of the upstream host, in the range |
||||
1 - 100. Envoy uses the load balancing weight in some of the built in load balancers. |
@ -0,0 +1,17 @@ |
||||
.. _config: |
||||
|
||||
Configuration reference |
||||
======================= |
||||
|
||||
.. toctree:: |
||||
:maxdepth: 2 |
||||
:includehidden: |
||||
|
||||
overview/overview |
||||
listeners/listeners |
||||
network_filters/network_filters |
||||
http_conn_man/http_conn_man |
||||
http_filters/http_filters |
||||
cluster_manager/cluster_manager |
||||
access_log |
||||
tools/router_check |
@ -0,0 +1,21 @@ |
||||
.. _config_http_conn_man_filters: |
||||
|
||||
Filters |
||||
======= |
||||
|
||||
HTTP filter :ref:`architecture overview <arch_overview_http_filters>`. |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"name": "...", |
||||
"config": "{...}" |
||||
} |
||||
|
||||
name |
||||
*(required, string)* The name of the filter to instantiate. The name must match a :ref:`supported |
||||
filter <config_http_filters>`. |
||||
|
||||
config |
||||
*(required, object)* Filter specific configuration which depends on the filter being |
||||
instantiated. See the :ref:`supported filters <config_http_filters>` for further documentation. |
@ -0,0 +1,35 @@ |
||||
.. _config_http_conn_man_header_sanitizing: |
||||
|
||||
HTTP header sanitizing |
||||
====================== |
||||
|
||||
For security reasons, Envoy will "sanitize" various incoming HTTP headers depending on whether the |
||||
request is an internal or external request. The sanitizing action depends on the header and may |
||||
result in addition, removal, or modification. Ultimately, whether the request is considered internal |
||||
or external is governed by the :ref:`x-forwarded-for <config_http_conn_man_headers_x-forwarded-for>` |
||||
header (please read the linked section carefully as how Envoy populates the header is complex and |
||||
depends on the :ref:`use_remote_address <config_http_conn_man_use_remote_address>` setting). |
||||
|
||||
Envoy will potentially sanitize the following headers: |
||||
|
||||
* :ref:`x-envoy-decorator-operation <config_http_filters_router_x-envoy-decorator-operation>` |
||||
* :ref:`x-envoy-downstream-service-cluster |
||||
<config_http_conn_man_headers_downstream-service-cluster>` |
||||
* :ref:`x-envoy-downstream-service-node <config_http_conn_man_headers_downstream-service-node>` |
||||
* :ref:`x-envoy-expected-rq-timeout-ms <config_http_filters_router_x-envoy-expected-rq-timeout-ms>` |
||||
* :ref:`x-envoy-external-address <config_http_conn_man_headers_x-envoy-external-address>` |
||||
* :ref:`x-envoy-force-trace <config_http_conn_man_headers_x-envoy-force-trace>` |
||||
* :ref:`x-envoy-internal <config_http_conn_man_headers_x-envoy-internal>` |
||||
* :ref:`x-envoy-max-retries <config_http_filters_router_x-envoy-max-retries>` |
||||
* :ref:`x-envoy-retry-grpc-on <config_http_filters_router_x-envoy-retry-grpc-on>` |
||||
* :ref:`x-envoy-retry-on <config_http_filters_router_x-envoy-retry-on>` |
||||
* :ref:`x-envoy-upstream-alt-stat-name <config_http_filters_router_x-envoy-upstream-alt-stat-name>` |
||||
* :ref:`x-envoy-upstream-rq-per-try-timeout-ms |
||||
<config_http_filters_router_x-envoy-upstream-rq-per-try-timeout-ms>` |
||||
* :ref:`x-envoy-upstream-rq-timeout-alt-response |
||||
<config_http_filters_router_x-envoy-upstream-rq-timeout-alt-response>` |
||||
* :ref:`x-envoy-upstream-rq-timeout-ms <config_http_filters_router_x-envoy-upstream-rq-timeout-ms>` |
||||
* :ref:`x-forwarded-client-cert <config_http_conn_man_headers_x-forwarded-client-cert>` |
||||
* :ref:`x-forwarded-for <config_http_conn_man_headers_x-forwarded-for>` |
||||
* :ref:`x-forwarded-proto <config_http_conn_man_headers_x-forwarded-proto>` |
||||
* :ref:`x-request-id <config_http_conn_man_headers_x-request-id>` |
@ -0,0 +1,276 @@ |
||||
.. _config_http_conn_man_headers: |
||||
|
||||
HTTP header manipulation |
||||
======================== |
||||
|
||||
The HTTP connection manager manipulates several HTTP headers both during decoding (when the request |
||||
is being received) as well as during encoding (when the response is being sent). |
||||
|
||||
.. contents:: |
||||
:local: |
||||
|
||||
.. _config_http_conn_man_headers_user-agent: |
||||
|
||||
user-agent |
||||
---------- |
||||
|
||||
The *user-agent* header may be set by the connection manager during decoding if the |
||||
:ref:`add_user_agent <config_http_conn_man_add_user_agent>` option is enabled. The header is only |
||||
modified if it is not already set. If the connection manager does set the header, the value is |
||||
determined by the :option:`--service-cluster` command line option. |
||||
|
||||
.. _config_http_conn_man_headers_server: |
||||
|
||||
server |
||||
------ |
||||
|
||||
The *server* header will be set during encoding to the value in the :ref:`server_name |
||||
<config_http_conn_man_server_name>` option. |
||||
|
||||
.. _config_http_conn_man_headers_x-client-trace-id: |
||||
|
||||
x-client-trace-id |
||||
----------------- |
||||
|
||||
If an external client sets this header, Envoy will join the provided trace ID with the internally |
||||
generated :ref:`config_http_conn_man_headers_x-request-id`. x-client-trace-id needs to be globally |
||||
unique and generating a uuid4 is recommended. If this header is set, it has similar effect to |
||||
:ref:`config_http_conn_man_headers_x-envoy-force-trace`. See the :ref:`tracing.client_enabled |
||||
<config_http_conn_man_runtime_client_enabled>` runtime configuration setting. |
||||
|
||||
.. _config_http_conn_man_headers_downstream-service-cluster: |
||||
|
||||
x-envoy-downstream-service-cluster |
||||
---------------------------------- |
||||
|
||||
Internal services often want to know which service is calling them. This header is cleaned from |
||||
external requests, but for internal requests will contain the service cluster of the caller. Note |
||||
that in the current implementation, this should be considered a hint as it is set by the caller and |
||||
could be easily spoofed by any internal entity. In the future Envoy will support a mutual |
||||
authentication TLS mesh which will make this header fully secure. Like *user-agent*, the value |
||||
is determined by the :option:`--service-cluster` command line option. In order to enable this |
||||
feature you need to set the :ref:`user_agent <config_http_conn_man_add_user_agent>` option to true. |
||||
|
||||
.. _config_http_conn_man_headers_downstream-service-node: |
||||
|
||||
x-envoy-downstream-service-node |
||||
------------------------------- |
||||
|
||||
Internal services may want to know the downstream node request comes from. This header |
||||
is quite similar to :ref:`config_http_conn_man_headers_downstream-service-cluster`, except the value is taken from |
||||
the :option:`--service-node` option. |
||||
|
||||
.. _config_http_conn_man_headers_x-envoy-external-address: |
||||
|
||||
x-envoy-external-address |
||||
------------------------ |
||||
|
||||
It is a common case where a service wants to perform analytics based on the client IP address. Per |
||||
the lengthy discussion on :ref:`XFF <config_http_conn_man_headers_x-forwarded-for>`, this can get |
||||
quite complicated. A proper implementation involves forwarding XFF, and then choosing the first non |
||||
RFC1918 address *from the right*. Since this is such a common occurrence, Envoy simplifies this by |
||||
setting *x-envoy-external-address* during decoding if and only if the request ingresses externally |
||||
(i.e., it's from an external client). *x-envoy-external-address* is not set or overwritten for |
||||
internal requests. This header can be safely forwarded between internal services for analytics |
||||
purposes without having to deal with the complexities of XFF. |
||||
|
||||
.. _config_http_conn_man_headers_x-envoy-force-trace: |
||||
|
||||
x-envoy-force-trace |
||||
------------------- |
||||
|
||||
If an internal request sets this header, Envoy will modify the generated |
||||
:ref:`config_http_conn_man_headers_x-request-id` such that it forces traces to be collected. |
||||
This also forces :ref:`config_http_conn_man_headers_x-request-id` to be returned in the response |
||||
headers. If this request ID is then propagated to other hosts, traces will also be collected on |
||||
those hosts which will provide a consistent trace for an entire request flow. See the |
||||
:ref:`tracing.global_enabled <config_http_conn_man_runtime_global_enabled>` and |
||||
:ref:`tracing.random_sampling <config_http_conn_man_runtime_random_sampling>` runtime |
||||
configuration settings. |
||||
|
||||
.. _config_http_conn_man_headers_x-envoy-internal: |
||||
|
||||
x-envoy-internal |
||||
---------------- |
||||
|
||||
It is a common case where a service wants to know whether a request is internal origin or not. Envoy |
||||
uses :ref:`XFF <config_http_conn_man_headers_x-forwarded-for>` to determine this and then will set |
||||
the header value to *true*. |
||||
|
||||
This is a convenience to avoid having to parse and understand XFF. |
||||
|
||||
.. _config_http_conn_man_headers_x-forwarded-client-cert: |
||||
|
||||
x-forwarded-client-cert |
||||
----------------------- |
||||
|
||||
*x-forwarded-clinet-cert* (XFCC) is a proxy header which indicates certificate information of part |
||||
or all of the clients or proxies that a request has flowed through, on its way from the client to the |
||||
server. A proxy may choose to sanitize/append/forward the XFCC header before proxying the request. |
||||
|
||||
The XFCC header value is a comma (",") separated string. Each substring is an XFCC element, which |
||||
holds information added by a single proxy. A proxy can append the current client certificate |
||||
information as an XFCC element, to the end of the request's XFCC header after a comma. |
||||
|
||||
Each XFCC element is a semicolon ";" separated string. Each substring is a key-value pair, grouped |
||||
together by an equals ("=") sign. The keys are case-insensitive, the values are case-sensitive. If |
||||
",", ";" or "=" appear in a value, the value should be double-quoted. Double-quotes in the value |
||||
should be replaced by backslash-double-quote (\"). |
||||
|
||||
The following keys are supported: |
||||
|
||||
1. ``By`` The Subject Alternative Name (SAN) of the current proxy's certificate. |
||||
2. ``Hash`` The SHA 256 diguest of the current client certificate. |
||||
3. ``SAN`` The SAN field (URI type) of the current client certificate. |
||||
4. ``Subject`` The Subject field of the current client certificate. The value is always double-quoted. |
||||
|
||||
Some examples of the XFCC header are: |
||||
|
||||
1. ``x-forwarded-client-cert: By=http://frontend.lyft.com;Hash=468ed33be74eee6556d90c0149c1309e9ba61d6425303443c0748a02dd8de688;Subject="/C=US/ST=CA/L=San Francisco/OU=Lyft/CN=Test Client";SAN=http://testclient.lyft.com`` |
||||
2. ``x-forwarded-client-cert: By=http://frontend.lyft.com;Hash=468ed33be74eee6556d90c0149c1309e9ba61d6425303443c0748a02dd8de688;SAN=http://testclient.lyft.com,By=http://backend.lyft.com;Hash=9ba61d6425303443c0748a02dd8de688468ed33be74eee6556d90c0149c1309e;SAN=http://frontend.lyft.com`` |
||||
|
||||
How Envoy processes XFCC is specified by the |
||||
:ref:`forward_client_cert<config_http_conn_man_forward_client_cert>` and the |
||||
:ref:`set_current_client_cert_details<config_http_conn_man_set_current_client_cert_details>` HTTP |
||||
connection manager options. If *forward_client_cert* is unset, the XFCC header will be sanitized by |
||||
default. |
||||
|
||||
.. _config_http_conn_man_headers_x-forwarded-for: |
||||
|
||||
x-forwarded-for |
||||
--------------- |
||||
|
||||
*x-forwarded-for* (XFF) is a standard proxy header which indicates the IP addresses that a request has |
||||
flowed through on its way from the client to the server. A compliant proxy will *append* the IP |
||||
address of the nearest client to the XFF list before proxying the request. Some examples of XFF are: |
||||
|
||||
1. ``x-forwarded-for: 50.0.0.1`` (single client) |
||||
2. ``x-forwarded-for: 50.0.0.1, 40.0.0.1`` (external proxy hop) |
||||
3. ``x-forwarded-for: 50.0.0.1, 10.0.0.1`` (internal proxy hop) |
||||
|
||||
Envoy will only append to XFF if the :ref:`use_remote_address |
||||
<config_http_conn_man_use_remote_address>` HTTP connection manager option is set to true. This means |
||||
that if *use_remote_address* is false, the connection manager operates in a transparent mode where |
||||
it does not modify XFF. This is needed for certain types of mesh deployments depending on whether |
||||
the Envoy in question is an edge node or an internal service node. |
||||
|
||||
Envoy uses the final XFF contents to determine whether a request originated externally or |
||||
internally. This influences whether the :ref:`config_http_conn_man_headers_x-envoy-internal` header |
||||
is set. |
||||
|
||||
A few very important notes about XFF: |
||||
|
||||
1. Since IP addresses are appended to XFF, only the last address (furthest to the right) can be |
||||
trusted. More specifically, the first external (non RFC1918) address from *the right* is the only |
||||
trustable addresses. Anything to the left of that can be spoofed. To make this easier to deal |
||||
with for analytics, etc., front Envoy will also set the |
||||
:ref:`config_http_conn_man_headers_x-envoy-external-address` header. |
||||
2. XFF is what Envoy uses to determine whether a request is internal origin or external origin. It |
||||
does this by checking to see if XFF contains a *single* IP address which is an RFC1918 address. |
||||
|
||||
* **NOTE**: If an internal service proxies an external request to another internal service, and |
||||
includes the original XFF header, Envoy will append to it on egress if |
||||
:ref:`use_remote_address <config_http_conn_man_use_remote_address>` is set. This will cause |
||||
the other side to think the request is external. Generally, this is what is intended if XFF is |
||||
being forwarded. If it is not intended, do not forward XFF, and forward |
||||
:ref:`config_http_conn_man_headers_x-envoy-internal` instead. |
||||
* **NOTE**: If an internal service call is forwarded to another internal service (preserving XFF), |
||||
Envoy will not consider it internal. This is a known "bug" due to the simplification of how |
||||
XFF is parsed to determine if a request is internal. In this scenario, do not forward XFF and |
||||
allow Envoy to generate a new one with a single internal origin IP. |
||||
|
||||
.. _config_http_conn_man_headers_x-forwarded-proto: |
||||
|
||||
x-forwarded-proto |
||||
----------------- |
||||
|
||||
It is a common case where a service wants to know what the originating protocol (HTTP or HTTPS) was |
||||
of the connection terminated by front/edge Envoy. *x-forwarded-proto* contains this information. It |
||||
will be set to either *http* or *https*. |
||||
|
||||
.. _config_http_conn_man_headers_x-request-id: |
||||
|
||||
x-request-id |
||||
------------ |
||||
|
||||
The *x-request-id* header is used by Envoy to uniquely identify a request as well as perform stable |
||||
access logging and tracing. Envoy will generate an *x-request-id* header for all external origin |
||||
requests (the header is sanitized). It will also generate an *x-request-id* header for internal |
||||
requests that do not already have one. This means that *x-request-id* can and should be propagated |
||||
between client applications in order to have stable IDs across the entire mesh. Due to the out of |
||||
process architecture of Envoy, the header can not be automatically forwarded by Envoy itself. This |
||||
is one of the few areas where a thin client library is needed to perform this duty. How that is done |
||||
is out of scope for this documentation. If *x-request-id* is propagated across all hosts, the |
||||
following features are available: |
||||
|
||||
* Stable :ref:`access logging <config_access_log>` via the |
||||
:ref:`runtime filter<config_http_con_manager_access_log_filters_runtime>`. |
||||
* Stable tracing when performing random sampling via the :ref:`tracing.random_sampling |
||||
<config_http_conn_man_runtime_random_sampling>` runtime setting or via forced tracing using the |
||||
:ref:`config_http_conn_man_headers_x-envoy-force-trace` and |
||||
:ref:`config_http_conn_man_headers_x-client-trace-id` headers. |
||||
|
||||
.. _config_http_conn_man_headers_x-ot-span-context: |
||||
|
||||
x-ot-span-context |
||||
----------------- |
||||
|
||||
The *x-ot-span-context* HTTP header is used by Envoy to establish proper parent-child relationships |
||||
between tracing spans. This header can be used with both LightStep and Zipkin tracers. |
||||
For example, an egress span is a child of an ingress |
||||
span (if the ingress span was present). Envoy injects the *x-ot-span-context* header on ingress requests and |
||||
forwards it to the local service. Envoy relies on the application to propagate *x-ot-span-context* on |
||||
the egress call to an upstream. See more on tracing :ref:`here <arch_overview_tracing>`. |
||||
|
||||
.. _config_http_conn_man_headers_x-b3-traceid: |
||||
|
||||
x-b3-traceid |
||||
------------ |
||||
|
||||
The *x-b3-traceid* HTTP header is used by the Zipkin tracer in Envoy. |
||||
The TraceId is 64-bit in length and indicates the overall ID of the |
||||
trace. Every span in a trace shares this ID. See more on zipkin tracing |
||||
`here <https://github.com/openzipkin/b3-propagation>`. |
||||
|
||||
.. _config_http_conn_man_headers_x-b3-spanid: |
||||
|
||||
x-b3-spanid |
||||
----------- |
||||
|
||||
The *x-b3-spanid* HTTP header is used by the Zipkin tracer in Envoy. |
||||
The SpanId is 64-bit in length and indicates the position of the current |
||||
operation in the trace tree. The value should not be interpreted: it may or |
||||
may not be derived from the value of the TraceId. See more on zipkin tracing |
||||
`here <https://github.com/openzipkin/b3-propagation>`. |
||||
|
||||
.. _config_http_conn_man_headers_x-b3-parentspanid: |
||||
|
||||
x-b3-parentspanid |
||||
----------------- |
||||
|
||||
The *x-b3-parentspanid* HTTP header is used by the Zipkin tracer in Envoy. |
||||
The ParentSpanId is 64-bit in length and indicates the position of the |
||||
parent operation in the trace tree. When the span is the root of the trace |
||||
tree, the ParentSpanId is absent. See more on zipkin tracing |
||||
`here <https://github.com/openzipkin/b3-propagation>`. |
||||
|
||||
.. _config_http_conn_man_headers_x-b3-sampled: |
||||
|
||||
x-b3-sampled |
||||
------------ |
||||
|
||||
The *x-b3-sampled* HTTP header is used by the Zipkin tracer in Envoy. |
||||
When the Sampled flag is 1, the soan will be reported to the tracing |
||||
system. Once Sampled is set to 0 or 1, the same |
||||
value should be consistently sent downstream. See more on zipkin tracing |
||||
`here <https://github.com/openzipkin/b3-propagation>`. |
||||
|
||||
.. _config_http_conn_man_headers_x-b3-flags: |
||||
|
||||
x-b3-flags |
||||
---------- |
||||
|
||||
The *x-b3-flags* HTTP header is used by the Zipkin tracer in Envoy. |
||||
The encode one or more options. For example, Debug is encoded as |
||||
``X-B3-Flags: 1``. See more on zipkin tracing |
||||
`here <https://github.com/openzipkin/b3-propagation>`. |
@ -0,0 +1,226 @@ |
||||
.. _config_http_conn_man: |
||||
|
||||
HTTP connection manager |
||||
======================= |
||||
|
||||
* HTTP connection manager :ref:`architecture overview <arch_overview_http_conn_man>`. |
||||
* HTTP protocols :ref:`architecture overview <arch_overview_http_protocols>`. |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"name": "http_connection_manager", |
||||
"config": { |
||||
"codec_type": "...", |
||||
"stat_prefix": "...", |
||||
"rds": "{...}", |
||||
"route_config": "{...}", |
||||
"filters": [], |
||||
"add_user_agent": "...", |
||||
"tracing": "{...}", |
||||
"http1_settings": "{...}", |
||||
"http2_settings": "{...}", |
||||
"server_name": "...", |
||||
"idle_timeout_s": "...", |
||||
"drain_timeout_ms": "...", |
||||
"access_log": [], |
||||
"use_remote_address": "...", |
||||
"forward_client_cert": "...", |
||||
"set_current_client_cert": "...", |
||||
"generate_request_id": "..." |
||||
} |
||||
} |
||||
|
||||
.. _config_http_conn_man_codec_type: |
||||
|
||||
codec_type |
||||
*(required, string)* Supplies the type of codec that the connection manager should use. Possible |
||||
values are: |
||||
|
||||
http1 |
||||
The connection manager will assume that the client is speaking HTTP/1.1. |
||||
|
||||
http2 |
||||
The connection manager will assume that the client is speaking HTTP/2 (Envoy does not require |
||||
HTTP/2 to take place over TLS or to use ALPN. Prior knowledge is allowed). |
||||
|
||||
auto |
||||
For every new connection, the connection manager will determine which codec to use. This mode |
||||
supports both ALPN for TLS listeners as well as protocol inference for plaintext listeners. |
||||
If ALPN data is available, it is preferred, otherwise protocol inference is used. In almost |
||||
all cases, this is the right option to choose for this setting. |
||||
|
||||
.. _config_http_conn_man_stat_prefix: |
||||
|
||||
stat_prefix |
||||
*(required, string)* The human readable prefix to use when emitting statistics for the |
||||
connection manager. See the :ref:`statistics <config_http_conn_man_stats>` documentation |
||||
for more information. |
||||
|
||||
.. _config_http_conn_man_rds_option: |
||||
|
||||
:ref:`rds <config_http_conn_man_rds>` |
||||
*(sometimes required, object)* The connection manager configuration must specify one of *rds* or |
||||
*route_config*. If *rds* is specified, the connection manager's route table will be dynamically |
||||
loaded via the RDS API. See the :ref:`documentation <config_http_conn_man_rds>` for more |
||||
information. |
||||
|
||||
.. _config_http_conn_man_route_config: |
||||
|
||||
:ref:`route_config <config_http_conn_man_route_table>` |
||||
*(sometimes required, object)* The connection manager configuration must specify one of *rds* or |
||||
*route_config*. If *route_config* is specified, the :ref:`route table <arch_overview_http_routing>` |
||||
for the connection manager is static and is specified in this property. |
||||
|
||||
:ref:`filters <config_http_conn_man_filters>` |
||||
*(required, array)* A list of individual :ref:`HTTP filters <arch_overview_http_filters>` that |
||||
make up the filter chain for requests made to the connection manager. Order matters as the filters |
||||
are processed sequentially as request events happen. |
||||
|
||||
.. _config_http_conn_man_add_user_agent: |
||||
|
||||
add_user_agent |
||||
*(optional, boolean)* Whether the connection manager manipulates the |
||||
:ref:`config_http_conn_man_headers_user-agent` and |
||||
:ref:`config_http_conn_man_headers_downstream-service-cluster` headers. See the linked |
||||
documentation for more information. Defaults to false. |
||||
|
||||
:ref:`tracing <config_http_conn_man_tracing>` |
||||
*(optional, object)* Presence of the object defines whether the connection manager |
||||
emits :ref:`tracing <arch_overview_tracing>` data to the :ref:`configured tracing provider <config_tracing>`. |
||||
|
||||
.. _config_http_conn_man_http1_settings: |
||||
|
||||
http1_settings |
||||
*(optional, object)* Additional HTTP/1 settings that are passed to the HTTP/1 codec. |
||||
|
||||
allow_absolute_url |
||||
*(optional, boolean)* Handle http requests with absolute urls in the requests. These requests |
||||
are generally sent by clients to forward/explicit proxies. This allows clients to configure |
||||
envoy as their http proxy. In Unix, for example, this is typically done by setting the |
||||
http_proxy environment variable. |
||||
|
||||
.. _config_http_conn_man_http2_settings: |
||||
|
||||
http2_settings |
||||
*(optional, object)* Additional HTTP/2 settings that are passed directly to the HTTP/2 codec. |
||||
Currently supported settings are: |
||||
|
||||
hpack_table_size |
||||
*(optional, integer)* `Maximum table size <http://httpwg.org/specs/rfc7541.html#rfc.section.4.2>`_ |
||||
(in octets) that the encoder is permitted to use for |
||||
the dynamic HPACK table. Valid values range from 0 to 4294967295 (2^32 - 1) and defaults to 4096. |
||||
0 effectively disables header compression. |
||||
|
||||
max_concurrent_streams |
||||
*(optional, integer)* `Maximum concurrent streams |
||||
<http://httpwg.org/specs/rfc7540.html#rfc.section.5.1.2>`_ |
||||
allowed for peer on one HTTP/2 connection. |
||||
Valid values range from 1 to 2147483647 (2^31 - 1) and defaults to 2147483647. |
||||
|
||||
.. _config_http_conn_man_http2_settings_initial_stream_window_size: |
||||
|
||||
initial_stream_window_size |
||||
*(optional, integer)* `Initial stream-level flow-control window |
||||
<http://httpwg.org/specs/rfc7540.html#rfc.section.6.9.2>`_ size. Valid values range from 65535 |
||||
(2^16 - 1, HTTP/2 default) to 2147483647 (2^31 - 1, HTTP/2 maximum) and defaults to 268435456 |
||||
(256 * 1024 * 1024). |
||||
|
||||
NOTE: 65535 is the initial window size from HTTP/2 spec. We only support increasing the default window |
||||
size now, so it's also the minimum. |
||||
|
||||
This field also acts as a soft limit on the number of bytes Envoy will buffer per-stream in the |
||||
HTTP/2 codec buffers. Once the buffer reaches this pointer, watermark callbacks will fire to |
||||
stop the flow of data to the codec buffers. |
||||
|
||||
initial_connection_window_size |
||||
*(optional, integer)* Similar to :ref:`initial_stream_window_size |
||||
<config_http_conn_man_http2_settings_initial_stream_window_size>`, but for connection-level flow-control |
||||
window. Currently , this has the same minimum/maximum/default as :ref:`initial_stream_window_size |
||||
<config_http_conn_man_http2_settings_initial_stream_window_size>`. |
||||
|
||||
These are the same options available in the upstream cluster :ref:`http2_settings |
||||
<config_cluster_manager_cluster_http2_settings>` option. |
||||
|
||||
.. _config_http_conn_man_server_name: |
||||
|
||||
server_name |
||||
*(optional, string)* An optional override that the connection manager will write to the |
||||
:ref:`config_http_conn_man_headers_server` header in responses. If not set, the default is |
||||
*envoy*. |
||||
|
||||
idle_timeout_s |
||||
*(optional, integer)* The idle timeout in seconds for connections managed by the connection |
||||
manager. The idle timeout is defined as the period in which there are no active requests. If not |
||||
set, there is no idle timeout. When the idle timeout is reached the connection will be closed. If |
||||
the connection is an HTTP/2 connection a drain sequence will occur prior to closing the |
||||
connection. See :ref:`drain_timeout_ms <config_http_conn_man_drain_timeout_ms>`. |
||||
|
||||
.. _config_http_conn_man_drain_timeout_ms: |
||||
|
||||
drain_timeout_ms |
||||
*(optional, integer)* The time in milliseconds that Envoy will wait between sending an HTTP/2 |
||||
"shutdown notification" (GOAWAY frame with max stream ID) and a final GOAWAY frame. This is used |
||||
so that Envoy provides a grace period for new streams that race with the final GOAWAY frame. |
||||
During this grace period, Envoy will continue to accept new streams. After the grace period, a |
||||
final GOAWAY frame is sent and Envoy will start refusing new streams. Draining occurs both |
||||
when a connection hits the idle timeout or during general server draining. The default grace |
||||
period is 5000 milliseconds (5 seconds) if this option is not specified. |
||||
|
||||
:ref:`access_log <config_access_log>` |
||||
*(optional, array)* Configuration for :ref:`HTTP access logs <arch_overview_access_logs>` |
||||
emitted by the connection manager. |
||||
|
||||
.. _config_http_conn_man_use_remote_address: |
||||
|
||||
use_remote_address |
||||
*(optional, boolean)* If set to true, the connection manager will use the real remote address |
||||
of the client connection when determining internal versus external origin and manipulating |
||||
various headers. If set to false or absent, the connection manager will use the |
||||
:ref:`config_http_conn_man_headers_x-forwarded-for` HTTP header. See the documentation for |
||||
:ref:`config_http_conn_man_headers_x-forwarded-for`, |
||||
:ref:`config_http_conn_man_headers_x-envoy-internal`, and |
||||
:ref:`config_http_conn_man_headers_x-envoy-external-address` for more information. |
||||
|
||||
.. _config_http_conn_man_forward_client_cert: |
||||
|
||||
forward_client_cert |
||||
*(optional, string)* How to handle the |
||||
:ref:`config_http_conn_man_headers_x-forwarded-client-cert` (XFCC) HTTP header. |
||||
Possible values are: |
||||
|
||||
1. **sanitize**: Do not send the XFCC header to the next hop. This is the default value. |
||||
2. **forward_only**: When the client connection is mTLS (Mutual TLS), forward the XFCC header in the request. |
||||
3. **always_forward_only**: Always forward the XFCC header in the request, regardless of whether the client connection is mTLS. |
||||
4. **append_forward**: When the client connection is mTLS, append the client certificate information to the request's XFCC header and forward it. |
||||
5. **sanitize_set**: When the client connection is mTLS, reset the XFCC header with the client certificate information and send it to the next hop. |
||||
|
||||
For the format of the XFCC header, please refer to |
||||
:ref:`config_http_conn_man_headers_x-forwarded-client-cert`. |
||||
|
||||
.. _config_http_conn_man_set_current_client_cert_details: |
||||
|
||||
set_current_client_cert_details |
||||
*(optional, array)* A list of strings, possible values are *Subject* and *SAN*. This field is |
||||
valid only when *forward_client_cert* is *append_forward* or *sanitize_set* and the client |
||||
connection is mTLS. It specifies the fields in the client certificate to be forwarded. Note that |
||||
in the :ref:`config_http_conn_man_headers_x-forwarded-client-cert` header, `Hash` is always set, |
||||
and `By` is always set when the client certificate presents the SAN value. |
||||
|
||||
generate_request_id |
||||
*(optional, boolean)* Whether the connection manager will generate the |
||||
:ref:`config_http_conn_man_headers_x-request-id` header if it does not exist. This defaults to |
||||
*true*. Generating a random UUID4 is expensive so in high throughput scenarios where this |
||||
feature is not desired it can be disabled. |
||||
|
||||
.. toctree:: |
||||
:hidden: |
||||
|
||||
route_config/route_config |
||||
filters |
||||
tracing |
||||
headers |
||||
header_sanitizing |
||||
stats |
||||
runtime |
||||
rds |
@ -0,0 +1,86 @@ |
||||
.. _config_http_conn_man_rds: |
||||
|
||||
Route discovery service |
||||
======================= |
||||
|
||||
The route discovery service (RDS) API is an optional API that Envoy will call to dynamically fetch |
||||
:ref:`route configurations <config_http_conn_man_route_table>`. A route configuration includes both |
||||
HTTP header modifications, virtual hosts, and the individual route entries contained within each |
||||
virtual host. Each :ref:`HTTP connection manager filter <config_http_conn_man>` can independently |
||||
fetch its own route configuration via the API. |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"cluster": "...", |
||||
"route_config_name": "...", |
||||
"refresh_delay_ms": "..." |
||||
} |
||||
|
||||
cluster |
||||
*(required, string)* The name of an upstream :ref:`cluster <config_cluster_manager_cluster>` that |
||||
hosts the route discovery service. The cluster must run a REST service that implements the |
||||
:ref:`RDS HTTP API <config_http_conn_man_rds_api>`. NOTE: This is the *name* of a cluster defined |
||||
in the :ref:`cluster manager <config_cluster_manager>` configuration, not the full definition of |
||||
a cluster as in the case of SDS and CDS. |
||||
|
||||
route_config_name |
||||
*(required, string)* The name of the route configuration. This name will be passed to the |
||||
:ref:`RDS HTTP API <config_http_conn_man_rds_api>`. This allows an Envoy configuration with |
||||
multiple HTTP listeners (and associated HTTP connection manager filters) to use different route |
||||
configurations. By default, the maximum length of the name is limited to 60 characters. This |
||||
limit can be increased by setting the :option:`--max-obj-name-len` command line argument to the |
||||
desired value. |
||||
|
||||
refresh_delay_ms |
||||
*(optional, integer)* The delay, in milliseconds, between fetches to the RDS API. Envoy will add |
||||
an additional random jitter to the delay that is between zero and *refresh_delay_ms* |
||||
milliseconds. Thus the longest possible refresh delay is 2 \* *refresh_delay_ms*. Default |
||||
value is 30000ms (30 seconds). |
||||
|
||||
.. _config_http_conn_man_rds_api: |
||||
|
||||
REST API |
||||
-------- |
||||
|
||||
.. http:get:: /v1/routes/(string: route_config_name)/(string: service_cluster)/(string: service_node) |
||||
|
||||
Asks the route discovery service to return the route configuration for a particular |
||||
`route_config_name`, `service_cluster`, and `service_node`. `route_config_name` corresponds to the |
||||
RDS configuration parameter above. `service_cluster` corresponds to the :option:`--service-cluster` |
||||
CLI option. `service_node` corresponds to the :option:`--service-node` CLI option. Responses are a |
||||
single JSON object that contains a route configuration as defined in the :ref:`route configuration |
||||
documentation <config_http_conn_man_route_table>`. |
||||
|
||||
A new route configuration will be gracefully swapped in such that existing requests are not |
||||
affected. This means that when a request starts, it sees a consistent snapshot of the route |
||||
configuration that does not change for the duration of the request. Thus, if an update changes a |
||||
timeout for example, only new requests will use the updated timeout value. |
||||
|
||||
As a performance optimization, Envoy hashes the route configuration it receives from the RDS API and |
||||
will only perform a full reload if the hash value changes. |
||||
|
||||
.. attention:: |
||||
|
||||
Route configurations that are loaded via RDS are *not* checked to see if referenced clusters are |
||||
known to the :ref:`cluster manager <config_cluster_manager>`. The RDS API has been designed to |
||||
work alongside the :ref:`CDS API <config_cluster_manager_cds>` such that Envoy assumes eventually |
||||
consistent updates. If a route references an unknown cluster a 404 response will be returned by |
||||
the router filter. |
||||
|
||||
Statistics |
||||
---------- |
||||
|
||||
RDS has a statistics tree rooted at *http.<stat_prefix>.rds.<route_config_name>.*. |
||||
Any ``:`` character in the ``route_config_name`` name gets replaced with ``_`` in the |
||||
stats tree. The stats tree contains the following statistics: |
||||
|
||||
.. csv-table:: |
||||
:header: Name, Type, Description |
||||
:widths: 1, 1, 2 |
||||
|
||||
config_reload, Counter, Total API fetches that resulted in a config reload due to a different config |
||||
update_attempt, Counter, Total API fetches attempted |
||||
update_success, Counter, Total API fetches completed successfully |
||||
update_failure, Counter, Total API fetches that failed (either network or schema errors) |
||||
version, Gauge, Hash of the contents from the last successful API fetch |
@ -0,0 +1,255 @@ |
||||
.. _config_http_conn_man_route_table_rate_limit_config: |
||||
|
||||
Rate limit configuration |
||||
======================== |
||||
|
||||
Global rate limiting :ref:`architecture overview <arch_overview_rate_limit>`. |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"stage": "...", |
||||
"disable_key": "...", |
||||
"actions": [] |
||||
} |
||||
|
||||
stage |
||||
*(optional, integer)* Refers to the stage set in the filter. The rate limit configuration |
||||
only applies to filters with the same stage number. The default stage number is 0. |
||||
|
||||
**NOTE:** The filter supports a range of 0 - 10 inclusively for stage numbers. |
||||
|
||||
disable_key |
||||
*(optional, string)* The key to be set in runtime to disable this rate limit configuration. |
||||
|
||||
actions |
||||
*(required, array)* A list of actions that are to be applied for this rate limit configuration. |
||||
Order matters as the actions are processed sequentially and the descriptor is composed by |
||||
appending descriptor entries in that sequence. If an action cannot append a descriptor entry, |
||||
no descriptor is generated for the configuration. See :ref:`composing actions |
||||
<config_http_conn_man_route_table_rate_limit_composing_actions>` for additional documentation. |
||||
|
||||
.. _config_http_conn_man_route_table_rate_limit_actions: |
||||
|
||||
Actions |
||||
------- |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"type": "..." |
||||
} |
||||
|
||||
type |
||||
*(required, string)* The type of rate limit action to perform. The currently supported action |
||||
types are *source_cluster*, *destination_cluster* , *request_headers*, *remote_address*, |
||||
*generic_key* and *header_value_match*. |
||||
|
||||
Source Cluster |
||||
^^^^^^^^^^^^^^ |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"type": "source_cluster" |
||||
} |
||||
|
||||
The following descriptor entry is appended to the descriptor: |
||||
|
||||
.. code-block:: cpp |
||||
|
||||
("source_cluster", "<local service cluster>") |
||||
|
||||
<local service cluster> is derived from the :option:`--service-cluster` option. |
||||
|
||||
Destination Cluster |
||||
^^^^^^^^^^^^^^^^^^^ |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"type": "destination_cluster" |
||||
} |
||||
|
||||
The following descriptor entry is appended to the descriptor: |
||||
|
||||
.. code-block:: cpp |
||||
|
||||
("destination_cluster", "<routed target cluster>") |
||||
|
||||
Once a request matches against a route table rule, a routed cluster is determined by one of the |
||||
following :ref:`route table configuration <config_http_conn_man_route_table_route_cluster>` |
||||
settings: |
||||
|
||||
* :ref:`cluster <config_http_conn_man_route_table_route_cluster>` indicates the upstream cluster |
||||
to route to. |
||||
* :ref:`weighted_clusters <config_http_conn_man_route_table_route_config_weighted_clusters>` |
||||
chooses a cluster randomly from a set of clusters with attributed weight. |
||||
* :ref:`cluster_header<config_http_conn_man_route_table_route_cluster_header>` indicates which |
||||
header in the request contains the target cluster. |
||||
|
||||
Request Headers |
||||
^^^^^^^^^^^^^^^ |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"type": "request_headers", |
||||
"header_name": "...", |
||||
"descriptor_key" : "..." |
||||
} |
||||
|
||||
header_name |
||||
*(required, string)* The header name to be queried from the request headers. The header's value is |
||||
used to populate the value of the descriptor entry for the descriptor_key. |
||||
|
||||
descriptor_key |
||||
*(required, string)* The key to use in the descriptor entry. |
||||
|
||||
The following descriptor entry is appended when a header contains a key that matches the |
||||
*header_name*: |
||||
|
||||
.. code-block:: cpp |
||||
|
||||
("<descriptor_key>", "<header_value_queried_from_header>") |
||||
|
||||
Remote Address |
||||
^^^^^^^^^^^^^^ |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"type": "remote_address" |
||||
} |
||||
|
||||
The following descriptor entry is appended to the descriptor and is populated using the trusted |
||||
address from :ref:`x-forwarded-for <config_http_conn_man_headers_x-forwarded-for>`: |
||||
|
||||
.. code-block:: cpp |
||||
|
||||
("remote_address", "<trusted address from x-forwarded-for>") |
||||
|
||||
Generic Key |
||||
^^^^^^^^^^^ |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"type": "generic_key", |
||||
"descriptor_value" : "..." |
||||
} |
||||
|
||||
|
||||
descriptor_value |
||||
*(required, string)* The value to use in the descriptor entry. |
||||
|
||||
The following descriptor entry is appended to the descriptor: |
||||
|
||||
.. code-block:: cpp |
||||
|
||||
("generic_key", "<descriptor_value>") |
||||
|
||||
Header Value Match |
||||
^^^^^^^^^^^^^^^^^^ |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"type": "header_value_match", |
||||
"descriptor_value" : "...", |
||||
"expect_match" : "...", |
||||
"headers" : [] |
||||
} |
||||
|
||||
|
||||
descriptor_value |
||||
*(required, string)* The value to use in the descriptor entry. |
||||
|
||||
expect_match |
||||
*(optional, boolean)* If set to true, the action will append a descriptor entry when the request |
||||
matches the :ref:`headers<config_http_conn_man_route_table_route_headers>`. If set to false, |
||||
the action will append a descriptor entry when the request does not match the |
||||
:ref:`headers<config_http_conn_man_route_table_route_headers>`. The default value is true. |
||||
|
||||
:ref:`headers<config_http_conn_man_route_table_route_headers>` |
||||
*(required, array)* Specifies a set of headers that the rate limit action should match on. The |
||||
action will check the request's headers against all the specified headers in the config. A match |
||||
will happen if all the headers in the config are present in the request with the same values (or |
||||
based on presence if the ``value`` field is not in the config). |
||||
|
||||
The following descriptor entry is appended to the descriptor: |
||||
.. code-block:: cpp |
||||
|
||||
("header_match", "<descriptor_value>") |
||||
|
||||
.. _config_http_conn_man_route_table_rate_limit_composing_actions: |
||||
|
||||
Composing Actions |
||||
----------------- |
||||
|
||||
Each action populates a descriptor entry. A vector of descriptor entries compose a descriptor. To |
||||
create more complex rate limit descriptors, actions can be composed in any order. The descriptor |
||||
will be populated in the order the actions are specified in the configuration. |
||||
|
||||
Example 1 |
||||
^^^^^^^^^ |
||||
|
||||
For example, to generate the following descriptor: |
||||
|
||||
.. code-block:: cpp |
||||
|
||||
("generic_key", "some_value") |
||||
("source_cluster", "from_cluster") |
||||
|
||||
The configuration would be: |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"actions" : [ |
||||
{ |
||||
"type" : "generic_key", |
||||
"descriptor_value" : "some_value" |
||||
}, |
||||
{ |
||||
"type" : "source_cluster" |
||||
} |
||||
] |
||||
} |
||||
|
||||
Example 2 |
||||
^^^^^^^^^ |
||||
|
||||
If an action doesn't append a descriptor entry, no descriptor is generated for |
||||
the configuration. |
||||
|
||||
For the following configuration: |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"actions" : [ |
||||
{ |
||||
"type" : "generic_key", |
||||
"descriptor_value" : "some_value" |
||||
}, |
||||
{ |
||||
"type" : "remote_address" |
||||
}, |
||||
{ |
||||
"type" : "souce_cluster" |
||||
} |
||||
] |
||||
} |
||||
|
||||
If a request did not set :ref:`x-forwarded-for<config_http_conn_man_headers_x-forwarded-for>`, |
||||
no descriptor is generated. |
||||
|
||||
If a request sets :ref:`x-forwarded-for<config_http_conn_man_headers_x-forwarded-for>`, the |
||||
the following descriptor is generated: |
||||
|
||||
.. code-block:: cpp |
||||
|
||||
("generic_key", "some_value") |
||||
("remote_address", "<trusted address from x-forwarded-for>") |
||||
("source_cluster", "from_cluster") |
@ -0,0 +1,509 @@ |
||||
.. _config_http_conn_man_route_table_route: |
||||
|
||||
Route |
||||
===== |
||||
|
||||
A route is both a specification of how to match a request as well as in indication of what to do |
||||
next (e.g., redirect, forward, rewrite, etc.). |
||||
|
||||
.. attention:: |
||||
|
||||
Envoy supports routing on HTTP method via :ref:`header matching |
||||
<config_http_conn_man_route_table_route_headers>`. |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"prefix": "...", |
||||
"path": "...", |
||||
"regex": "...", |
||||
"cluster": "...", |
||||
"cluster_header": "...", |
||||
"weighted_clusters" : "{...}", |
||||
"host_redirect": "...", |
||||
"path_redirect": "...", |
||||
"prefix_rewrite": "...", |
||||
"host_rewrite": "...", |
||||
"auto_host_rewrite": "...", |
||||
"case_sensitive": "...", |
||||
"use_websocket": "...", |
||||
"timeout_ms": "...", |
||||
"runtime": "{...}", |
||||
"retry_policy": "{...}", |
||||
"shadow": "{...}", |
||||
"priority": "...", |
||||
"headers": [], |
||||
"rate_limits": [], |
||||
"include_vh_rate_limits" : "...", |
||||
"hash_policy": "{...}", |
||||
"request_headers_to_add" : [], |
||||
"opaque_config": [], |
||||
"cors": "{...}", |
||||
"decorator" : "{...}" |
||||
} |
||||
|
||||
prefix |
||||
*(sometimes required, string)* If specified, the route is a prefix rule meaning that the prefix |
||||
must match the beginning of the :path header. One of *prefix*, *path*, or *regex* must be specified. |
||||
|
||||
path |
||||
*(sometimes required, string)* If specified, the route is an exact path rule meaning that the path |
||||
must exactly match the :path header once the query string is removed. One of *prefix*, *path*, or |
||||
*regex* must be specified. |
||||
|
||||
regex |
||||
*(sometimes required, string)* If specified, the route is a regular expression rule meaning that the |
||||
regex must match the :path header once the query string is removed. The entire path (without the |
||||
query string) must match the regex. The rule will not match if only a subsequence of the :path header |
||||
matches the regex. The regex grammar is defined `here |
||||
<http://en.cppreference.com/w/cpp/regex/ecmascript>`_. One of *prefix*, *path*, or |
||||
*regex* must be specified. |
||||
|
||||
Examples: |
||||
|
||||
* The regex */b[io]t* matches the path */bit* |
||||
* The regex */b[io]t* matches the path */bot* |
||||
* The regex */b[io]t* does not match the path */bite* |
||||
* The regex */b[io]t* does not match the path */bit/bot* |
||||
|
||||
:ref:`cors <config_http_filters_cors>` |
||||
*(optional, object)* Specifies the route's CORS policy. |
||||
|
||||
.. _config_http_conn_man_route_table_route_cluster: |
||||
|
||||
cluster |
||||
*(sometimes required, string)* If the route is not a redirect (*host_redirect* and/or |
||||
*path_redirect* is not specified), one of *cluster*, *cluster_header*, or *weighted_clusters* must |
||||
be specified. When *cluster* is specified, its value indicates the upstream cluster to which the |
||||
request should be forwarded to. |
||||
|
||||
.. _config_http_conn_man_route_table_route_cluster_header: |
||||
|
||||
cluster_header |
||||
*(sometimes required, string)* If the route is not a redirect (*host_redirect* and/or |
||||
*path_redirect* is not specified), one of *cluster*, *cluster_header*, or *weighted_clusters* must |
||||
be specified. When *cluster_header* is specified, Envoy will determine the cluster to route to |
||||
by reading the value of the HTTP header named by *cluster_header* from the request headers. |
||||
If the header is not found or the referenced cluster does not exist, Envoy will return a 404 |
||||
response. |
||||
|
||||
.. attention:: |
||||
|
||||
Internally, Envoy always uses the HTTP/2 *:authority* header to represent the HTTP/1 *Host* |
||||
header. Thus, if attempting to match on *Host*, match on *:authority* instead. |
||||
|
||||
.. _config_http_conn_man_route_table_route_config_weighted_clusters: |
||||
|
||||
:ref:`weighted_clusters <config_http_conn_man_route_table_route_weighted_clusters>` |
||||
*(sometimes required, object)* If the route is not a redirect (*host_redirect* and/or |
||||
*path_redirect* is not specified), one of *cluster*, *cluster_header*, or *weighted_clusters* must |
||||
be specified. With the *weighted_clusters* option, multiple upstream clusters can be specified for |
||||
a given route. The request is forwarded to one of the upstream clusters based on weights assigned |
||||
to each cluster. See :ref:`traffic splitting <config_http_conn_man_route_table_traffic_splitting_split>` |
||||
for additional documentation. |
||||
|
||||
.. _config_http_conn_man_route_table_route_host_redirect: |
||||
|
||||
host_redirect |
||||
*(sometimes required, string)* Indicates that the route is a redirect rule. If there is a match, |
||||
a 301 redirect response will be sent which swaps the host portion of the URL with this value. |
||||
*path_redirect* can also be specified along with this option. |
||||
|
||||
.. _config_http_conn_man_route_table_route_path_redirect: |
||||
|
||||
path_redirect |
||||
*(sometimes required, string)* Indicates that the route is a redirect rule. If there is a match, |
||||
a 301 redirect response will be sent which swaps the path portion of the URL with this value. |
||||
*host_redirect* can also be specified along with this option. The router filter will place |
||||
the original path before rewrite into the :ref:`x-envoy-original-path |
||||
<config_http_filters_router_x-envoy-original-path>` header. |
||||
|
||||
.. _config_http_conn_man_route_table_route_prefix_rewrite: |
||||
|
||||
prefix_rewrite |
||||
*(optional, string)* Indicates that during forwarding, the matched prefix (or path) should be |
||||
swapped with this value. When using regex path matching, the entire path (not including |
||||
the query string) will be swapped with this value. This option allows application URLs to be |
||||
rooted at a different path from those exposed at the reverse proxy layer. |
||||
|
||||
.. _config_http_conn_man_route_table_route_host_rewrite: |
||||
|
||||
host_rewrite |
||||
*(optional, string)* Indicates that during forwarding, the host header will be swapped with this |
||||
value. |
||||
|
||||
.. _config_http_conn_man_route_table_route_auto_host_rewrite: |
||||
|
||||
auto_host_rewrite |
||||
*(optional, boolean)* Indicates that during forwarding, the host header will be swapped with the |
||||
hostname of the upstream host chosen by the cluster manager. This option is applicable only when |
||||
the destination cluster for a route is of type *strict_dns* or *logical_dns*. Setting this to true |
||||
with other cluster types has no effect. *auto_host_rewrite* and *host_rewrite* are mutually exclusive |
||||
options. Only one can be specified. |
||||
|
||||
.. _config_http_conn_man_route_table_route_case_sensitive: |
||||
|
||||
case_sensitive |
||||
*(optional, boolean)* Indicates that prefix/path matching should be case sensitive. The default |
||||
is true. |
||||
|
||||
.. _config_http_conn_man_route_table_route_use_websocket: |
||||
|
||||
use_websocket |
||||
*(optional, boolean)* Indicates that a HTTP/1.1 client connection to this particular route |
||||
should be allowed to upgrade to a WebSocket connection. The default is false. |
||||
|
||||
.. attention:: |
||||
|
||||
If set to true, Envoy will expect the first request matching this route to contain WebSocket |
||||
upgrade headers. If the headers are not present, the connection will be processed as a normal |
||||
HTTP/1.1 connection. If the upgrade headers are present, Envoy will setup plain TCP proxying |
||||
between the client and the upstream server. Hence, an upstream server that rejects the WebSocket |
||||
upgrade request is also responsible for closing the associated connection. Until then, Envoy will |
||||
continue to proxy data from the client to the upstream server. |
||||
|
||||
Redirects, timeouts and retries are not supported on requests with WebSocket upgrade headers. |
||||
|
||||
.. _config_http_conn_man_route_table_route_timeout: |
||||
|
||||
timeout_ms |
||||
*(optional, integer)* Specifies the timeout for the route. If not specified, the default is 15s. |
||||
Note that this timeout includes all retries. See also |
||||
:ref:`config_http_filters_router_x-envoy-upstream-rq-timeout-ms`, |
||||
:ref:`config_http_filters_router_x-envoy-upstream-rq-per-try-timeout-ms`, and the |
||||
:ref:`retry overview <arch_overview_http_routing_retry>`. |
||||
|
||||
:ref:`runtime <config_http_conn_man_route_table_route_runtime>` |
||||
*(optional, object)* Indicates that the route should additionally match on a runtime key. |
||||
|
||||
:ref:`retry_policy <config_http_conn_man_route_table_route_retry>` |
||||
*(optional, object)* Indicates that the route has a retry policy. |
||||
|
||||
:ref:`shadow <config_http_conn_man_route_table_route_shadow>` |
||||
*(optional, object)* Indicates that the route has a shadow policy. |
||||
|
||||
priority |
||||
*(optional, string)* Optionally specifies the :ref:`routing priority |
||||
<arch_overview_http_routing_priority>`. |
||||
|
||||
:ref:`headers <config_http_conn_man_route_table_route_headers>` |
||||
*(optional, array)* Specifies a set of headers that the route should match on. The router will |
||||
check the request's headers against all the specified headers in the route config. A match will |
||||
happen if all the headers in the route are present in the request with the same values (or based |
||||
on presence if the ``value`` field is not in the config). |
||||
|
||||
:ref:`request_headers_to_add <config_http_conn_man_route_table_route_add_req_headers>` |
||||
*(optional, array)* Specifies a set of headers that will be added to requests matching this route. |
||||
|
||||
:ref:`opaque_config <config_http_conn_man_route_table_opaque_config>` |
||||
*(optional, array)* Specifies a set of optional route configuration values that can be accessed by filters. |
||||
|
||||
.. _config_http_conn_man_route_table_route_rate_limits: |
||||
|
||||
:ref:`rate_limits <config_http_conn_man_route_table_rate_limit_config>` |
||||
*(optional, array)* Specifies a set of rate limit configurations that could be applied to the |
||||
route. |
||||
|
||||
.. _config_http_conn_man_route_table_route_include_vh: |
||||
|
||||
include_vh_rate_limits |
||||
*(optional, boolean)* Specifies if the rate limit filter should include the virtual host rate |
||||
limits. By default, if the route configured rate limits, the virtual host |
||||
:ref:`rate_limits <config_http_conn_man_route_table_rate_limit_config>` are not applied to the |
||||
request. |
||||
|
||||
:ref:`hash_policy <config_http_conn_man_route_table_hash_policy>` |
||||
*(optional, object)* Specifies the route's hashing policy if the upstream cluster uses a hashing |
||||
:ref:`load balancer <arch_overview_load_balancing_types>`. |
||||
|
||||
:ref:`decorator <config_http_conn_man_route_table_decorator>` |
||||
*(optional, object)* Specifies the route's decorator used to enhance information reported about |
||||
the matched request. |
||||
|
||||
.. _config_http_conn_man_route_table_route_runtime: |
||||
|
||||
Runtime |
||||
------- |
||||
|
||||
A :ref:`runtime <arch_overview_runtime>` route configuration can be used to roll out route changes |
||||
in a gradual manner without full code/config deploys. Refer to |
||||
:ref:`traffic shifting <config_http_conn_man_route_table_traffic_splitting_shift>` docs |
||||
for additional documentation. |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"key": "...", |
||||
"default": "..." |
||||
} |
||||
|
||||
key |
||||
*(required, string)* Specifies the runtime key name that should be consulted to determine whether |
||||
the route matches or not. See the :ref:`runtime documentation <operations_runtime>` for how key |
||||
names map to the underlying implementation. |
||||
|
||||
.. _config_http_conn_man_route_table_route_runtime_default: |
||||
|
||||
default |
||||
*(required, integer)* An integer between 0-100. Every time the route is considered for a match, |
||||
a random number between 0-99 is selected. If the number is <= the value found in the *key* |
||||
(checked first) or, if the key is not present, the default value, the route is a match (assuming |
||||
everything also about the route matches). |
||||
|
||||
.. _config_http_conn_man_route_table_route_retry: |
||||
|
||||
Retry policy |
||||
------------ |
||||
|
||||
HTTP retry :ref:`architecture overview <arch_overview_http_routing_retry>`. |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"retry_on": "...", |
||||
"num_retries": "...", |
||||
"per_try_timeout_ms" : "..." |
||||
} |
||||
|
||||
retry_on |
||||
*(required, string)* specifies the conditions under which retry takes place. These are the same |
||||
conditions documented for :ref:`config_http_filters_router_x-envoy-retry-on` and |
||||
:ref:`config_http_filters_router_x-envoy-retry-grpc-on`. |
||||
|
||||
num_retries |
||||
*(optional, integer)* specifies the allowed number of retries. This parameter is optional and |
||||
defaults to 1. These are the same conditions documented for |
||||
:ref:`config_http_filters_router_x-envoy-max-retries`. |
||||
|
||||
per_try_timeout_ms |
||||
*(optional, integer)* specifies a non-zero timeout per retry attempt. This parameter is optional. |
||||
The same conditions documented for |
||||
:ref:`config_http_filters_router_x-envoy-upstream-rq-per-try-timeout-ms` apply. |
||||
|
||||
**Note:** If left unspecified, Envoy will use the global |
||||
:ref:`route timeout <config_http_conn_man_route_table_route_timeout>` for the request. |
||||
Consequently, when using a :ref:`5xx <config_http_filters_router_x-envoy-retry-on>` based |
||||
retry policy, a request that times out will not be retried as the total timeout budget |
||||
would have been exhausted. |
||||
|
||||
.. _config_http_conn_man_route_table_route_shadow: |
||||
|
||||
Shadow |
||||
------ |
||||
|
||||
The router is capable of shadowing traffic from one cluster to another. The current implementation |
||||
is "fire and forget," meaning Envoy will not wait for the shadow cluster to respond before returning |
||||
the response from the primary cluster. All normal statistics are collected for the shadow |
||||
cluster making this feature useful for testing. |
||||
|
||||
During shadowing, the host/authority header is altered such that *-shadow* is appended. This is |
||||
useful for logging. For example, *cluster1* becomes *cluster1-shadow*. |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"cluster": "...", |
||||
"runtime_key": "..." |
||||
} |
||||
|
||||
cluster |
||||
*(required, string)* Specifies the cluster that requests will be shadowed to. The cluster must |
||||
exist in the :ref:`cluster manager configuration <config_cluster_manager>`. |
||||
|
||||
runtime_key |
||||
*(optional, string)* If not specified, **all** requests to the target cluster will be shadowed. |
||||
If specified, Envoy will lookup the runtime key to get the % of requests to shadow. Valid values are |
||||
from 0 to 10000, allowing for increments of 0.01% of requests to be shadowed. If the runtime key |
||||
is specified in the configuration but not present in runtime, 0 is the default and thus 0% of |
||||
requests will be shadowed. |
||||
|
||||
.. _config_http_conn_man_route_table_route_headers: |
||||
|
||||
Headers |
||||
------- |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"name": "...", |
||||
"value": "...", |
||||
"regex": "..." |
||||
} |
||||
|
||||
name |
||||
*(required, string)* Specifies the name of the header in the request. |
||||
|
||||
value |
||||
*(optional, string)* Specifies the value of the header. If the value is absent a request that has |
||||
the *name* header will match, regardless of the header's value. |
||||
|
||||
regex |
||||
*(optional, boolean)* Specifies whether the header value is a regular |
||||
expression or not. Defaults to false. The entire request header value must match the regex. The |
||||
rule will not match if only a subsequence of the request header value matches the regex. The |
||||
regex grammar used in the value field is defined |
||||
`here <http://en.cppreference.com/w/cpp/regex/ecmascript>`_. |
||||
|
||||
Examples: |
||||
|
||||
* The regex *\d{3}* matches the value *123* |
||||
* The regex *\d{3}* does not match the value *1234* |
||||
* The regex *\d{3}* does not match the value *123.456* |
||||
|
||||
.. attention:: |
||||
|
||||
Internally, Envoy always uses the HTTP/2 *:authority* header to represent the HTTP/1 *Host* |
||||
header. Thus, if attempting to match on *Host*, match on *:authority* instead. |
||||
|
||||
.. attention:: |
||||
|
||||
To route on HTTP method, use the special HTTP/2 *:method* header. This works for both |
||||
HTTP/1 and HTTP/2 as Envoy normalizes headers. E.g., |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"name": ":method", |
||||
"value": "POST" |
||||
} |
||||
|
||||
.. _config_http_conn_man_route_table_route_weighted_clusters: |
||||
|
||||
Weighted Clusters |
||||
----------------- |
||||
|
||||
Compared to the ``cluster`` field that specifies a single upstream cluster as the target |
||||
of a request, the ``weighted_clusters`` option allows for specification of multiple upstream clusters |
||||
along with weights that indicate the **percentage** of traffic to be forwarded to each cluster. |
||||
The router selects an upstream cluster based on the weights. |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"clusters": [], |
||||
"runtime_key_prefix" : "..." |
||||
} |
||||
|
||||
clusters |
||||
*(required, array)* Specifies one or more upstream clusters associated with the route. |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"name" : "...", |
||||
"weight": "..." |
||||
} |
||||
|
||||
name |
||||
*(required, string)* Name of the upstream cluster. The cluster must exist in the |
||||
:ref:`cluster manager configuration <config_cluster_manager>`. |
||||
|
||||
weight |
||||
*(required, integer)* An integer between 0-100. When a request matches the route, |
||||
the choice of an upstream cluster is determined by its weight. The sum of |
||||
weights across all entries in the ``clusters`` array must add up to 100. |
||||
|
||||
runtime_key_prefix |
||||
*(optional, string)* Specifies the runtime key prefix that should be used to construct the runtime |
||||
keys associated with each cluster. When the ``runtime_key_prefix`` is specified, the router will |
||||
look for weights associated with each upstream cluster under the key |
||||
``runtime_key_prefix + "." + cluster[i].name`` where ``cluster[i]`` denotes an entry in the |
||||
``clusters`` array field. If the runtime key for the cluster does not exist, the value specified |
||||
in the configuration file will be used as the default weight. |
||||
See the :ref:`runtime documentation <operations_runtime>` for how key names map to the |
||||
underlying implementation. |
||||
|
||||
**Note:** If the sum of runtime weights exceed 100, the traffic splitting behavior |
||||
is undefined (although the request will be routed to one of the clusters). |
||||
|
||||
.. _config_http_conn_man_route_table_hash_policy: |
||||
|
||||
Hash policy |
||||
----------- |
||||
|
||||
Specifies the route's hashing policy if the upstream cluster uses a hashing :ref:`load balancer |
||||
<arch_overview_load_balancing_types>`. |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"header_name": "..." |
||||
} |
||||
|
||||
header_name |
||||
*(required, string)* The name of the request header that will be used to obtain the hash key. If |
||||
the request header is not present, the load balancer will use a random number as the hash, |
||||
effectively making the load balancing policy random. |
||||
|
||||
.. _config_http_conn_man_route_table_decorator: |
||||
|
||||
Decorator |
||||
--------- |
||||
|
||||
Specifies the route's decorator. |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"operation": "..." |
||||
} |
||||
|
||||
operation |
||||
*(required, string)* The operation name associated with the request matched to this route. If tracing is |
||||
enabled, this information will be used as the span name reported for this request. NOTE: For ingress |
||||
(inbound) requests, or egress (outbound) responses, this value may be overridden by the |
||||
:ref:`x-envoy-decorator-operation <config_http_filters_router_x-envoy-decorator-operation>` header. |
||||
|
||||
.. _config_http_conn_man_route_table_route_add_req_headers: |
||||
|
||||
Adding custom request headers |
||||
----------------------------- |
||||
|
||||
Custom request headers can be added to a request that matches a specific route. The headers are |
||||
specified in the following form: |
||||
|
||||
.. code-block:: json |
||||
|
||||
[ |
||||
{"key": "header1", "value": "value1"}, |
||||
{"key": "header2", "value": "value2"} |
||||
] |
||||
|
||||
Envoy supports adding static and dynamic values to the request headers. Supported dynamic values are: |
||||
|
||||
%CLIENT_IP% |
||||
The original client IP which is already added by envoy as a |
||||
:ref:`X-Forwarded-For <config_http_conn_man_headers_x-forwarded-for>` request header. |
||||
|
||||
%PROTOCOL% |
||||
The original protocol which is already added by envoy as a |
||||
:ref:`X-Forwarded-Proto <config_http_conn_man_headers_x-forwarded-proto>` request header. |
||||
|
||||
An example for adding a dynamic value to the request headers is as follows: |
||||
|
||||
.. code-block:: json |
||||
|
||||
[ |
||||
{"key": "X-Client-IP", "value":"%CLIENT_IP%"} |
||||
] |
||||
|
||||
*Note:* Headers are appended to requests in the following order: |
||||
route-level headers, :ref:`virtual host level <config_http_conn_man_route_table_vhost_add_req_headers>` |
||||
headers and finally global :ref:`route_config <config_http_conn_man_route_table_add_req_headers>` |
||||
level headers. |
||||
|
||||
.. _config_http_conn_man_route_table_opaque_config: |
||||
|
||||
Opaque Config |
||||
------------- |
||||
|
||||
Additional configuration can be provided to filters through the "Opaque Config" mechanism. A |
||||
list of properties are specified in the route config. The configuration is uninterpreted |
||||
by envoy and can be accessed within a user-defined filter. The configuration is a generic |
||||
string map. Nested objects are not supported. |
||||
|
||||
.. code-block:: json |
||||
|
||||
[ |
||||
{"...": "..."} |
||||
] |
@ -0,0 +1,90 @@ |
||||
.. _config_http_conn_man_route_table: |
||||
|
||||
Route configuration |
||||
=================== |
||||
|
||||
* Routing :ref:`architecture overview <arch_overview_http_routing>`. |
||||
* HTTP :ref:`router filter <config_http_filters_router>`. |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"validate_clusters": "...", |
||||
"virtual_hosts": [], |
||||
"internal_only_headers": [], |
||||
"response_headers_to_add": [], |
||||
"response_headers_to_remove": [], |
||||
"request_headers_to_add": [] |
||||
} |
||||
|
||||
.. _config_http_conn_man_route_table_validate_clusters: |
||||
|
||||
validate_clusters |
||||
*(optional, boolean)* An optional boolean that specifies whether the clusters that the route |
||||
table refers to will be validated by the cluster manager. If set to true and a route refers to |
||||
a non-existent cluster, the route table will not load. If set to false and a route refers to a |
||||
non-existent cluster, the route table will load and the router filter will return a 404 if the |
||||
route is selected at runtime. This setting defaults to true if the route table is statically |
||||
defined via the :ref:`route_config <config_http_conn_man_route_config>` option. This setting |
||||
default to false if the route table is loaded dynamically via the :ref:`rds |
||||
<config_http_conn_man_rds_option>` option. Users may which to override the default behavior in |
||||
certain cases (for example when using :ref:`cds <config_cluster_manager_cds>` with a static |
||||
route table). |
||||
|
||||
:ref:`virtual_hosts <config_http_conn_man_route_table_vhost>` |
||||
*(required, array)* An array of virtual hosts that make up the route table. |
||||
|
||||
internal_only_headers |
||||
*(optional, array)* Optionally specifies a list of HTTP headers that the connection manager |
||||
will consider to be internal only. If they are found on external requests they will be cleaned |
||||
prior to filter invocation. See :ref:`config_http_conn_man_headers_x-envoy-internal` for more |
||||
information. Headers are specified in the following form: |
||||
|
||||
.. code-block:: json |
||||
|
||||
["header1", "header2"] |
||||
|
||||
response_headers_to_add |
||||
*(optional, array)* Optionally specifies a list of HTTP headers that should be added to each |
||||
response that the connection manager encodes. Headers are specified in the following form: |
||||
|
||||
.. code-block:: json |
||||
|
||||
[ |
||||
{"key": "header1", "value": "value1"}, |
||||
{"key": "header2", "value": "value2"} |
||||
] |
||||
|
||||
response_headers_to_remove |
||||
*(optional, array)* Optionally specifies a list of HTTP headers that should be removed from each |
||||
response that the connection manager encodes. Headers are specified in the following form: |
||||
|
||||
.. code-block:: json |
||||
|
||||
["header1", "header2"] |
||||
|
||||
.. _config_http_conn_man_route_table_add_req_headers: |
||||
|
||||
request_headers_to_add |
||||
*(optional, array)* Specifies a list of HTTP headers that should be added to each |
||||
request forwarded by the HTTP connection manager. Headers are specified in the following form: |
||||
|
||||
.. code-block:: json |
||||
|
||||
[ |
||||
{"key": "header1", "value": "value1"}, |
||||
{"key": "header2", "value": "value2"} |
||||
] |
||||
|
||||
*Note:* In the presence of duplicate header keys, |
||||
:ref:`precendence rules <config_http_conn_man_route_table_route_add_req_headers>` apply. |
||||
|
||||
.. toctree:: |
||||
:hidden: |
||||
|
||||
vhost |
||||
route |
||||
vcluster |
||||
rate_limits |
||||
route_matching |
||||
traffic_splitting |
@ -0,0 +1,14 @@ |
||||
.. _config_http_conn_man_route_table_route_matching: |
||||
|
||||
Route matching |
||||
============== |
||||
|
||||
When Envoy matches a route, it uses the following procedure: |
||||
|
||||
#. The HTTP request's *host* or *:authority* header is matched to a :ref:`virtual host |
||||
<config_http_conn_man_route_table_vhost>`. |
||||
#. Each :ref:`route entry <config_http_conn_man_route_table_route>` in the virtual host is checked, |
||||
*in order*. If there is a match, the route is used and no further route checks are made. |
||||
#. Independently, each :ref:`virtual cluster <config_http_conn_man_route_table_vcluster>` in the |
||||
virtual host is checked, *in order*. If there is a match, the virtual cluster is used and no |
||||
further virtual cluster checks are made. |
@ -0,0 +1,136 @@ |
||||
.. _config_http_conn_man_route_table_traffic_splitting: |
||||
|
||||
Traffic Shifting/Splitting |
||||
=========================================== |
||||
|
||||
.. contents:: |
||||
:local: |
||||
|
||||
Envoy's router can split traffic to a route in a virtual host across |
||||
two or more upstream clusters. There are two common use cases. |
||||
|
||||
1. Version upgrades: traffic to a route is shifted gradually |
||||
from one cluster to another. The |
||||
:ref:`traffic shifting <config_http_conn_man_route_table_traffic_splitting_shift>` |
||||
section describes this scenario in more detail. |
||||
|
||||
2. A/B testing or multivariate testing: ``two or more versions`` of |
||||
the same service are tested simultaneously. The traffic to the route has to |
||||
be *split* between clusters running different versions of the same |
||||
service. The |
||||
:ref:`traffic splitting <config_http_conn_man_route_table_traffic_splitting_split>` |
||||
section describes this scenario in more detail. |
||||
|
||||
.. _config_http_conn_man_route_table_traffic_splitting_shift: |
||||
|
||||
Traffic shifting between two upstreams |
||||
-------------------------------------- |
||||
|
||||
The :ref:`runtime <config_http_conn_man_route_table_route_runtime>` object |
||||
in the route configuration determines the probability of selecting a |
||||
particular route (and hence its cluster). By using the runtime |
||||
configuration, traffic to a particular route in a virtual host can be |
||||
gradually shifted from one cluster to another. Consider the following |
||||
example configuration, where two versions ``helloworld_v1`` and |
||||
``helloworld_v2`` of a service named ``helloworld`` are declared in the |
||||
envoy configuration file. |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"route_config": { |
||||
"virtual_hosts": [ |
||||
{ |
||||
"name": "helloworld", |
||||
"domains": ["*"], |
||||
"routes": [ |
||||
{ |
||||
"prefix": "/", |
||||
"cluster": "helloworld_v1", |
||||
"runtime": { |
||||
"key": "routing.traffic_shift.helloworld", |
||||
"default": 50 |
||||
} |
||||
}, |
||||
{ |
||||
"prefix": "/", |
||||
"cluster": "helloworld_v2", |
||||
} |
||||
] |
||||
} |
||||
] |
||||
} |
||||
} |
||||
|
||||
Envoy matches routes with a :ref:`first match <config_http_conn_man_route_table_route_matching>` policy. |
||||
If the route has a runtime object, the request will be additionally matched based on the runtime |
||||
:ref:`value <config_http_conn_man_route_table_route_runtime_default>` |
||||
(or the default, if no value is specified). Thus, by placing routes |
||||
back-to-back in the above example and specifying a runtime object in the |
||||
first route, traffic shifting can be accomplished by changing the runtime |
||||
value. The following are the approximate sequence of actions required to |
||||
accomplish the task. |
||||
|
||||
1. In the beginning, set ``routing.traffic_shift.helloworld`` to ``100``, |
||||
so that all requests to the ``helloworld`` virtual host would match with |
||||
the v1 route and be served by the ``helloworld_v1`` cluster. |
||||
2. To start shifting traffic to ``helloworld_v2`` cluster, set |
||||
``routing.traffic_shift.helloworld`` to values ``0 < x < 100``. For |
||||
instance at ``90``, 1 out of every 10 requests to the ``helloworld`` |
||||
virtual host will not match the v1 route and will fall through to the v2 |
||||
route. |
||||
3. Gradually decrease the value set in ``routing.traffic_shift.helloworld`` |
||||
so that a larger percentage of requests match the v2 route. |
||||
4. When ``routing.traffic_shift.helloworld`` is set to ``0``, no requests |
||||
to the ``helloworld`` virtual host will match to the v1 route. All |
||||
traffic would now fall through to the v2 route and be served by the |
||||
``helloworld_v2`` cluster. |
||||
|
||||
|
||||
.. _config_http_conn_man_route_table_traffic_splitting_split: |
||||
|
||||
Traffic splitting across multiple upstreams |
||||
------------------------------------------- |
||||
|
||||
Consider the ``helloworld`` example again, now with three versions (v1, v2 and |
||||
v3) instead of two. To split traffic evenly across the three versions |
||||
(i.e., ``33%, 33%, 34%``), the ``weighted_clusters`` option can be used to |
||||
specify the weight for each upstream cluster. |
||||
|
||||
Unlike the previous example, a **single** :ref:`route |
||||
<config_http_conn_man_route_table_route>` entry is sufficient. The |
||||
:ref:`weighted_clusters <config_http_conn_man_route_table_route_weighted_clusters>` |
||||
configuration block in a route can be used to specify multiple upstream clusters |
||||
along with weights that indicate the **percentage** of traffic to be sent |
||||
to each upstream cluster. |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"route_config": { |
||||
"virtual_hosts": [ |
||||
{ |
||||
"name": "helloworld", |
||||
"domains": ["*"], |
||||
"routes": [ |
||||
{ |
||||
"prefix": "/", |
||||
"weighted_clusters": { |
||||
"runtime_key_prefix" : "routing.traffic_split.helloworld", |
||||
"clusters" : [ |
||||
{ "name" : "helloworld_v1", "weight" : 33 }, |
||||
{ "name" : "helloworld_v2", "weight" : 33 }, |
||||
{ "name" : "helloworld_v3", "weight" : 34 } |
||||
] |
||||
} |
||||
} |
||||
] |
||||
} |
||||
] |
||||
} |
||||
} |
||||
|
||||
The weights assigned to each cluster can be dynamically adjusted using the |
||||
following runtime variables: ``routing.traffic_split.helloworld.helloworld_v1``, |
||||
``routing.traffic_split.helloworld.helloworld_v2`` and |
||||
``routing.traffic_split.helloworld.helloworld_v3``. |
@ -0,0 +1,47 @@ |
||||
.. _config_http_conn_man_route_table_vcluster: |
||||
|
||||
Virtual cluster |
||||
=============== |
||||
|
||||
A virtual cluster is a way of specifying a regex matching rule against certain important endpoints |
||||
such that statistics are generated explicitly for the matched requests. The reason this is useful is |
||||
that when doing prefix/path matching Envoy does not always know what the application considers to |
||||
be an endpoint. Thus, it's impossible for Envoy to generically emit per endpoint statistics. |
||||
However, often systems have highly critical endpoints that they wish to get "perfect" statistics on. |
||||
Virtual cluster statistics are perfect in the sense that they are emitted on the downstream side |
||||
such that they include network level failures. |
||||
|
||||
.. note:: |
||||
|
||||
Virtual clusters are a useful tool, but we do not recommend setting up a virtual cluster for |
||||
every application endpoint. This is both not easily maintainable as well as the matching and |
||||
statistics output are not free. |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"pattern": "...", |
||||
"name": "...", |
||||
"method": "..." |
||||
} |
||||
|
||||
pattern |
||||
*(required, string)* Specifies a regex pattern to use for matching requests. The entire path of the request |
||||
must match the regex. The regex grammar used is defined `here <http://en.cppreference.com/w/cpp/regex/ecmascript>`_. |
||||
|
||||
name |
||||
*(required, string)* Specifies the name of the virtual cluster. The virtual cluster name as well |
||||
as the virtual host name are used when emitting statistics. The statistics are emitted by the |
||||
router filter and are documented :ref:`here <config_http_filters_router_stats>`. |
||||
|
||||
method |
||||
*(optional, string)* Optionally specifies the HTTP method to match on. For example *GET*, *PUT*, |
||||
etc. |
||||
|
||||
Examples: |
||||
|
||||
* The regex */rides/\d+* matches the path */rides/0* |
||||
* The regex */rides/\d+* matches the path */rides/123* |
||||
* The regex */rides/\d+* does not match the path */rides/123/456* |
||||
|
||||
Documentation for :ref:`virtual cluser statistics <config_http_filters_router_stats>`. |
@ -0,0 +1,84 @@ |
||||
.. _config_http_conn_man_route_table_vhost: |
||||
|
||||
Virtual host |
||||
============ |
||||
|
||||
The top level element in the routing configuration is a virtual host. Each virtual host has |
||||
a logical name as well as a set of domains that get routed to it based on the incoming request's |
||||
host header. This allows a single listener to service multiple top level domain path trees. Once a |
||||
virtual host is selected based on the domain, the routes are processed in order to see which |
||||
upstream cluster to route to or whether to perform a redirect. |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"name": "...", |
||||
"domains": [], |
||||
"routes": [], |
||||
"require_ssl": "...", |
||||
"virtual_clusters": [], |
||||
"rate_limits": [], |
||||
"request_headers_to_add": [] |
||||
} |
||||
|
||||
name |
||||
*(required, string)* The logical name of the virtual host. This is used when emitting certain |
||||
statistics but is not relevant for forwarding. By default, the maximum length of the name is |
||||
limited to 60 characters. This limit can be increased by setting the |
||||
:option:`--max-obj-name-len` command line argument to the desired value. |
||||
|
||||
domains |
||||
*(required, array)* A list of domains (host/authority header) that will be matched to this |
||||
virtual host. Wildcard hosts are supported in the form of "\*.foo.com" or "\*-bar.foo.com". |
||||
Note that the wildcard will not match the empty string. e.g. "\*-bar.foo.com" will match |
||||
"baz-bar.foo.com" but not "-bar.foo.com". Additionally, a special entry "\*" is allowed |
||||
which will match any host/authority header. Only a single virtual host in the entire route |
||||
configuration can match on "\*". A domain must be unique across all virtual hosts or the config |
||||
will fail to load. |
||||
|
||||
:ref:`routes <config_http_conn_man_route_table_route>` |
||||
*(required, array)* The list of routes that will be matched, in order, for incoming requests. |
||||
The first route that matches will be used. |
||||
|
||||
:ref:`cors <config_http_filters_cors>` |
||||
*(optional, object)* Specifies the virtual host's CORS policy. |
||||
|
||||
.. _config_http_conn_man_route_table_vhost_require_ssl: |
||||
|
||||
require_ssl |
||||
*(optional, string)* Specifies the type of TLS enforcement the virtual host expects. Possible |
||||
values are: |
||||
|
||||
all |
||||
All requests must use TLS. If a request is not using TLS, a 302 redirect will be sent telling |
||||
the client to use HTTPS. |
||||
|
||||
external_only |
||||
External requests must use TLS. If a request is external and it is not using TLS, a 302 redirect |
||||
will be sent telling the client to use HTTPS. |
||||
|
||||
If this option is not specified, there is no TLS requirement for the virtual host. |
||||
|
||||
:ref:`virtual_clusters <config_http_conn_man_route_table_vcluster>` |
||||
*(optional, array)* A list of virtual clusters defined for this virtual host. Virtual clusters |
||||
are used for additional statistics gathering. |
||||
|
||||
:ref:`rate_limits <config_http_conn_man_route_table_rate_limit_config>` |
||||
*(optional, array)* Specifies a set of rate limit configurations that will be applied to the |
||||
virtual host. |
||||
|
||||
.. _config_http_conn_man_route_table_vhost_add_req_headers: |
||||
|
||||
request_headers_to_add |
||||
*(optional, array)* Specifies a list of HTTP headers that should be added to each |
||||
request handled by this virtual host. Headers are specified in the following form: |
||||
|
||||
.. code-block:: json |
||||
|
||||
[ |
||||
{"key": "header1", "value": "value1"}, |
||||
{"key": "header2", "value": "value2"} |
||||
] |
||||
|
||||
*Note:* In the presence of duplicate header keys, |
||||
:ref:`precendence rules <config_http_conn_man_route_table_route_add_req_headers>` apply. |
@ -0,0 +1,25 @@ |
||||
.. _config_http_conn_man_runtime: |
||||
|
||||
Runtime |
||||
======= |
||||
|
||||
The HTTP connection manager supports the following runtime settings: |
||||
|
||||
.. _config_http_conn_man_runtime_client_enabled: |
||||
|
||||
tracing.client_enabled |
||||
% of requests that will be force traced if the |
||||
:ref:`config_http_conn_man_headers_x-client-trace-id` header is set. Defaults to 100. |
||||
|
||||
.. _config_http_conn_man_runtime_global_enabled: |
||||
|
||||
tracing.global_enabled |
||||
% of requests that will be traced after all other checks have been applied (force tracing, |
||||
sampling, etc.). Defaults to 100. |
||||
|
||||
.. _config_http_conn_man_runtime_random_sampling: |
||||
|
||||
tracing.random_sampling |
||||
% of requests that will be randomly traced. See :ref:`here <arch_overview_tracing>` for more |
||||
information. This runtime control is specified in the range 0-10000 and defaults to 10000. Thus, |
||||
trace sampling can be specified in 0.01% increments. |
@ -0,0 +1,85 @@ |
||||
.. _config_http_conn_man_stats: |
||||
|
||||
Statistics |
||||
========== |
||||
|
||||
Every connection manager has a statistics tree rooted at *http.<stat_prefix>.* with the following |
||||
statistics: |
||||
|
||||
.. csv-table:: |
||||
:header: Name, Type, Description |
||||
:widths: 1, 1, 2 |
||||
|
||||
downstream_cx_total, Counter, Total connections |
||||
downstream_cx_ssl_total, Counter, Total TLS connections |
||||
downstream_cx_http1_total, Counter, Total HTTP/1.1 connections |
||||
downstream_cx_websocket_total, Counter, Total WebSocket connections |
||||
downstream_cx_http2_total, Counter, Total HTTP/2 connections |
||||
downstream_cx_destroy, Counter, Total connections destroyed |
||||
downstream_cx_destroy_remote, Counter, Total connections destroyed due to remote close |
||||
downstream_cx_destroy_local, Counter, Total connections destroyed due to local close |
||||
downstream_cx_destroy_active_rq, Counter, Total connections destroyed with 1+ active request |
||||
downstream_cx_destroy_local_active_rq, Counter, Total connections destroyed locally with 1+ active request |
||||
downstream_cx_destroy_remote_active_rq, Counter, Total connections destroyed remotely with 1+ active request |
||||
downstream_cx_active, Gauge, Total active connections |
||||
downstream_cx_ssl_active, Gauge, Total active TLS connections |
||||
downstream_cx_http1_active, Gauge, Total active HTTP/1.1 connections |
||||
downstream_cx_websocket_active, Gauge, Total active WebSocket connections |
||||
downstream_cx_http2_active, Gauge, Total active HTTP/2 connections |
||||
downstream_cx_protocol_error, Counter, Total protocol errors |
||||
downstream_cx_length_ms, Histogram, Connection length milliseconds |
||||
downstream_cx_rx_bytes_total, Counter, Total bytes received |
||||
downstream_cx_rx_bytes_buffered, Gauge, Total received bytes currently buffered |
||||
downstream_cx_tx_bytes_total, Counter, Total bytes sent |
||||
downstream_cx_tx_bytes_buffered, Gauge, Total sent bytes currently buffered |
||||
downstream_cx_drain_close, Counter, Total connections closed due to draining |
||||
downstream_cx_idle_timeout, Counter, Total connections closed due to idle timeout |
||||
downstream_flow_control_paused_reading_total, Counter, Total number of times reads were disabled due to flow control |
||||
downstream_flow_control_resumed_reading_total, Counter, Total number of times reads were enabled on the connection due to flow control |
||||
downstream_rq_total, Counter, Total requests |
||||
downstream_rq_http1_total, Counter, Total HTTP/1.1 requests |
||||
downstream_rq_http2_total, Counter, Total HTTP/2 requests |
||||
downstream_rq_active, Gauge, Total active requests |
||||
downstream_rq_response_before_rq_complete, Counter, Total responses sent before the request was complete |
||||
downstream_rq_rx_reset, Counter, Total request resets received |
||||
downstream_rq_tx_reset, Counter, Total request resets sent |
||||
downstream_rq_non_relative_path, Counter, Total requests with a non-relative HTTP path |
||||
downstream_rq_too_large, Counter, Total requests resulting in a 413 due to buffering an overly large body. |
||||
downstream_rq_2xx, Counter, Total 2xx responses |
||||
downstream_rq_3xx, Counter, Total 3xx responses |
||||
downstream_rq_4xx, Counter, Total 4xx responses |
||||
downstream_rq_5xx, Counter, Total 5xx responses |
||||
downstream_rq_ws_on_non_ws_route, Counter, Total WebSocket upgrade requests rejected by non WebSocket routes |
||||
downstream_rq_time, Histogram, Request time milliseconds |
||||
rs_too_large, Counter, Total response errors due to buffering an overly large body. |
||||
|
||||
Per user agent statistics |
||||
------------------------- |
||||
|
||||
Additional per user agent statistics are rooted at *http.<stat_prefix>.user_agent.<user_agent>.* |
||||
Currently Envoy matches user agent for both iOS (*ios*) and Android (*android*) and produces |
||||
the following statistics: |
||||
|
||||
.. csv-table:: |
||||
:header: Name, Type, Description |
||||
:widths: 1, 1, 2 |
||||
|
||||
downstream_cx_total, Counter, Total connections |
||||
downstream_cx_destroy_remote_active_rq, Counter, Total connections destroyed remotely with 1+ active requests |
||||
downstream_rq_total, Counter, Total requests |
||||
|
||||
|
||||
Per listener statistics |
||||
----------------------- |
||||
|
||||
Additional per listener statistics are rooted at *listener.<address>.http.<stat_prefix>.* with the |
||||
following statistics: |
||||
|
||||
.. csv-table:: |
||||
:header: Name, Type, Description |
||||
:widths: 1, 1, 2 |
||||
|
||||
downstream_rq_2xx, Counter, Total 2xx responses |
||||
downstream_rq_3xx, Counter, Total 3xx responses |
||||
downstream_rq_4xx, Counter, Total 4xx responses |
||||
downstream_rq_5xx, Counter, Total 5xx responses |
@ -0,0 +1,23 @@ |
||||
.. _config_http_conn_man_tracing: |
||||
|
||||
Tracing |
||||
======= |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"tracing": { |
||||
"operation_name": "...", |
||||
"request_headers_for_tags": [] |
||||
} |
||||
} |
||||
|
||||
operation_name |
||||
*(required, string)* Span name will be derived from operation_name. "ingress" and "egress" |
||||
are the only supported values. |
||||
|
||||
request_headers_for_tags |
||||
*(optional, array)* A list of header names used to create tags for the active span. |
||||
The header name is used to populate the tag name, and the header value is used to populate the tag value. |
||||
The tag is created if the specified header name is present in the request's headers. |
||||
|
@ -0,0 +1,38 @@ |
||||
.. _config_http_filters_buffer: |
||||
|
||||
Buffer |
||||
====== |
||||
|
||||
The buffer filter is used to stop filter iteration and wait for a fully buffered complete request. |
||||
This is useful in different situations including protecting some applications from having to deal |
||||
with partial requests and high network latency. |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"name": "buffer", |
||||
"config": { |
||||
"max_request_bytes": "...", |
||||
"max_request_time_s": "..." |
||||
} |
||||
} |
||||
|
||||
max_request_bytes |
||||
*(required, integer)* The maximum request size that the filter will before the connection manager |
||||
will stop buffering and return a 413 response. |
||||
|
||||
max_request_time_s |
||||
*(required, integer)* The maximum amount of time that the filter will wait for a complete request |
||||
before returning a 408 response. |
||||
|
||||
Statistics |
||||
---------- |
||||
|
||||
The buffer filter outputs statistics in the *http.<stat_prefix>.buffer.* namespace. The :ref:`stat |
||||
prefix <config_http_conn_man_stat_prefix>` comes from the owning HTTP connection manager. |
||||
|
||||
.. csv-table:: |
||||
:header: Name, Type, Description |
||||
:widths: 1, 1, 2 |
||||
|
||||
rq_timeout, Counter, Total requests that timed out waiting for a full request |
@ -0,0 +1,65 @@ |
||||
.. _config_http_filters_cors: |
||||
|
||||
CORS filter |
||||
==================== |
||||
|
||||
This is a filter which handles Cross-Origin Resource Sharing requests based on route or virtual host settings. |
||||
For the meaning of the headers please refer to the pages below. |
||||
|
||||
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS |
||||
- https://www.w3.org/TR/cors/ |
||||
|
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"name": "cors", |
||||
"config": {} |
||||
} |
||||
|
||||
|
||||
Settings |
||||
-------- |
||||
|
||||
Settings on a route take precedence over settings on the virtual host. |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"cors": { |
||||
"enabled": false, |
||||
"allow_origin": ["http://foo.example"], |
||||
"allow_methods": "POST, GET, OPTIONS", |
||||
"allow_headers": "Content-Type", |
||||
"allow_credentials": false, |
||||
"expose_headers": "X-Custom-Header", |
||||
"max_age": "86400" |
||||
} |
||||
} |
||||
|
||||
enabled |
||||
*(optional, boolean)* Defaults to true. Setting *enabled* to false on a route disables CORS |
||||
for this route only. The setting has no effect on a virtual host. |
||||
|
||||
allow_origin |
||||
*(optional, array)* The origins that will be allowed to do CORS request. |
||||
Wildcard "\*" will allow any origin. |
||||
|
||||
allow_methods |
||||
*(optional, string)* The content for the *access-control-allow-methods* header. |
||||
Comma separated list of HTTP methods. |
||||
|
||||
allow_headers |
||||
*(optional, string)* The content for the *access-control-allow-headers* header. |
||||
Comma separated list of HTTP headers. |
||||
|
||||
allow_credentials |
||||
*(optional, boolean)* Whether the resource allows credentials. |
||||
|
||||
expose_headers |
||||
*(optional, string)* The content for the *access-control-expose-headers* header. |
||||
Comma separated list of HTTP headers. |
||||
|
||||
max_age |
||||
*(optional, string)* The content for the *access-control-max-age* header. |
||||
Value in seconds for how long the response to the preflight request can be cached. |
@ -0,0 +1,82 @@ |
||||
.. _config_http_filters_dynamo: |
||||
|
||||
DynamoDB |
||||
======== |
||||
|
||||
DynamoDB :ref:`architecture overview <arch_overview_dynamo>`. |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"name": "http_dynamo_filter", |
||||
"config": {} |
||||
} |
||||
|
||||
name |
||||
*(required, string)* Filter name. The only supported value is `http_dynamo_filter`. |
||||
|
||||
config |
||||
*(required, object)* The filter does not use any configuration. |
||||
|
||||
Statistics |
||||
---------- |
||||
|
||||
The DynamoDB filter outputs statistics in the *http.<stat_prefix>.dynamodb.* namespace. The |
||||
:ref:`stat prefix <config_http_conn_man_stat_prefix>` comes from the owning HTTP connection manager. |
||||
|
||||
Per operation stats can be found in the *http.<stat_prefix>.dynamodb.operation.<operation_name>.* |
||||
namespace. |
||||
|
||||
.. csv-table:: |
||||
:header: Name, Type, Description |
||||
:widths: 1, 1, 2 |
||||
|
||||
upstream_rq_total, Counter, Total number of requests with <operation_name> |
||||
upstream_rq_time, Histogram, Time spent on <operation_name> |
||||
upstream_rq_total_xxx, Counter, Total number of requests with <operation_name> per response code (503/2xx/etc) |
||||
upstream_rq_time_xxx, Histogram, Time spent on <operation_name> per response code (400/3xx/etc) |
||||
|
||||
Per table stats can be found in the *http.<stat_prefix>.dynamodb.table.<table_name>.* namespace. |
||||
Most of the operations to DynamoDB involve a single table, but BatchGetItem and BatchWriteItem can |
||||
include several tables, Envoy tracks per table stats in this case only if it is the same table used |
||||
in all operations from the batch. |
||||
|
||||
.. csv-table:: |
||||
:header: Name, Type, Description |
||||
:widths: 1, 1, 2 |
||||
|
||||
upstream_rq_total, Counter, Total number of requests on <table_name> table |
||||
upstream_rq_time, Histogram, Time spent on <table_name> table |
||||
upstream_rq_total_xxx, Counter, Total number of requests on <table_name> table per response code (503/2xx/etc) |
||||
upstream_rq_time_xxx, Histogram, Time spent on <table_name> table per response code (400/3xx/etc) |
||||
|
||||
*Disclaimer: Please note that this is a pre-release Amazon DynamoDB feature that is not yet widely available.* |
||||
Per partition and operation stats can be found in the *http.<stat_prefix>.dynamodb.table.<table_name>.* |
||||
namespace. For batch operations, Envoy tracks per partition and operation stats only if it is the same |
||||
table used in all operations. |
||||
|
||||
.. csv-table:: |
||||
:header: Name, Type, Description |
||||
:widths: 1, 1, 2 |
||||
|
||||
capacity.<operation_name>.__partition_id=<last_seven_characters_from_partition_id>, Counter, Total number of capacity for <operation_name> on <table_name> table for a given <partition_id> |
||||
|
||||
Additional detailed stats: |
||||
|
||||
* For 4xx responses and partial batch operation failures, the total number of failures for a given |
||||
table and failure are tracked in the *http.<stat_prefix>.dynamodb.error.<table_name>.* namespace. |
||||
|
||||
.. csv-table:: |
||||
:header: Name, Type, Description |
||||
:widths: 1, 1, 2 |
||||
|
||||
<error_type>, Counter, Total number of specific <error_type> for a given <table_name> |
||||
BatchFailureUnprocessedKeys, Counter, Total number of partial batch failures for a given <table_name> |
||||
|
||||
Runtime |
||||
------- |
||||
|
||||
The DynamoDB filter supports the following runtime settings: |
||||
|
||||
dynamodb.filter_enabled |
||||
The % of requests for which the filter is enabled. Default is 100%. |
@ -0,0 +1,177 @@ |
||||
.. _config_http_filters_fault_injection: |
||||
|
||||
Fault Injection |
||||
=============== |
||||
|
||||
The fault injection filter can be used to test the resiliency of |
||||
microservices to different forms of failures. The filter can be used to |
||||
inject delays and abort requests with user-specified error codes, thereby |
||||
providing the ability to stage different failure scenarios such as service |
||||
failures, service overloads, high network latency, network partitions, |
||||
etc. Faults injection can be limited to a specific set of requests based on |
||||
the (destination) upstream cluster of a request and/or a set of pre-defined |
||||
request headers. |
||||
|
||||
The scope of failures is restricted to those that are observable by an |
||||
application communicating over the network. CPU and disk failures on the |
||||
local host cannot be emulated. |
||||
|
||||
Currently, the fault injection filter has the following limitations: |
||||
|
||||
* Abort codes are restricted to HTTP status codes only |
||||
* Delays are restricted to fixed duration. |
||||
|
||||
Future versions will include support for restricting faults to specific |
||||
routes, injecting *gRPC* and *HTTP/2* specific error codes and delay |
||||
durations based on distributions. |
||||
|
||||
Configuration |
||||
------------- |
||||
|
||||
*Note: The fault injection filter must be inserted before any other filter, |
||||
including the router filter.* |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"name" : "fault", |
||||
"config" : { |
||||
"abort" : "{...}", |
||||
"delay" : "{...}", |
||||
"upstream_cluster" : "...", |
||||
"headers" : [], |
||||
"downstream_nodes": [] |
||||
} |
||||
} |
||||
|
||||
:ref:`abort <config_http_filters_fault_injection_abort>` |
||||
*(sometimes required, object)* If specified, the filter will abort requests based on |
||||
the values in the object. At least *abort* or *delay* must be specified. |
||||
|
||||
:ref:`delay <config_http_filters_fault_injection_delay>` |
||||
*(sometimes required, object)* If specified, the filter will inject delays based on the values |
||||
in the object. At least *abort* or *delay* must be specified. |
||||
|
||||
upstream_cluster: |
||||
*(optional, string)* Specifies the name of the (destination) upstream |
||||
cluster that the filter should match on. Fault injection will be |
||||
restricted to requests bound to the specific upstream cluster. |
||||
|
||||
:ref:`headers <config_http_conn_man_route_table_route_headers>` |
||||
*(optional, array)* Specifies a set of headers that the filter should match on. The fault |
||||
injection filter can be applied selectively to requests that match a set of headers specified in |
||||
the fault filter config. The chances of actual fault injection further depend on the values of |
||||
*abort_percent* and *fixed_delay_percent* parameters.The filter will check the request's headers |
||||
against all the specified headers in the filter config. A match will happen if all the headers in |
||||
the config are present in the request with the same values (or based on presence if the ``value`` |
||||
field is not in the config). |
||||
TODO: allow runtime configuration on per entry basis for headers match. |
||||
|
||||
downstream_nodes: |
||||
*(optional, array)* Faults are injected for the specified list of downstream hosts. If this setting is |
||||
not set, faults are injected for all downstream nodes. Downstream node name is taken from |
||||
:ref:`the HTTP x-envoy-downstream-service-node <config_http_conn_man_headers_downstream-service-node>` |
||||
header and compared against downstream_nodes list. |
||||
|
||||
The abort and delay blocks can be omitted. If they are not specified in the |
||||
configuration file, their respective values will be obtained from the |
||||
runtime. |
||||
|
||||
.. _config_http_filters_fault_injection_abort: |
||||
|
||||
Abort |
||||
----- |
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"abort_percent" : "...", |
||||
"http_status" : "..." |
||||
} |
||||
|
||||
abort_percent |
||||
*(required, integer)* The percentage of requests that |
||||
should be aborted with the specified *http_status* code. Valid values |
||||
range from 0 to 100. |
||||
|
||||
http_status |
||||
*(required, integer)* The HTTP status code that will be used as the |
||||
response code for the request being aborted. |
||||
|
||||
.. _config_http_filters_fault_injection_delay: |
||||
|
||||
Delay |
||||
----- |
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"type" : "...", |
||||
"fixed_delay_percent" : "...", |
||||
"fixed_duration_ms" : "..." |
||||
} |
||||
|
||||
type: |
||||
*(required, string)* Specifies the type of delay being |
||||
injected. Currently only *fixed* delay type (step function) is supported. |
||||
|
||||
fixed_delay_percent: |
||||
*(required, integer)* The percentage of requests that will |
||||
be delayed for the duration specified by *fixed_duration_ms*. Valid |
||||
values range from 0 to 100. |
||||
|
||||
fixed_duration_ms: |
||||
*(required, integer)* The delay duration in milliseconds. Must be greater than 0. |
||||
|
||||
Runtime |
||||
------- |
||||
|
||||
The HTTP fault injection filter supports the following global runtime settings: |
||||
|
||||
fault.http.abort.abort_percent |
||||
% of requests that will be aborted if the headers match. Defaults to the |
||||
*abort_percent* specified in config. If the config does not contain an |
||||
*abort* block, then *abort_percent* defaults to 0. |
||||
|
||||
fault.http.abort.http_status |
||||
HTTP status code that will be used as the of requests that will be |
||||
aborted if the headers match. Defaults to the HTTP status code specified |
||||
in the config. If the config does not contain an *abort* block, then |
||||
*http_status* defaults to 0. |
||||
|
||||
fault.http.delay.fixed_delay_percent |
||||
% of requests that will be delayed if the headers match. Defaults to the |
||||
*delay_percent* specified in the config or 0 otherwise. |
||||
|
||||
fault.http.delay.fixed_duration_ms |
||||
The delay duration in milliseconds. If not specified, the |
||||
*fixed_duration_ms* specified in the config will be used. If this field |
||||
is missing from both the runtime and the config, no delays will be |
||||
injected. |
||||
|
||||
*Note*, fault filter runtime settings for the specific downstream cluster |
||||
override the default ones if present. The following are downstream specific |
||||
runtime keys: |
||||
|
||||
* fault.http.<downstream-cluster>.abort.abort_percent |
||||
* fault.http.<downstream-cluster>.abort.http_status |
||||
* fault.http.<downstream-cluster>.delay.fixed_delay_percent |
||||
* fault.http.<downstream-cluster>.delay.fixed_duration_ms |
||||
|
||||
Downstream cluster name is taken from |
||||
:ref:`the HTTP x-envoy-downstream-service-cluster <config_http_conn_man_headers_downstream-service-cluster>` |
||||
header. If the following settings are not found in the runtime it defaults to the global runtime settings |
||||
which defaults to the config settings. |
||||
|
||||
Statistics |
||||
---------- |
||||
|
||||
The fault filter outputs statistics in the *http.<stat_prefix>.fault.* namespace. The :ref:`stat |
||||
prefix <config_http_conn_man_stat_prefix>` comes from the owning HTTP connection manager. |
||||
|
||||
.. csv-table:: |
||||
:header: Name, Type, Description |
||||
:widths: 1, 1, 2 |
||||
|
||||
delays_injected, Counter, Total requests that were delayed |
||||
aborts_injected, Counter, Total requests that were aborted |
||||
<downstream-cluster>.delays_injected, Counter, Total delayed requests for the given downstream cluster |
||||
<downstream-cluster>.aborts_injected, Counter, Total aborted requests for the given downstream cluster |
@ -0,0 +1,55 @@ |
||||
.. _config_http_filters_grpc_bridge: |
||||
|
||||
gRPC HTTP/1.1 bridge |
||||
==================== |
||||
|
||||
gRPC :ref:`architecture overview <arch_overview_grpc>`. |
||||
|
||||
This is a simple filter which enables the bridging of an HTTP/1.1 client which does not support |
||||
response trailers to a compliant gRPC server. It works by doing the following: |
||||
|
||||
* When a request is sent, the filter sees if the connection is HTTP/1.1 and the request content type |
||||
is *application/grpc*. |
||||
* If so, when the response is received, the filter buffers it and waits for trailers and then checks the |
||||
*grpc-status* code. If it is not zero, the filter switches the HTTP response code to 503. It also copies |
||||
the *grpc-status* and *grpc-message* trailers into the response headers so that the client can look |
||||
at them if it wishes. |
||||
* The client should send HTTP/1.1 requests that translate to the following psuedo headers: |
||||
|
||||
* *\:method*: POST |
||||
* *\:path*: <gRPC-METHOD-NAME> |
||||
* *content-type*: application/grpc |
||||
|
||||
* The body should be the serialized grpc body which is: |
||||
|
||||
* 1 byte of zero (not compressed). |
||||
* network order 4 bytes of proto message length. |
||||
* serialized proto message. |
||||
|
||||
* Because this scheme must buffer the response to look for the *grpc-status* trailer it will only |
||||
work with unary gRPC APIs. |
||||
|
||||
More info: http://www.grpc.io/docs/guides/wire.html |
||||
|
||||
This filter also collects stats for all gRPC requests that transit, even if those requests are |
||||
normal gRPC requests over HTTP/2. |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"name": "grpc_http1_bridge", |
||||
"config": {} |
||||
} |
||||
|
||||
Statistics |
||||
---------- |
||||
|
||||
The filter emits statistics in the *cluster.<route target cluster>.grpc.* namespace. |
||||
|
||||
.. csv-table:: |
||||
:header: Name, Type, Description |
||||
:widths: 1, 1, 2 |
||||
|
||||
<grpc service>.<grpc method>.success, Counter, Total successful service/method calls |
||||
<grpc service>.<grpc method>.failure, Counter, Total failed service/method calls |
||||
<grpc service>.<grpc method>.total, Counter, Total service/method calls |
@ -0,0 +1,85 @@ |
||||
.. _config_http_filters_grpc_json_transcoder: |
||||
|
||||
gRPC-JSON transcoder filter |
||||
=========================== |
||||
|
||||
gRPC :ref:`architecture overview <arch_overview_grpc>`. |
||||
|
||||
This is a filter which allows a RESTful JSON API client to send requests to Envoy over HTTP |
||||
and get proxied to a gRPC service. The HTTP mapping for the gRPC service has to be defined by |
||||
`custom options <https://cloud.google.com/service-management/reference/rpc/google.api#http>`_. |
||||
|
||||
Configure gRPC-JSON transcoder |
||||
------------------------------ |
||||
|
||||
The filter config for the filter requires the descriptor file as well as a list of the gRPC |
||||
services to be transcoded. |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"name": "grpc_json_transcoder", |
||||
"config": { |
||||
"proto_descriptor": "proto.pb", |
||||
"services": ["grpc.service.Service"], |
||||
"print_options": { |
||||
"add_whitespace": false, |
||||
"always_print_primitive_fields": false, |
||||
"always_print_enums_as_ints": false, |
||||
"preserve_proto_field_names": false |
||||
} |
||||
} |
||||
} |
||||
|
||||
proto_descriptor |
||||
*(required, string)* Supplies the binary protobuf descriptor set for the gRPC services. |
||||
The descriptor set has to include all of the types that are used in the services. Make sure |
||||
to use the ``--include_import`` option for ``protoc``. |
||||
|
||||
To generate a protobuf descriptor set for the gRPC service, you'll also need to clone the |
||||
googleapis repository from Github before running protoc, as you'll need annotations.proto |
||||
in your include path. |
||||
|
||||
.. code-block:: bash |
||||
|
||||
git clone https://github.com/googleapis/googleapis |
||||
GOOGLEAPIS_DIR=<your-local-googleapis-folder> |
||||
|
||||
Then run protoc to generate the descriptor set from bookstore.proto: |
||||
|
||||
.. code-block:: bash |
||||
|
||||
protoc -I$(GOOGLEAPIS_DIR) -I. --include_imports --include_source_info \ |
||||
--descriptor_set_out=proto.pb test/proto/bookstore.proto |
||||
|
||||
If you have more than one proto source files, you can pass all of them in one command. |
||||
|
||||
services |
||||
*(required, array)* A list of strings that supplies the service names that the |
||||
transcoder will translate. If the service name doesn't exist in ``proto_descriptor``, Envoy |
||||
will fail at startup. The ``proto_descriptor`` may contain more services than the service names |
||||
specified here, but they won't be translated. |
||||
|
||||
print_options |
||||
*(optional, object)* Control options for response json. These options are passed directly to |
||||
`JsonPrintOptions <https://developers.google.com/protocol-buffers/docs/reference/cpp/ |
||||
google.protobuf.util.json_util#JsonPrintOptions>`_. Valid options are: |
||||
|
||||
add_whitespace |
||||
*(optional, boolean)* Whether to add spaces, line breaks and indentation to make the JSON |
||||
output easy to read. Default to false. |
||||
|
||||
always_print_primitive_fields |
||||
*(optional, boolean)* Whether to always print primitive fields. By default primitive fields |
||||
with default values will be omitted in JSON output. For example, an int32 field set to 0 |
||||
will be omitted. Set this flag to true will override the default behavior and print primitive |
||||
fields regardless of their values. Default to false. |
||||
|
||||
always_print_enums_as_ints |
||||
*(optional, boolean)* Whether to always print enums as ints. By default they are rendered as |
||||
strings. Default to false. |
||||
|
||||
preserve_proto_field_names |
||||
*(optional, boolean)* Whether to preserve proto field names. By default protobuf will generate |
||||
JSON field names use ``json_name`` option, or lower camel case, in that order. Set this flag |
||||
will preserve original field names. Default to false. |
@ -0,0 +1,16 @@ |
||||
.. _config_http_filters_grpc_web: |
||||
|
||||
gRPC-Web filter |
||||
==================== |
||||
|
||||
gRPC :ref:`architecture overview <arch_overview_grpc>`. |
||||
|
||||
This is a filter which enables the bridging of a gRPC-Web client to a compliant gRPC server by |
||||
following https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-WEB.md. |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"name": "grpc_web", |
||||
"config": {} |
||||
} |
@ -0,0 +1,35 @@ |
||||
.. _config_http_filters_health_check: |
||||
|
||||
Health check |
||||
============ |
||||
|
||||
Health check filter :ref:`architecture overview <arch_overview_health_checking_filter>`. |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"name": "health_check", |
||||
"config": { |
||||
"pass_through_mode": "...", |
||||
"endpoint": "...", |
||||
"cache_time_ms": "...", |
||||
} |
||||
} |
||||
|
||||
Note that the filter will automatically fail health checks and set the |
||||
:ref:`x-envoy-immediate-health-check-fail |
||||
<config_http_filters_router_x-envoy-immediate-health-check-fail>` header if the |
||||
:ref:`/healthcheck/fail <operations_admin_interface_healthcheck_fail>` admin endpoint has been |
||||
called. (The :ref:`/healthcheck/ok <operations_admin_interface_healthcheck_ok>` admin endpoint |
||||
reverses this behavior). |
||||
|
||||
pass_through_mode |
||||
*(required, boolean)* Specifies whether the filter operates in pass through mode or not. |
||||
|
||||
endpoint |
||||
*(required, string)* Specifies the incoming HTTP endpoint that should be considered the |
||||
health check endpoint. For example */healthcheck*. |
||||
|
||||
cache_time_ms |
||||
*(optional, integer)* If operating in pass through mode, the amount of time in milliseconds that |
||||
the filter should cache the upstream response. |
@ -0,0 +1,20 @@ |
||||
.. _config_http_filters: |
||||
|
||||
HTTP filters |
||||
============ |
||||
|
||||
.. toctree:: |
||||
:maxdepth: 2 |
||||
|
||||
buffer_filter |
||||
cors_filter |
||||
fault_filter |
||||
dynamodb_filter |
||||
grpc_http1_bridge_filter |
||||
grpc_json_transcoder_filter |
||||
grpc_web_filter |
||||
health_check_filter |
||||
ip_tagging_filter |
||||
rate_limit_filter |
||||
router_filter |
||||
lua_filter |
@ -0,0 +1,47 @@ |
||||
.. _config_http_filters_ip_tagging: |
||||
|
||||
Ip tagging filter |
||||
==================== |
||||
|
||||
This is an HTTP filter which enables Envoy to tag requests with extra information such as location, cloud source, and any |
||||
extra data. This is useful to prevent against DDoS. |
||||
|
||||
**Note**: this filter is under active development, and currently does not perform any tagging on requests. In other |
||||
words, installing this filter is a no-op in the filter chain. |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"name": "ip_tagging", |
||||
"config": { |
||||
"request_type": "...", |
||||
"ip_tags": [] |
||||
} |
||||
} |
||||
|
||||
request_type |
||||
*(optional, string)* The type of requests the filter should apply to. The supported |
||||
types are *internal*, *external* or *both*. A request is considered internal if |
||||
:ref:`x-envoy-internal<config_http_conn_man_headers_x-envoy-internal>` is set to true. If |
||||
:ref:`x-envoy-internal<config_http_conn_man_headers_x-envoy-internal>` is not set or false, a |
||||
request is considered external. The filter defaults to *both*, and it will apply to all request |
||||
types. |
||||
|
||||
ip_tags: |
||||
*(optional, array)* Specifies the list of ip tags to set for a request. |
||||
|
||||
Ip tags |
||||
------- |
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"ip_tag_name": "...", |
||||
"ip_list": [] |
||||
} |
||||
|
||||
ip_tag_name: |
||||
*(required, string)* Specifies the ip tag name to apply. |
||||
|
||||
ip_list: |
||||
*(required, list of strings)* A list of IP address and subnet masks that will be tagged with the ``ip_tag_name``. Both |
||||
IPv4 and IPv6 CIDR addresses are allowed here. |
@ -0,0 +1,353 @@ |
||||
.. _config_http_filters_lua: |
||||
|
||||
Lua |
||||
=== |
||||
|
||||
.. attention:: |
||||
|
||||
The Lua scripting HTTP filter is **experimental**. Use in production at your own risk. It is |
||||
being released for initial feedback on the exposed API and for further development, testing, |
||||
and verification. This warning will be removed when we feel that the filter has received enough |
||||
testing and API stability to call it generally production ready. |
||||
|
||||
Overview |
||||
-------- |
||||
|
||||
The HTTP Lua filter allows `Lua <https://www.lua.org/>`_ scripts to be run during both the request |
||||
and response flows. `LuaJIT <http://luajit.org/>`_ is used as the runtime. Because of this, the |
||||
supported Lua version is mostly 5.1 with some 5.2 features. See the `LuaJIT documentation |
||||
<http://luajit.org/extensions.html>`_ for more details. |
||||
|
||||
The filter only supports loading Lua code in-line in the configuration. If local filesystem code |
||||
is desired, a trivial in-line script can be used to load the rest of the code from the local |
||||
environment. |
||||
|
||||
The design of the filter and Lua support at a high level is as follows: |
||||
|
||||
* All Lua environments are :ref:`per worker thread <arch_overview_threading>`. This means that |
||||
there is no truly global data. Any globals create and populated at load time will be visible |
||||
from each worker thread in isolation. True global support may be added via an API in the future. |
||||
* All scripts are run as coroutines. This means that they are written in a synchronous style even |
||||
though they may perform complex asynchronous tasks. This makes the scripts substantially easier |
||||
to write. All network/async processing is performed by Envoy via a set of APIs. Envoy will |
||||
yield the script as appropriate and resume it when async tasks are complete. |
||||
* **Do not perform blocking operations from scripts.** It is critical for performance that |
||||
Envoy APIs are used for all IO. |
||||
|
||||
Currently supported high level features |
||||
--------------------------------------- |
||||
|
||||
**NOTE:** It is expected that this list will expand over time as the filter is used in production. |
||||
The API surface has been kept small on purpose. The goal is to make scripts extremely simple and |
||||
safe to write. Very complex or high performance use cases are assumed to use the native C++ filter |
||||
API. |
||||
|
||||
* Inspection of headers, body, and trailers while streaming in either the request flow, response |
||||
flow, or both. |
||||
* Modification of headers and trailers. |
||||
* Blocking and buffering the full request/response body for inspection. |
||||
* Performing an outbound async HTTP call to an upstream host. Such a call can be performed while |
||||
buffering body data so that when the call completes upstream headers can be modified. |
||||
* Performing a direct response and skipping further filter iteration. For example, a script |
||||
could make an upstream HTTP call for authentication, and then directly respond with a 403 |
||||
response code. |
||||
|
||||
Configuration |
||||
------------- |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"name": "lua", |
||||
"config": { |
||||
"inline_code": "..." |
||||
} |
||||
} |
||||
|
||||
inline_code |
||||
*(required, string)* The Lua code that Envoy will execute. This can be a very small script that |
||||
further loads code from disk if desired. Note that if JSON configuration is used, the code must |
||||
be properly escaped. YAML configuration may be easier to read since YAML supports multi-line |
||||
strings so complex scripts can be easily expressed inline in the configuration. |
||||
|
||||
Script examples |
||||
--------------- |
||||
|
||||
This section provides some concrete examples of Lua scripts as a more gentle introduction and quick |
||||
start. Please refer to the :ref:`stream handle API <config_http_filters_lua_stream_handle_api>` for |
||||
more details on the supported API. |
||||
|
||||
.. code-block:: lua |
||||
|
||||
-- Called on the request path. |
||||
function envoy_on_request(request_handle) |
||||
-- Wait for the entire request body and add a request header with the body size. |
||||
request_handle:headers():add("request_body_size", request_handle:body():length()) |
||||
end |
||||
|
||||
-- Called on the response path. |
||||
function envoy_on_response(response_handle) |
||||
-- Wait for the entire response body and a response header with the the body size. |
||||
response_handle:headers():add("response_body_size", response_handle:body():length()) |
||||
-- Remove a response header named 'foo' |
||||
response_handle:headers():remove("foo") |
||||
end |
||||
|
||||
.. code-block:: lua |
||||
|
||||
function envoy_on_request(request_handle) |
||||
-- Make an HTTP call to an upstream host with the following headers, body, and timeout. |
||||
local headers, body = request_handle:httpCall( |
||||
"lua_cluster", |
||||
{ |
||||
[":method"] = "POST", |
||||
[":path"] = "/", |
||||
[":authority"] = "lua_cluster" |
||||
}, |
||||
"hello world", |
||||
5000) |
||||
|
||||
-- Add information from the HTTP call into the headers that are about to be sent to the next |
||||
-- filter in the filter chain. |
||||
request_handle:headers():add("upstream_foo", headers["foo"]) |
||||
request_handle:headers():add("upstream_body_size", #body) |
||||
end |
||||
|
||||
.. code-block:: lua |
||||
|
||||
function envoy_on_request(request_handle) |
||||
-- Make an HTTP call. |
||||
local headers, body = request_handle:httpCall( |
||||
"lua_cluster", |
||||
{ |
||||
[":method"] = "POST", |
||||
[":path"] = "/", |
||||
[":authority"] = "lua_cluster" |
||||
}, |
||||
"hello world", |
||||
5000) |
||||
|
||||
-- Response directly and set a header from the HTTP call. No further filter iteration |
||||
-- occurs. |
||||
request_handle:respond( |
||||
{[":status"] = "403", |
||||
["upstream_foo"] = headers["foo"]}, |
||||
"nope") |
||||
end |
||||
|
||||
.. _config_http_filters_lua_stream_handle_api: |
||||
|
||||
Stream handle API |
||||
----------------- |
||||
|
||||
When Envoy loads the script in the configuration, it looks for two global functions that the |
||||
script defines: |
||||
|
||||
.. code-block:: lua |
||||
|
||||
function envoy_on_request(request_handle) |
||||
end |
||||
|
||||
function envoy_on_response(response_handle) |
||||
end |
||||
|
||||
A script can define either or both of these functions. During the request path, Envoy will |
||||
run *envoy_on_request* as a coroutine, passing an API handle. During the response path, Envoy will |
||||
run *envoy_on_response* as a coroutine, passing an API handle. |
||||
|
||||
.. attention:: |
||||
|
||||
It is critical that all interaction with Envoy occur through the passed stream handle. The stream |
||||
handle should not be assigned to any global variable and should not be used outside of the |
||||
coroutine. Envoy will fail your script if the handle is used incorrectly. |
||||
|
||||
The following methods on the stream handle are supported: |
||||
|
||||
headers() |
||||
^^^^^^^^^ |
||||
|
||||
.. code-block:: lua |
||||
|
||||
headers = handle:headers() |
||||
|
||||
Returns the stream's headers. The headers can be modified as long as they have not been sent to |
||||
the next filter in the header chain. For example, they can be modified after an *httpCall()* or |
||||
after a *body()* call returns. The script will fail if the headers are modified in any other |
||||
situation. |
||||
|
||||
Returns a :ref:`header object <config_http_filters_lua_header_wrapper>`. |
||||
|
||||
body() |
||||
^^^^^^ |
||||
|
||||
.. code-block:: lua |
||||
|
||||
body = handle:body() |
||||
|
||||
Returns the stream's body. This call will cause Envoy to yield the script until the entire body |
||||
has been buffered. Note that all buffering must adhere to the flow control policies in place. |
||||
Envoy will not buffer more data than is allowed by the connection manager. |
||||
|
||||
Returns a :ref:`buffer object <config_http_filters_lua_buffer_wrapper>`. |
||||
|
||||
bodyChunks() |
||||
^^^^^^^^^^^^ |
||||
|
||||
.. code-block:: lua |
||||
|
||||
iterator = handle:bodyChunks() |
||||
|
||||
Returns an iterator that can be used to iterate through all received body chunks as they arrive. |
||||
Envoy will yield the script in between chunks, but *will not buffer* them. This can be used by |
||||
a script to inspect data as it is streaming by. |
||||
|
||||
.. code-block:: lua |
||||
|
||||
for chunk in request_handle:bodyChunks() do |
||||
request_handle:log(0, chunk:length()) |
||||
end |
||||
|
||||
Each chunk the iterator returns is a :ref:`buffer object <config_http_filters_lua_buffer_wrapper>`. |
||||
|
||||
trailers() |
||||
^^^^^^^^^^ |
||||
|
||||
.. code-block:: lua |
||||
|
||||
trailers = handle:trailers() |
||||
|
||||
Returns the stream's trailers. May return nil if there are no trailers. The trailers may be |
||||
modified before they are sent to the next filter. |
||||
|
||||
Returns a :ref:`header object <config_http_filters_lua_header_wrapper>`. |
||||
|
||||
log*() |
||||
^^^^^^ |
||||
|
||||
.. code-block:: lua |
||||
|
||||
handle:logTrace(message) |
||||
handle:logDebug(message) |
||||
handle:logInfo(message) |
||||
handle:logWarn(message) |
||||
handle:logErr(message) |
||||
handle:logCritical(message) |
||||
|
||||
Logs a message using Envoy's application logging. *message* is a string to log. |
||||
|
||||
httpCall() |
||||
^^^^^^^^^^ |
||||
|
||||
.. code-block:: lua |
||||
|
||||
headers, body = handle:httpCall(cluster, headers, body, timeout) |
||||
|
||||
Makes an HTTP call to an upstream host. Envoy will yield the script until the call completes or |
||||
has an error. *cluster* is a string which maps to a configured cluster manager cluster. *headers* |
||||
is a table of key/value pairs to send. Note that the *:method*, *:path*, and *:authority* headers |
||||
must be set. *body* is an optional string of body data to send. *timeout* is an integer that |
||||
specifies the call timeout in milliseconds. |
||||
|
||||
Returns *headers* which is a table of response headers. Returns *body* which is the string response |
||||
body. May be nil if there is no body. |
||||
|
||||
respond() |
||||
^^^^^^^^^^ |
||||
|
||||
.. code-block:: lua |
||||
|
||||
handle:respond(headers, body) |
||||
|
||||
Respond immediately and do not continue further filter iteration. This call is *only valid in |
||||
the request flow*. Additionally, a response is only possible if request headers have not yet been |
||||
passed to subsequent filters. Meaning, the following Lua code is invalid: |
||||
|
||||
.. code-block:: lua |
||||
|
||||
function envoy_on_request(request_handle) |
||||
for chunk in request_handle:bodyChunks() do |
||||
request_handle:respond( |
||||
{[":status"] = "100"}, |
||||
"nope") |
||||
end |
||||
end |
||||
|
||||
*headers* is a table of key/value pairs to send. Note that the *:status* header |
||||
must be set. *body* is a string and supplies the optional response body. May be nil. |
||||
|
||||
.. _config_http_filters_lua_header_wrapper: |
||||
|
||||
Header object API |
||||
----------------- |
||||
|
||||
add() |
||||
^^^^^ |
||||
|
||||
.. code-block:: lua |
||||
|
||||
headers:add(key, value) |
||||
|
||||
Adds a header. *key* is a string that supplies the header key. *value* is a string that supplies |
||||
the header value. |
||||
|
||||
get() |
||||
^^^^^ |
||||
|
||||
.. code-block:: lua |
||||
|
||||
headers:get(key) |
||||
|
||||
Gets a header. *key* is a string that suplies the header key. Returns a string that is the header |
||||
value or nil if there is no such header. |
||||
|
||||
__pairs() |
||||
^^^^^^^^^ |
||||
|
||||
.. code-block:: lua |
||||
|
||||
for key, value in pairs(headers) do |
||||
end |
||||
|
||||
Iterates through every header. *key* is a string that supplies the header key. *value* is a string |
||||
that supplies the header value. |
||||
|
||||
.. attention:: |
||||
|
||||
In the currently implementation, headers cannot be modified during iteration. Additionally, if |
||||
it is desired to modify headers after iteration, the iteration must be completed. Meaning, do |
||||
not use `break` or any other mechanism to exit the loop early. This may be relaxed in the future. |
||||
|
||||
remove() |
||||
^^^^^^^^ |
||||
|
||||
.. code-block:: lua |
||||
|
||||
headers:remove(key) |
||||
|
||||
Removes a header. *key* supplies the header key to remove. |
||||
|
||||
.. _config_http_filters_lua_buffer_wrapper: |
||||
|
||||
Buffer API |
||||
---------- |
||||
|
||||
length() |
||||
^^^^^^^^^^ |
||||
|
||||
.. code-block:: lua |
||||
|
||||
size = buffer:length() |
||||
|
||||
Gets the size of the buffer in bytes. Returns an integer. |
||||
|
||||
getBytes() |
||||
^^^^^^^^^^ |
||||
|
||||
.. code-block:: lua |
||||
|
||||
buffer:getBytes(index, length) |
||||
|
||||
Get bytes from the buffer. By default Envoy will not copy all buffer bytes to Lua. This will |
||||
cause a buffer segment to be copied. *index* is an integer and supplies the buffer start index to |
||||
copy. *length* is an integer and supplies the buffer length to copy. *index* + *length* must be |
||||
less than the buffer length. |
@ -0,0 +1,79 @@ |
||||
.. _config_http_filters_rate_limit: |
||||
|
||||
Rate limit |
||||
========== |
||||
|
||||
Global rate limiting :ref:`architecture overview <arch_overview_rate_limit>`. |
||||
|
||||
The HTTP rate limit filter will call the rate limit service when the request's route or virtual host |
||||
has one or more :ref:`rate limit configurations<config_http_conn_man_route_table_route_rate_limits>` |
||||
that match the filter stage setting. The :ref:`route<config_http_conn_man_route_table_route_include_vh>` |
||||
can optionally include the virtual host rate limit configurations. More than one configuration can |
||||
apply to a request. Each configuration results in a descriptor being sent to the rate limit service. |
||||
|
||||
If the rate limit service is called, and the response for any of the descriptors is over limit, a |
||||
429 response is returned. |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"name": "rate_limit", |
||||
"config": { |
||||
"domain": "...", |
||||
"stage": "...", |
||||
"request_type": "...", |
||||
"timeout_ms": "..." |
||||
} |
||||
} |
||||
|
||||
domain |
||||
*(required, string)* The rate limit domain to use when calling the rate limit service. |
||||
|
||||
stage |
||||
*(optional, integer)* Specifies the rate limit configurations to be applied with the same stage |
||||
number. If not set, the default stage number is 0. |
||||
|
||||
**NOTE:** The filter supports a range of 0 - 10 inclusively for stage numbers. |
||||
|
||||
request_type |
||||
*(optional, string)* The type of requests the filter should apply to. The supported |
||||
types are *internal*, *external* or *both*. A request is considered internal if |
||||
:ref:`x-envoy-internal<config_http_conn_man_headers_x-envoy-internal>` is set to true. If |
||||
:ref:`x-envoy-internal<config_http_conn_man_headers_x-envoy-internal>` is not set or false, a |
||||
request is considered external. The filter defaults to *both*, and it will apply to all request |
||||
types. |
||||
|
||||
timeout_ms |
||||
*(optional, integer)* The timeout in milliseconds for the rate limit service RPC. If not set, |
||||
this defaults to 20ms. |
||||
|
||||
Statistics |
||||
---------- |
||||
|
||||
The buffer filter outputs statistics in the *cluster.<route target cluster>.ratelimit.* namespace. |
||||
429 responses are emitted to the normal cluster :ref:`dynamic HTTP statistics |
||||
<config_cluster_manager_cluster_stats_dynamic_http>`. |
||||
|
||||
.. csv-table:: |
||||
:header: Name, Type, Description |
||||
:widths: 1, 1, 2 |
||||
|
||||
ok, Counter, Total under limit responses from the rate limit service |
||||
error, Counter, Total errors contacting the rate limit service |
||||
over_limit, Counter, total over limit responses from the rate limit service |
||||
|
||||
Runtime |
||||
------- |
||||
|
||||
The HTTP rate limit filter supports the following runtime settings: |
||||
|
||||
ratelimit.http_filter_enabled |
||||
% of requests that will call the rate limit service. Defaults to 100. |
||||
|
||||
ratelimit.http_filter_enforcing |
||||
% of requests that will call the rate limit service and enforce the decision. Defaults to 100. |
||||
This can be used to test what would happen before fully enforcing the outcome. |
||||
|
||||
ratelimit.<route_key>.http_filter_enabled |
||||
% of requests that will call the rate limit service for a given *route_key* specified in the |
||||
:ref:`rate limit configuration <config_http_conn_man_route_table_rate_limit_config>`. Defaults to 100. |
@ -0,0 +1,307 @@ |
||||
.. _config_http_filters_router: |
||||
|
||||
Router |
||||
====== |
||||
|
||||
The router filter implements HTTP forwarding. It will be used in almost all HTTP proxy scenarios |
||||
that Envoy is deployed for. The filter's main job is to follow the instructions specified in the |
||||
configured :ref:`route table <config_http_conn_man_route_table>`. In addition to forwarding and |
||||
redirection, the filter also handles retry, statistics, etc. |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"name": "router", |
||||
"config": { |
||||
"dynamic_stats": "...", |
||||
"start_child_span": "..." |
||||
} |
||||
} |
||||
|
||||
dynamic_stats |
||||
*(optional, boolean)* Whether the router generates :ref:`dynamic cluster statistics |
||||
<config_cluster_manager_cluster_stats_dynamic_http>`. Defaults to *true*. Can be disabled in high |
||||
performance scenarios. |
||||
|
||||
.. _config_http_filters_router_start_child_span: |
||||
|
||||
start_child_span |
||||
*(optional, boolean)* Whether to start a child :ref:`tracing <arch_overview_tracing>` span for |
||||
egress routed calls. This can be useful in scenarios where other filters (auth, ratelimit, etc.) |
||||
make outbound calls and have child spans rooted at the same ingress parent. Defaults to *false*. |
||||
|
||||
.. _config_http_filters_router_headers: |
||||
|
||||
HTTP headers |
||||
------------ |
||||
|
||||
The router consumes and sets various HTTP headers both on the egress/request path as well as on the |
||||
ingress/response path. They are documented in this section. |
||||
|
||||
.. contents:: |
||||
:local: |
||||
|
||||
.. _config_http_filters_router_x-envoy-expected-rq-timeout-ms: |
||||
|
||||
x-envoy-expected-rq-timeout-ms |
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
||||
|
||||
This is the time in milliseconds the router expects the request to be completed. Envoy sets this |
||||
header so that the upstream host receiving the request can make decisions based on the request |
||||
timeout, e.g., early exit. This is set on internal requests and is either taken from the |
||||
:ref:`config_http_filters_router_x-envoy-upstream-rq-timeout-ms` header or the :ref:`route timeout |
||||
<config_http_conn_man_route_table_route_timeout>`, in that order. |
||||
|
||||
.. _config_http_filters_router_x-envoy-max-retries: |
||||
|
||||
x-envoy-max-retries |
||||
^^^^^^^^^^^^^^^^^^^ |
||||
|
||||
If a :ref:`retry policy <config_http_conn_man_route_table_route_retry>` is in place, Envoy will default to retrying one |
||||
time unless explicitly specified. The number of retries can be explicitly set in the |
||||
:ref:`route retry config <config_http_conn_man_route_table_route_retry>` or by using this header. |
||||
If a :ref:`retry policy <config_http_conn_man_route_table_route_retry>` is not configured and |
||||
:ref:`config_http_filters_router_x-envoy-retry-on` or |
||||
:ref:`config_http_filters_router_x-envoy-retry-grpc-on` headers are not specified, Envoy will not retry a failed request. |
||||
|
||||
A few notes on how Envoy does retries: |
||||
|
||||
* The route timeout (set via :ref:`config_http_filters_router_x-envoy-upstream-rq-timeout-ms` or the |
||||
:ref:`route configuration <config_http_conn_man_route_table_route_timeout>`) **includes** all |
||||
retries. Thus if the request timeout is set to 3s, and the first request attempt takes 2.7s, the |
||||
retry (including backoff) has .3s to complete. This is by design to avoid an exponential |
||||
retry/timeout explosion. |
||||
* Envoy uses a fully jittered exponential backoff algorithm for retries with a base time of 25ms. |
||||
The first retry will be delayed randomly between 0-24ms, the 2nd between 0-74ms, the 3rd between |
||||
0-174ms and so on. |
||||
* If max retries is set both by header as well as in the route configuration, the maximum value is |
||||
taken when determining the max retries to use for the request. |
||||
|
||||
.. _config_http_filters_router_x-envoy-retry-on: |
||||
|
||||
x-envoy-retry-on |
||||
^^^^^^^^^^^^^^^^ |
||||
|
||||
Setting this header on egress requests will cause Envoy to attempt to retry failed requests (number |
||||
of retries defaults to 1 and can be controlled by :ref:`x-envoy-max-retries <config_http_filters_router_x-envoy-max-retries>` |
||||
header or the :ref:`route config retry policy <config_http_conn_man_route_table_route_retry>`). The |
||||
value to which the x-envoy-retry-on header is set indicates the retry policy. One or more policies can be specified |
||||
using a ',' delimited list. The supported policies are: |
||||
|
||||
5xx |
||||
Envoy will attempt a retry if the upstream server responds with any 5xx response code, or does not |
||||
respond at all (disconnect/reset/read timeout). (Includes *connect-failure* and *refused-stream*) |
||||
|
||||
* **NOTE:** Envoy will not retry when a request exceeds |
||||
:ref:`config_http_filters_router_x-envoy-upstream-rq-timeout-ms` (resulting in a 504 error |
||||
code). Use :ref:`config_http_filters_router_x-envoy-upstream-rq-per-try-timeout-ms` if you want |
||||
to retry when individual attempts take too long. |
||||
:ref:`config_http_filters_router_x-envoy-upstream-rq-timeout-ms` is an outer time limit for a |
||||
request, including any retries that take place. |
||||
|
||||
connect-failure |
||||
Envoy will attempt a retry if a request is failed because of a connection failure to the upstream |
||||
server (connect timeout, etc.). (Included in *5xx*) |
||||
|
||||
* **NOTE:** A connection failure/timeout is a the TCP level, not the request level. This does not |
||||
include upstream request timeouts specified via |
||||
:ref:`config_http_filters_router_x-envoy-upstream-rq-timeout-ms` or via :ref:`route |
||||
configuration <config_http_conn_man_route_table_route_retry>`. |
||||
|
||||
retriable-4xx |
||||
Envoy will attempt a retry if the upstream server responds with a retriable 4xx response code. |
||||
Currently, the only response code in this category is 409. |
||||
|
||||
* **NOTE:** Be careful turning on this retry type. There are certain cases where a 409 can indicate |
||||
that an optimistic locking revision needs to be updated. Thus, the caller should not retry and |
||||
needs to read then attempt another write. If a retry happens in this type of case it will always |
||||
fail with another 409. |
||||
|
||||
refused-stream |
||||
Envoy will attempt a retry if the upstream server resets the stream with a REFUSED_STREAM error |
||||
code. This reset type indicates that a request is safe to retry. (Included in *5xx*) |
||||
|
||||
The number of retries can be controlled via the |
||||
:ref:`config_http_filters_router_x-envoy-max-retries` header or via the :ref:`route |
||||
configuration <config_http_conn_man_route_table_route_retry>`. |
||||
|
||||
Note that retry policies can also be applied at the :ref:`route level |
||||
<config_http_conn_man_route_table_route_retry>`. |
||||
|
||||
By default, Envoy will *not* perform retries unless you've configured them per above. |
||||
|
||||
.. _config_http_filters_router_x-envoy-retry-grpc-on: |
||||
|
||||
x-envoy-retry-grpc-on |
||||
^^^^^^^^^^^^^^^^^^^^^ |
||||
Setting this header on egress requests will cause Envoy to attempt to retry failed requests (number of |
||||
retries defaults to 1, and can be controlled by |
||||
:ref:`x-envoy-max-retries <config_http_filters_router_x-envoy-max-retries>` |
||||
header or the :ref:`route config retry policy <config_http_conn_man_route_table_route_retry>`). |
||||
gRPC retries are currently only supported for gRPC status codes in response headers. gRPC status codes in |
||||
trailers will not trigger retry logic. One or more policies can be specified using a ',' delimited |
||||
list. The supported policies are: |
||||
|
||||
cancelled |
||||
Envoy will attempt a retry if the gRPC status code in the response headers is "cancelled" (1) |
||||
|
||||
deadline-exceeded |
||||
Envoy will attempt a retry if the gRPC status code in the response headers is "deadline-exceeded" (4) |
||||
|
||||
resource-exhausted |
||||
Envoy will attempt a retry if the gRPC status code in the response headers is "resource-exhausted" (8) |
||||
|
||||
As with the x-envoy-retry-grpc-on header, the number of retries can be controlled via the |
||||
:ref:`config_http_filters_router_x-envoy-max-retries` header |
||||
|
||||
Note that retry policies can also be applied at the :ref:`route level |
||||
<config_http_conn_man_route_table_route_retry>`. |
||||
|
||||
By default, Envoy will *not* perform retries unless you've configured them per above. |
||||
|
||||
.. _config_http_filters_router_x-envoy-upstream-alt-stat-name: |
||||
|
||||
x-envoy-upstream-alt-stat-name |
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
||||
|
||||
Setting this header on egress requests will cause Envoy to emit upstream response code/timing |
||||
statistics to a dual stat tree. This can be useful for application level categories that Envoy |
||||
doesn't know about. The output tree is documented :ref:`here |
||||
<config_cluster_manager_cluster_stats_alt_tree>`. |
||||
|
||||
x-envoy-upstream-canary |
||||
^^^^^^^^^^^^^^^^^^^^^^^ |
||||
|
||||
If an upstream host sets this header, the router will use it to generate canary specific statistics. |
||||
The output tree is documented :ref:`here <config_cluster_manager_cluster_stats_dynamic_http>`. |
||||
|
||||
.. _config_http_filters_router_x-envoy-upstream-rq-timeout-alt-response: |
||||
|
||||
x-envoy-upstream-rq-timeout-alt-response |
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
||||
|
||||
Setting this header on egress requests will cause Envoy to set a 204 response code (instead of 504) |
||||
in the event of a request timeout. The actual value of the header is ignored; only its presence |
||||
is considered. See also :ref:`config_http_filters_router_x-envoy-upstream-rq-timeout-ms`. |
||||
|
||||
.. _config_http_filters_router_x-envoy-upstream-rq-timeout-ms: |
||||
|
||||
x-envoy-upstream-rq-timeout-ms |
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
||||
|
||||
Setting this header on egress requests will cause Envoy to override the :ref:`route configuration |
||||
<config_http_conn_man_route_table_route_timeout>`. The timeout must be specified in millisecond |
||||
units. See also :ref:`config_http_filters_router_x-envoy-upstream-rq-per-try-timeout-ms`. |
||||
|
||||
.. _config_http_filters_router_x-envoy-upstream-rq-per-try-timeout-ms: |
||||
|
||||
x-envoy-upstream-rq-per-try-timeout-ms |
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
||||
|
||||
Setting this header on egress requests will cause Envoy to set a *per try* timeout on routed |
||||
requests. This timeout must be <= the global route timeout (see |
||||
:ref:`config_http_filters_router_x-envoy-upstream-rq-timeout-ms`) or it is ignored. This allows a |
||||
caller to set a tight per try timeout to allow for retries while maintaining a reasonable overall |
||||
timeout. |
||||
|
||||
x-envoy-upstream-service-time |
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
||||
|
||||
Contains the time in milliseconds spent by the upstream host processing the request. This is useful |
||||
if the client wants to determine service time compared to network latency. This header is set on |
||||
responses. |
||||
|
||||
.. _config_http_filters_router_x-envoy-original-path: |
||||
|
||||
x-envoy-original-path |
||||
^^^^^^^^^^^^^^^^^^^^^ |
||||
|
||||
If the route utilizes :ref:`prefix_rewrite <config_http_conn_man_route_table_route_prefix_rewrite>`, |
||||
Envoy will put the original path header in this header. This can be useful for logging and |
||||
debugging. |
||||
|
||||
.. _config_http_filters_router_x-envoy-immediate-health-check-fail: |
||||
|
||||
x-envoy-immediate-health-check-fail |
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
||||
|
||||
If the upstream host returns this header (set to any value), Envoy will immediately assume the |
||||
upstream host has failed :ref:`active health checking <arch_overview_health_checking>` (if the |
||||
cluster has been :ref:`configured <config_cluster_manager_cluster_hc>` for active health checking). |
||||
This can be used to fast fail an upstream host via standard data plane processing without waiting |
||||
for the next health check interval. The host can become healthy again via standard active health |
||||
checks. See the :ref:`health checking overview <arch_overview_health_checking>` for more |
||||
information. |
||||
|
||||
.. _config_http_filters_router_x-envoy-overloaded: |
||||
|
||||
x-envoy-overloaded |
||||
^^^^^^^^^^^^^^^^^^ |
||||
|
||||
If this header is set by upstream, Envoy will not retry. Currently the value of the header is not |
||||
looked at, only its presence. Additionally, Envoy will set this header on the downstream response |
||||
if a request was dropped due to either :ref:`maintenance mode |
||||
<config_http_filters_router_runtime_maintenance_mode>` or upstream :ref:`circuit breaking |
||||
<arch_overview_circuit_break>`. |
||||
|
||||
.. _config_http_filters_router_x-envoy-decorator-operation: |
||||
|
||||
x-envoy-decorator-operation |
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
||||
|
||||
If this header is present on ingress requests, its value will override any locally defined |
||||
operation (span) name on the server span generated by the tracing mechanism. Similarly, if |
||||
this header is present on an egress response, its value will override any locally defined |
||||
operation (span) name on the client span. |
||||
|
||||
.. _config_http_filters_router_stats: |
||||
|
||||
Statistics |
||||
---------- |
||||
|
||||
The router outputs many statistics in the cluster namespace (depending on the cluster specified in |
||||
the chosen route). See :ref:`here <config_cluster_manager_cluster_stats>` for more information. |
||||
|
||||
The router filter outputs statistics in the *http.<stat_prefix>.* namespace. The :ref:`stat |
||||
prefix <config_http_conn_man_stat_prefix>` comes from the owning HTTP connection manager. |
||||
|
||||
.. csv-table:: |
||||
:header: Name, Type, Description |
||||
:widths: 1, 1, 2 |
||||
|
||||
no_route, Counter, Total requests that had no route and resulted in a 404 |
||||
no_cluster, Counter, Total requests in which the target cluster did not exist and resulted in a 404 |
||||
rq_redirect, Counter, Total requests that resulted in a redirect response |
||||
rq_total, Counter, Total routed requests |
||||
|
||||
Virtual cluster statistics are output in the |
||||
*vhost.<virtual host name>.vcluster.<virtual cluster name>.* namespace and include the following |
||||
statistics: |
||||
|
||||
.. csv-table:: |
||||
:header: Name, Type, Description |
||||
:widths: 1, 1, 2 |
||||
|
||||
upstream_rq_<\*xx>, Counter, "Aggregate HTTP response codes (e.g., 2xx, 3xx, etc.)" |
||||
upstream_rq_<\*>, Counter, "Specific HTTP response codes (e.g., 201, 302, etc.)" |
||||
upstream_rq_time, Histogram, Request time milliseconds |
||||
|
||||
Runtime |
||||
------- |
||||
|
||||
The router filter supports the following runtime settings: |
||||
|
||||
upstream.base_retry_backoff_ms |
||||
Base exponential retry back off time. See :ref:`here <arch_overview_http_routing_retry>` for more |
||||
information. Defaults to 25ms. |
||||
|
||||
.. _config_http_filters_router_runtime_maintenance_mode: |
||||
|
||||
upstream.maintenance_mode.<cluster name> |
||||
% of requests that will result in an immediate 503 response. This overrides any routing behavior |
||||
for requests that would have been destined for <cluster name>. This can be used for load |
||||
shedding, failure injection, etc. Defaults to disabled. |
||||
|
||||
upstream.use_retry |
||||
% of requests that are eligible for retry. This configuration is checked before any other retry |
||||
configuration and can be used to fully disable retries across all Envoys if needed. |
@ -0,0 +1,21 @@ |
||||
.. _config_listener_filters: |
||||
|
||||
Filters |
||||
======= |
||||
|
||||
Network filter :ref:`architecture overview <arch_overview_network_filters>`. |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"name": "...", |
||||
"config": "{...}" |
||||
} |
||||
|
||||
name |
||||
*(required, string)* The name of the filter to instantiate. The name must match a :ref:`supported |
||||
filter <config_network_filters>`. |
||||
|
||||
config |
||||
*(required, object)* Filter specific configuration which depends on the filter being instantiated. |
||||
See the :ref:`supported filters <config_network_filters>` for further documentation. |
@ -0,0 +1,84 @@ |
||||
.. _config_listeners_lds: |
||||
|
||||
Listener discovery service |
||||
========================== |
||||
|
||||
The listener discovery service (LDS) is an optional API that Envoy will call to dynamically fetch |
||||
listeners. Envoy will reconcile the API response and add, modify, or remove known listeners |
||||
depending on what is required. |
||||
|
||||
The semantics of listener updates are as follows: |
||||
|
||||
* Every listener must have a unique :ref:`name <config_listeners_name>`. If a name is not |
||||
provided, Envoy will create a UUID. Listeners that are to be dynamically updated should have a |
||||
unique name supplied by the management server. |
||||
* When a listener is added, it will be "warmed" before taking traffic. For example, if the listener |
||||
references an :ref:`RDS <config_http_conn_man_rds>` configuration, that configuration will be |
||||
resolved and fetched before the listener is moved to "active." |
||||
* Listeners are effectively constant once created. Thus, when a listener is updated, an entirely |
||||
new listener is created (with the same listen socket). This listener goes through the same |
||||
warming process described above for a newly added listener. |
||||
* When a listener is updated or removed, the old listener will be placed into a "draining" state |
||||
much like when the entire server is drained for restart. Connections owned by the listener will |
||||
be gracefully closed (if possible) for some period of time before the listener is removed and any |
||||
remaining connections are closed. The drain time is set via the :option:`--drain-time-s` option. |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"cluster": "...", |
||||
"refresh_delay_ms": "..." |
||||
} |
||||
|
||||
cluster |
||||
*(required, string)* The name of an upstream :ref:`cluster <config_cluster_manager_cluster>` that |
||||
hosts the listener discovery service. The cluster must run a REST service that implements the |
||||
:ref:`LDS HTTP API <config_listeners_lds_api>`. NOTE: This is the *name* of a cluster defined |
||||
in the :ref:`cluster manager <config_cluster_manager>` configuration, not the full definition of |
||||
a cluster as in the case of SDS and CDS. |
||||
|
||||
refresh_delay_ms |
||||
*(optional, integer)* The delay, in milliseconds, between fetches to the LDS API. Envoy will add |
||||
an additional random jitter to the delay that is between zero and *refresh_delay_ms* |
||||
milliseconds. Thus the longest possible refresh delay is 2 \* *refresh_delay_ms*. Default value |
||||
is 30000ms (30 seconds). |
||||
|
||||
.. _config_listeners_lds_api: |
||||
|
||||
REST API |
||||
-------- |
||||
|
||||
.. http:get:: /v1/listeners/(string: service_cluster)/(string: service_node) |
||||
|
||||
Asks the discovery service to return all listeners for a particular `service_cluster` and |
||||
`service_node`. `service_cluster` corresponds to the :option:`--service-cluster` CLI option. |
||||
`service_node` corresponds to the :option:`--service-node` CLI option. Responses use the following |
||||
JSON schema: |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"listeners": [] |
||||
} |
||||
|
||||
listeners |
||||
*(Required, array)* A list of :ref:`listeners <config_listeners>` that will be |
||||
dynamically added/modified within the listener manager. The management server is expected to |
||||
respond with the complete set of listeners that Envoy should configure during each polling cycle. |
||||
Envoy will reconcile this list with the listeners that are currently loaded and either |
||||
add/modify/remove listeners as necessary. |
||||
|
||||
Statistics |
||||
---------- |
||||
|
||||
LDS has a statistics tree rooted at *listener_manager.lds.* with the following statistics: |
||||
|
||||
.. csv-table:: |
||||
:header: Name, Type, Description |
||||
:widths: 1, 1, 2 |
||||
|
||||
config_reload, Counter, Total API fetches that resulted in a config reload due to a different config |
||||
update_attempt, Counter, Total API fetches attempted |
||||
update_success, Counter, Total API fetches completed successfully |
||||
update_failure, Counter, Total API fetches that failed (either network or schema errors) |
||||
version, Gauge, Hash of the contents from the last successful API fetch |
@ -0,0 +1,107 @@ |
||||
.. _config_listeners: |
||||
|
||||
Listeners |
||||
========= |
||||
|
||||
.. toctree:: |
||||
:hidden: |
||||
|
||||
filters |
||||
ssl |
||||
stats |
||||
runtime |
||||
lds |
||||
|
||||
The top level Envoy configuration contains a list of :ref:`listeners <arch_overview_listeners>`. |
||||
Each individual listener configuration has the following format: |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"name": "...", |
||||
"address": "...", |
||||
"filters": [], |
||||
"ssl_context": "{...}", |
||||
"bind_to_port": "...", |
||||
"use_proxy_proto": "...", |
||||
"use_original_dst": "...", |
||||
"per_connection_buffer_limit_bytes": "...", |
||||
"drain_type": "..." |
||||
} |
||||
|
||||
.. _config_listeners_name: |
||||
|
||||
name |
||||
*(optional, string)* The unique name by which this listener is known. If no name is provided, |
||||
Envoy will allocate an internal UUID for the listener. If the listener is to be dynamically |
||||
updated or removed via :ref:`LDS <config_listeners_lds>` a unique name must be provided. |
||||
By default, the maximum length of a listener's name is limited to 60 characters. This limit can be |
||||
increased by setting the :option:`--max-obj-name-len` command line argument to the desired value. |
||||
|
||||
address |
||||
*(required, string)* The address that the listener should listen on. Currently only TCP |
||||
listeners are supported, e.g., "tcp://127.0.0.1:80". Note, "tcp://0.0.0.0:80" is the wild card |
||||
match for any IPv4 address with port 80. |
||||
|
||||
:ref:`filters <config_listener_filters>` |
||||
*(required, array)* A list of individual :ref:`network filters <arch_overview_network_filters>` |
||||
that make up the filter chain for connections established with the listener. Order matters as the |
||||
filters are processed sequentially as connection events happen. |
||||
|
||||
**Note:** If the filter list is empty, the connection will close by default. |
||||
|
||||
:ref:`ssl_context <config_listener_ssl_context>` |
||||
*(optional, object)* The :ref:`TLS <arch_overview_ssl>` context configuration for a TLS listener. |
||||
If no TLS context block is defined, the listener is a plain text listener. |
||||
|
||||
bind_to_port |
||||
*(optional, boolean)* Whether the listener should bind to the port. A listener that doesn't bind |
||||
can only receive connections redirected from other listeners that set use_original_dst parameter to |
||||
true. Default is true. |
||||
|
||||
use_proxy_proto |
||||
*(optional, boolean)* Whether the listener should expect a |
||||
`PROXY protocol V1 <http://www.haproxy.org/download/1.5/doc/proxy-protocol.txt>`_ header on new |
||||
connections. If this option is enabled, the listener will assume that that remote address of the |
||||
connection is the one specified in the header. Some load balancers including the AWS ELB support |
||||
this option. If the option is absent or set to false, Envoy will use the physical peer address |
||||
of the connection as the remote address. |
||||
|
||||
use_original_dst |
||||
*(optional, boolean)* If a connection is redirected using *iptables*, the port on which the proxy |
||||
receives it might be different from the original destination port. When this flag is set to true, |
||||
the listener hands off redirected connections to the listener associated with the original |
||||
destination port. If there is no listener associated with the original destination port, the |
||||
connection is handled by the listener that receives it. Default is false. |
||||
|
||||
.. _config_listeners_per_connection_buffer_limit_bytes: |
||||
|
||||
per_connection_buffer_limit_bytes |
||||
*(optional, integer)* Soft limit on size of the listener's new connection read and write buffers. |
||||
If unspecified, an implementation defined default is applied (1MiB). |
||||
|
||||
.. _config_listeners_drain_type: |
||||
|
||||
drain_type |
||||
*(optional, string)* The type of draining that the listener does. Allowed values include *default* |
||||
and *modify_only*. See the :ref:`draining <arch_overview_draining>` architecture overview for |
||||
more information. |
||||
|
||||
Statistics |
||||
---------- |
||||
|
||||
The listener manager has a statistics tree rooted at *listener_manager.* with the following |
||||
statistics. Any ``:`` character in the stats name is replaced with ``_``. |
||||
|
||||
.. csv-table:: |
||||
:header: Name, Type, Description |
||||
:widths: 1, 1, 2 |
||||
|
||||
listener_added, Counter, Total listeners added (either via static config or LDS) |
||||
listener_modified, Counter, Total listeners modified (via LDS) |
||||
listener_removed, Counter, Total listeners removed (via LDS) |
||||
listener_create_success, Counter, Total listener objects successfully added to workers. |
||||
listener_create_failure, Counter, Total failed listener object additions to workers. |
||||
total_listeners_warming, Gauge, Number of currently warming listeners |
||||
total_listeners_active, Gauge, Number of currently active listeners |
||||
total_listeners_draining, Gauge, Number of currently draining listeners |
@ -0,0 +1,8 @@ |
||||
Runtime |
||||
======= |
||||
|
||||
Listeners support the following runtime settings: |
||||
|
||||
ssl.alt_alpn |
||||
What % of requests use the configured :ref:`alt_alpn <config_listener_ssl_context_alt_alpn>` |
||||
protocol string. Defaults to 0. |
@ -0,0 +1,125 @@ |
||||
.. _config_listener_ssl_context: |
||||
|
||||
TLS context |
||||
=========== |
||||
|
||||
TLS :ref:`architecture overview <arch_overview_ssl>`. |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"cert_chain_file": "...", |
||||
"private_key_file": "...", |
||||
"alpn_protocols": "...", |
||||
"alt_alpn_protocols": "...", |
||||
"ca_cert_file": "...", |
||||
"verify_certificate_hash": "...", |
||||
"verify_subject_alt_name": [], |
||||
"cipher_suites": "...", |
||||
"ecdh_curves": "...", |
||||
"session_ticket_key_paths": [] |
||||
} |
||||
|
||||
cert_chain_file |
||||
*(required, string)* The certificate chain file that should be served by the listener. |
||||
|
||||
private_key_file |
||||
*(required, string)* The private key that corresponds to the certificate chain file. |
||||
|
||||
alpn_protocols |
||||
*(optional, string)* Supplies the list of ALPN protocols that the listener should expose. In |
||||
practice this is likely to be set to one of two values (see the |
||||
:ref:`codec_type <config_http_conn_man_codec_type>` parameter in the HTTP connection |
||||
manager for more information): |
||||
|
||||
* "h2,http/1.1" If the listener is going to support both HTTP/2 and HTTP/1.1. |
||||
* "http/1.1" If the listener is only going to support HTTP/1.1 |
||||
|
||||
.. _config_listener_ssl_context_alt_alpn: |
||||
|
||||
alt_alpn_protocols |
||||
*(optional, string)* An alternate ALPN protocol string that can be switched to via runtime. This |
||||
is useful for example to disable HTTP/2 without having to deploy a new configuration. |
||||
|
||||
ca_cert_file |
||||
*(optional, string)* A file containing certificate authority certificates to use in verifying |
||||
a presented client side certificate. If not specified and a client certificate is presented it |
||||
will not be verified. By default, a client certificate is optional, unless one of the additional |
||||
options ( |
||||
:ref:`require_client_certificate <config_listener_ssl_context_require_client_certificate>`, |
||||
:ref:`verify_certificate_hash <config_listener_ssl_context_verify_certificate_hash>` or |
||||
:ref:`verify_subject_alt_name <config_listener_ssl_context_verify_subject_alt_name>`) is also |
||||
specified. |
||||
|
||||
.. _config_listener_ssl_context_require_client_certificate: |
||||
|
||||
require_client_certificate |
||||
*(optional, boolean)* If specified, Envoy will reject connections without a valid client certificate. |
||||
|
||||
.. _config_listener_ssl_context_verify_certificate_hash: |
||||
|
||||
verify_certificate_hash |
||||
*(optional, string)* If specified, Envoy will verify (pin) the hash of the presented client |
||||
side certificate. |
||||
|
||||
.. _config_listener_ssl_context_verify_subject_alt_name: |
||||
|
||||
verify_subject_alt_name |
||||
*(optional, array)* An optional list of subject alt names. If specified, Envoy will verify |
||||
that the client certificate's subject alt name matches one of the specified values. |
||||
|
||||
cipher_suites |
||||
*(optional, string)* If specified, the TLS listener will only support the specified `cipher list |
||||
<https://commondatastorage.googleapis.com/chromium-boringssl-docs/ssl.h.html#Cipher-suite-configuration>`_. |
||||
If not specified, the default list: |
||||
|
||||
.. code-block:: none |
||||
|
||||
[ECDHE-ECDSA-AES128-GCM-SHA256|ECDHE-ECDSA-CHACHA20-POLY1305] |
||||
[ECDHE-RSA-AES128-GCM-SHA256|ECDHE-RSA-CHACHA20-POLY1305] |
||||
ECDHE-ECDSA-AES128-SHA256 |
||||
ECDHE-RSA-AES128-SHA256 |
||||
ECDHE-ECDSA-AES128-SHA |
||||
ECDHE-RSA-AES128-SHA |
||||
AES128-GCM-SHA256 |
||||
AES128-SHA256 |
||||
AES128-SHA |
||||
ECDHE-ECDSA-AES256-GCM-SHA384 |
||||
ECDHE-RSA-AES256-GCM-SHA384 |
||||
ECDHE-ECDSA-AES256-SHA384 |
||||
ECDHE-RSA-AES256-SHA384 |
||||
ECDHE-ECDSA-AES256-SHA |
||||
ECDHE-RSA-AES256-SHA |
||||
AES256-GCM-SHA384 |
||||
AES256-SHA256 |
||||
AES256-SHA |
||||
|
||||
will be used. |
||||
|
||||
ecdh_curves |
||||
*(optional, string)* If specified, the TLS connection will only support the specified ECDH curves. |
||||
If not specified, the default curves (X25519, P-256) will be used. |
||||
|
||||
session_ticket_key_paths |
||||
*(optional, array)* Paths to keyfiles for encrypting and decrypting TLS session tickets. The |
||||
first keyfile in the array contains the key to encrypt all new sessions created by this context. |
||||
All keys are candidates for decrypting received tickets. This allows for easy rotation of keys |
||||
by, for example, putting the new keyfile first, and the previous keyfile second. |
||||
|
||||
If `session_ticket_key_paths` is not specified, the TLS library will still support resuming |
||||
sessions via tickets, but it will use an internally-generated and managed key, so sessions cannot |
||||
be resumed across hot restarts or on different hosts. |
||||
|
||||
Each keyfile must contain exactly 80 bytes of cryptographically-secure random data. For example, |
||||
the output of ``openssl rand 80``. |
||||
|
||||
.. attention:: |
||||
|
||||
Using this feature has serious security considerations and risks. Improper handling of keys may |
||||
result in loss of secrecy in connections, even if ciphers supporting perfect forward secrecy |
||||
are used. See https://www.imperialviolet.org/2013/06/27/botchingpfs.html for some discussion. |
||||
To minimize the risk, you must: |
||||
|
||||
* Keep the session ticket keys at least as secure as your TLS certificate private keys |
||||
* Rotate session ticket keys at least daily, and preferably hourly |
||||
* Always generate keys using a cryptographically-secure random data source |
@ -0,0 +1,24 @@ |
||||
.. _config_listener_stats: |
||||
|
||||
Statistics |
||||
========== |
||||
|
||||
Every listener has a statistics tree rooted at *listener.<address>.* with the following statistics: |
||||
|
||||
.. csv-table:: |
||||
:header: Name, Type, Description |
||||
:widths: 1, 1, 2 |
||||
|
||||
downstream_cx_total, Counter, Total connections |
||||
downstream_cx_destroy, Counter, Total destroyed connections |
||||
downstream_cx_active, Gauge, Total active connections |
||||
downstream_cx_length_ms, Histogram, Connection length milliseconds |
||||
ssl.connection_error, Counter, Total TLS connection errors not including failed certificate verifications |
||||
ssl.handshake, Counter, Total successful TLS connection handshakes |
||||
ssl.session_reused, Counter, Total successful TLS session resumptions |
||||
ssl.no_certificate, Counter, Total successul TLS connections with no client certificate |
||||
ssl.fail_verify_no_cert, Counter, Total TLS connections that failed because of missing client certificate |
||||
ssl.fail_verify_error, Counter, Total TLS connections that failed CA verification |
||||
ssl.fail_verify_san, Counter, Total TLS connections that failed SAN verification |
||||
ssl.fail_verify_cert_hash, Counter, Total TLS connections that failed certificate pinning verification |
||||
ssl.cipher.<cipher>, Counter, Total TLS connections that used <cipher> |
@ -0,0 +1,98 @@ |
||||
.. _config_network_filters_client_ssl_auth: |
||||
|
||||
Client TLS authentication |
||||
========================= |
||||
|
||||
Client TLS authentication filter :ref:`architecture overview <arch_overview_ssl_auth_filter>`. |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"name": "client_ssl_auth", |
||||
"config": { |
||||
"auth_api_cluster": "...", |
||||
"stat_prefix": "...", |
||||
"refresh_delay_ms": "...", |
||||
"ip_white_list": [] |
||||
} |
||||
} |
||||
|
||||
auth_api_cluster |
||||
*(required, string)* The :ref:`cluster manager <arch_overview_cluster_manager>` cluster that runs |
||||
the authentication service. The filter will connect to the service every 60s to fetch the list |
||||
of principals. The service must support the expected :ref:`REST API |
||||
<config_network_filters_client_ssl_auth_rest_api>`. |
||||
|
||||
stat_prefix |
||||
*(required, string)* The prefix to use when emitting :ref:`statistics |
||||
<config_network_filters_client_ssl_auth_stats>`. |
||||
|
||||
refresh_delay_ms |
||||
*(optional, integer)* Time in milliseconds between principal refreshes from the authentication |
||||
service. Default is 60000 (60s). The actual fetch time will be this value plus a random jittered |
||||
value between 0-refresh_delay_ms milliseconds. |
||||
|
||||
ip_white_list |
||||
*(optional, array)* An optional list of IP address and subnet masks that should be white listed |
||||
for access by the filter. If no list is provided, there is no IP white list. The list is |
||||
specified as in the following example: |
||||
|
||||
.. code-block:: json |
||||
|
||||
[ |
||||
"192.168.3.0/24", |
||||
"50.1.2.3/32", |
||||
"10.15.0.0/16", |
||||
"2001:abcd::/64" |
||||
] |
||||
|
||||
.. _config_network_filters_client_ssl_auth_stats: |
||||
|
||||
Statistics |
||||
---------- |
||||
|
||||
Every configured client TLS authentication filter has statistics rooted at |
||||
*auth.clientssl.<stat_prefix>.* with the following statistics: |
||||
|
||||
.. csv-table:: |
||||
:header: Name, Type, Description |
||||
:widths: 1, 1, 2 |
||||
|
||||
update_success, Counter, Total principal update successes |
||||
update_failure, Counter, Total principal update failures |
||||
auth_no_ssl, Counter, Total connections ignored due to no TLS |
||||
auth_ip_white_list, Counter, Total connections allowed due to the IP white list |
||||
auth_digest_match, Counter, Total connections allowed due to certificate match |
||||
auth_digest_no_match, Counter, Total connections denied due to no certificate match |
||||
total_principals, Gauge, Total loaded principals |
||||
|
||||
.. _config_network_filters_client_ssl_auth_rest_api: |
||||
|
||||
REST API |
||||
-------- |
||||
|
||||
.. http:get:: /v1/certs/list/approved |
||||
|
||||
The authentication filter will call this API every refresh interval to fetch the current list |
||||
of approved certificates/principals. The expected JSON response looks like: |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"certificates": [] |
||||
} |
||||
|
||||
certificates |
||||
*(required, array)* list of approved certificates/principals. |
||||
|
||||
Each certificate object is defined as: |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"fingerprint_sha256": "...", |
||||
} |
||||
|
||||
fingerprint_sha256 |
||||
*(required, string)* The SHA256 hash of the approved client certificate. Envoy will match this |
||||
hash to the presented client certificate to determine whether there is a digest match. |
@ -0,0 +1,12 @@ |
||||
Echo |
||||
==== |
||||
|
||||
The echo is a trivial network filter mainly meant to demonstrate the network filter API. If |
||||
installed it will echo (write) all received data back to the connected downstream client. |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"name": "echo", |
||||
"config": {} |
||||
} |
@ -0,0 +1,212 @@ |
||||
.. _config_network_filters_mongo_proxy: |
||||
|
||||
Mongo proxy |
||||
=========== |
||||
|
||||
MongoDB :ref:`architecture overview <arch_overview_mongo>`. |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"name": "mongo_proxy", |
||||
"config": { |
||||
"stat_prefix": "...", |
||||
"access_log": "...", |
||||
"fault": {} |
||||
} |
||||
} |
||||
|
||||
stat_prefix |
||||
*(required, string)* The prefix to use when emitting :ref:`statistics |
||||
<config_network_filters_mongo_proxy_stats>`. |
||||
|
||||
access_log |
||||
*(optional, string)* The optional path to use for writing Mongo access logs. If not access log |
||||
path is specified no access logs will be written. Note that access log is also gated by |
||||
:ref:`runtime <config_network_filters_mongo_proxy_runtime>`. |
||||
|
||||
fault |
||||
*(optional, object)* If specified, the filter will inject faults based on the values in the object. |
||||
|
||||
Fault configuration |
||||
------------------- |
||||
|
||||
Configuration for MongoDB fixed duration delays. Delays are applied to the following MongoDB |
||||
operations: Query, Insert, GetMore, and KillCursors. Once an active delay is in progress, all |
||||
incoming data up until the timer event fires will be a part of the delay. |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"fixed_delay": { |
||||
"percent": "...", |
||||
"duration_ms": "..." |
||||
} |
||||
} |
||||
|
||||
percent |
||||
*(required, integer)* Probability of an eligible MongoDB operation to be affected by the |
||||
injected fault when there is no active fault. Valid values are integers in a range of [0, 100]. |
||||
|
||||
duration_ms |
||||
*(required, integer)* Non-negative delay duration in milliseconds. |
||||
|
||||
.. _config_network_filters_mongo_proxy_stats: |
||||
|
||||
Statistics |
||||
---------- |
||||
|
||||
Every configured MongoDB proxy filter has statistics rooted at *mongo.<stat_prefix>.* with the |
||||
following statistics: |
||||
|
||||
.. csv-table:: |
||||
:header: Name, Type, Description |
||||
:widths: 1, 1, 2 |
||||
|
||||
decoding_error, Counter, Number of MongoDB protocol decoding errors |
||||
delay_injected, Counter, Number of times the delay is injected |
||||
op_get_more, Counter, Number of OP_GET_MORE messages |
||||
op_insert, Counter, Number of OP_INSERT messages |
||||
op_kill_cursors, Counter, Number of OP_KILL_CURSORS messages |
||||
op_query, Counter, Number of OP_QUERY messages |
||||
op_query_tailable_cursor, Counter, Number of OP_QUERY with tailable cursor flag set |
||||
op_query_no_cursor_timeout, Counter, Number of OP_QUERY with no cursor timeout flag set |
||||
op_query_await_data, Counter, Number of OP_QUERY with await data flag set |
||||
op_query_exhaust, Counter, Number of OP_QUERY with exhaust flag set |
||||
op_query_no_max_time, Counter, Number of queries without maxTimeMS set |
||||
op_query_scatter_get, Counter, Number of scatter get queries |
||||
op_query_multi_get, Counter, Number of multi get queries |
||||
op_query_active, Gauge, Number of active queries |
||||
op_reply, Counter, Number of OP_REPLY messages |
||||
op_reply_cursor_not_found, Counter, Number of OP_REPLY with cursor not found flag set |
||||
op_reply_query_failure, Counter, Number of OP_REPLY with query failure flag set |
||||
op_reply_valid_cursor, Counter, Number of OP_REPLY with a valid cursor |
||||
cx_destroy_local_with_active_rq, Counter, Connections destroyed locally with an active query |
||||
cx_destroy_remote_with_active_rq, Counter, Connections destroyed remotely with an active query |
||||
cx_drain_close, Counter, Connections gracefully closed on reply boundaries during server drain |
||||
|
||||
Scatter gets |
||||
^^^^^^^^^^^^ |
||||
|
||||
Envoy defines a *scatter get* as any query that does not use an *_id* field as a query parameter. |
||||
Envoy looks in both the top level document as well as within a *$query* field for *_id*. |
||||
|
||||
Multi gets |
||||
^^^^^^^^^^ |
||||
|
||||
Envoy defines a *multi get* as any query that does use an *_id* field as a query parameter, but |
||||
where *_id* is not a scalar value (i.e., a document or an array). Envoy looks in both the top level |
||||
document as well as within a *$query* field for *_id*. |
||||
|
||||
.. _config_network_filters_mongo_proxy_comment_parsing: |
||||
|
||||
$comment parsing |
||||
^^^^^^^^^^^^^^^^ |
||||
|
||||
If a query has a top level *$comment* field (typically in addition to a *$query* field), Envoy will |
||||
parse it as JSON and look for the following structure: |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"callingFunction": "..." |
||||
} |
||||
|
||||
callingFunction |
||||
*(required, string)* the function that made the query. If available, the function will be used |
||||
in :ref:`callsite <config_network_filters_mongo_proxy_callsite_stats>` query statistics. |
||||
|
||||
Per command statistics |
||||
^^^^^^^^^^^^^^^^^^^^^^ |
||||
|
||||
The MongoDB filter will gather statistics for commands in the *mongo.<stat_prefix>.cmd.<cmd>.* |
||||
namespace. |
||||
|
||||
.. csv-table:: |
||||
:header: Name, Type, Description |
||||
:widths: 1, 1, 2 |
||||
|
||||
total, Counter, Number of commands |
||||
reply_num_docs, Histogram, Number of documents in reply |
||||
reply_size, Histogram, Size of the reply in bytes |
||||
reply_time_ms, Histogram, Command time in milliseconds |
||||
|
||||
.. _config_network_filters_mongo_proxy_collection_stats: |
||||
|
||||
Per collection query statistics |
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
||||
|
||||
The MongoDB filter will gather statistics for queries in the |
||||
*mongo.<stat_prefix>.collection.<collection>.query.* namespace. |
||||
|
||||
.. csv-table:: |
||||
:header: Name, Type, Description |
||||
:widths: 1, 1, 2 |
||||
|
||||
total, Counter, Number of queries |
||||
scatter_get, Counter, Number of scatter gets |
||||
multi_get, Counter, Number of multi gets |
||||
reply_num_docs, Histogram, Number of documents in reply |
||||
reply_size, Histogram, Size of the reply in bytes |
||||
reply_time_ms, Histogram, Query time in milliseconds |
||||
|
||||
.. _config_network_filters_mongo_proxy_callsite_stats: |
||||
|
||||
Per collection and callsite query statistics |
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
||||
|
||||
If the application provides the :ref:`calling function |
||||
<config_network_filters_mongo_proxy_comment_parsing>` in the *$comment* field, Envoy will generate |
||||
per callsite statistics. These statistics match the :ref:`per collection statistics |
||||
<config_network_filters_mongo_proxy_collection_stats>` but are found in the |
||||
*mongo.<stat_prefix>.collection.<collection>.callsite.<callsite>.query.* namespace. |
||||
|
||||
.. _config_network_filters_mongo_proxy_runtime: |
||||
|
||||
Runtime |
||||
------- |
||||
|
||||
The Mongo proxy filter supports the following runtime settings: |
||||
|
||||
mongo.connection_logging_enabled |
||||
% of connections that will have logging enabled. Defaults to 100. This allows only a % of |
||||
connections to have logging, but for all messages on those connections to be logged. |
||||
|
||||
mongo.proxy_enabled |
||||
% of connections that will have the proxy enabled at all. Defaults to 100. |
||||
|
||||
mongo.logging_enabled |
||||
% of messages that will be logged. Defaults to 100. If less than 100, queries may be logged |
||||
without replies, etc. |
||||
|
||||
mongo.mongo.drain_close_enabled |
||||
% of connections that will be drain closed if the server is draining and would otherwise |
||||
attempt a drain close. Defaults to 100. |
||||
|
||||
mongo.fault.fixed_delay.percent |
||||
Probability of an eligible MongoDB operation to be affected by |
||||
the injected fault when there is no active fault. |
||||
Defaults to the *percent* specified in the config. |
||||
|
||||
mongo.fault.fixed_delay.duration_ms |
||||
The delay duration in milliseconds. Defaults to the *duration_ms* specified in the config. |
||||
|
||||
Access log format |
||||
----------------- |
||||
|
||||
The access log format is not customizable and has the following layout: |
||||
|
||||
.. code-block:: json |
||||
|
||||
{"time": "...", "message": "...", "upstream_host": "..."} |
||||
|
||||
time |
||||
System time that complete message was parsed, including milliseconds. |
||||
|
||||
message |
||||
Textual expansion of the message. Whether the message is fully expanded depends on the context. |
||||
Sometimes summary data is presented to avoid extremely large log sizes. |
||||
|
||||
upstream_host |
||||
The upstream host that the connection is proxying to, if available. This is populated if the |
||||
filter is used along with the :ref:`TCP proxy filter <config_network_filters_tcp_proxy>`. |
@ -0,0 +1,18 @@ |
||||
.. _config_network_filters: |
||||
|
||||
Network filters |
||||
=============== |
||||
|
||||
In addition to the :ref:`HTTP connection manager <config_http_conn_man>` which is large |
||||
enough to have its own section in the configuration guide, Envoy has the follow builtin network |
||||
filters. |
||||
|
||||
.. toctree:: |
||||
:maxdepth: 2 |
||||
|
||||
client_ssl_auth_filter |
||||
echo_filter |
||||
mongo_proxy_filter |
||||
rate_limit_filter |
||||
redis_proxy_filter |
||||
tcp_proxy_filter |
@ -0,0 +1,71 @@ |
||||
.. _config_network_filters_rate_limit: |
||||
|
||||
Rate limit |
||||
========== |
||||
|
||||
Global rate limiting :ref:`architecture overview <arch_overview_rate_limit>`. |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"name": "ratelimit", |
||||
"config": { |
||||
"stat_prefix": "...", |
||||
"domain": "...", |
||||
"descriptors": [], |
||||
"timeout_ms": "..." |
||||
} |
||||
} |
||||
|
||||
stat_prefix |
||||
*(required, string)* The prefix to use when emitting :ref:`statistics |
||||
<config_network_filters_rate_limit_stats>`. |
||||
|
||||
domain |
||||
*(required, string)* The rate limit domain to use in the rate limit service request. |
||||
|
||||
descriptors |
||||
*(required, array)* The rate limit descriptor list to use in the rate limit service request. The |
||||
descriptors are specified as in the following example: |
||||
|
||||
.. code-block:: json |
||||
|
||||
[ |
||||
[{"key": "hello", "value": "world"}, {"key": "foo", "value": "bar"}], |
||||
[{"key": "foo2", "value": "bar2"}] |
||||
] |
||||
|
||||
timeout_ms |
||||
*(optional, integer)* The timeout in milliseconds for the rate limit service RPC. If not set, |
||||
this defaults to 20ms. |
||||
|
||||
.. _config_network_filters_rate_limit_stats: |
||||
|
||||
Statistics |
||||
---------- |
||||
|
||||
Every configured rate limit filter has statistics rooted at *ratelimit.<stat_prefix>.* with the |
||||
following statistics: |
||||
|
||||
.. csv-table:: |
||||
:header: Name, Type, Description |
||||
:widths: 1, 1, 2 |
||||
|
||||
total, Counter, Total requests to the rate limit service |
||||
error, Counter, Total errors contacting the rate limit service |
||||
over_limit, Counter, Total over limit responses from the rate limit service |
||||
ok, Counter, Total under limit responses from the rate limit service |
||||
cx_closed, Counter, Total connections closed due to an over limit response from the rate limit service |
||||
active, Gauge, Total active requests to the rate limit service |
||||
|
||||
Runtime |
||||
------- |
||||
|
||||
The network rate limit filter supports the following runtime settings: |
||||
|
||||
ratelimit.tcp_filter_enabled |
||||
% of connections that will call the rate limit service. Defaults to 100. |
||||
|
||||
ratelimit.tcp_filter_enforcing |
||||
% of connections that will call the rate limit service and enforce the decision. Defaults to 100. |
||||
This can be used to test what would happen before fully enforcing the outcome. |
@ -0,0 +1,107 @@ |
||||
.. _config_network_filters_redis_proxy: |
||||
|
||||
Redis proxy |
||||
=========== |
||||
|
||||
Redis :ref:`architecture overview <arch_overview_redis>`. |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"name": "redis_proxy", |
||||
"config": { |
||||
"cluster_name": "...", |
||||
"conn_pool": "{...}", |
||||
"stat_prefix": "..." |
||||
} |
||||
} |
||||
|
||||
cluster_name |
||||
*(required, string)* Name of cluster from cluster manager. |
||||
See the :ref:`configuration section <arch_overview_redis_configuration>` of the architecture |
||||
overview for recommendations on configuring the backing cluster. |
||||
|
||||
conn_pool |
||||
*(required, object)* Connection pool configuration. |
||||
|
||||
stat_prefix |
||||
*(required, string)* The prefix to use when emitting :ref:`statistics |
||||
<config_network_filters_redis_proxy_stats>`. |
||||
|
||||
Connection pool configuration |
||||
----------------------------- |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"op_timeout_ms": "...", |
||||
} |
||||
|
||||
op_timeout_ms |
||||
*(required, integer)* Per-operation timeout in milliseconds. The timer starts when the first |
||||
command of a pipeline is written to the backend connection. Each response received from Redis |
||||
resets the timer since it signifies that the next command is being processed by the backend. |
||||
The only exception to this behavior is when a connection to a backend is not yet established. In |
||||
that case, the connect timeout on the cluster will govern the timeout until the connection is |
||||
ready. |
||||
|
||||
.. _config_network_filters_redis_proxy_stats: |
||||
|
||||
Statistics |
||||
---------- |
||||
|
||||
Every configured Redis proxy filter has statistics rooted at *redis.<stat_prefix>.* with the |
||||
following statistics: |
||||
|
||||
.. csv-table:: |
||||
:header: Name, Type, Description |
||||
:widths: 1, 1, 2 |
||||
|
||||
downstream_cx_active, Gauge, Total active connections |
||||
downstream_cx_protocol_error, Counter, Total protocol errors |
||||
downstream_cx_rx_bytes_buffered, Gauge, Total received bytes currently buffered |
||||
downstream_cx_rx_bytes_total, Counter, Total bytes received |
||||
downstream_cx_total, Counter, Total connections |
||||
downstream_cx_tx_bytes_buffered, Gauge, Total sent bytes currently buffered |
||||
downstream_cx_tx_bytes_total, Counter, Total bytes sent |
||||
downstream_cx_drain_close, Counter, Number of connections closed due to draining |
||||
downstream_rq_active, Gauge, Total active requests |
||||
downstream_rq_total, Counter, Total requests |
||||
|
||||
|
||||
Splitter statistics |
||||
------------------- |
||||
|
||||
The Redis filter will gather statistics for the command splitter in the |
||||
*redis.<stat_prefix>.splitter.* with the following statistics: |
||||
|
||||
.. csv-table:: |
||||
:header: Name, Type, Description |
||||
:widths: 1, 1, 2 |
||||
|
||||
invalid_request, Counter, "Number of requests with an incorrect number of arguments" |
||||
unsupported_command, Counter, "Number of commands issued which are not recognized by the |
||||
command splitter" |
||||
|
||||
Per command statistics |
||||
---------------------- |
||||
|
||||
The Redis filter will gather statistics for commands in the |
||||
*redis.<stat_prefix>.command.<command>.* namespace. |
||||
|
||||
.. csv-table:: |
||||
:header: Name, Type, Description |
||||
:widths: 1, 1, 2 |
||||
|
||||
total, Counter, Number of commands |
||||
|
||||
.. _config_network_filters_redis_proxy_per_command_stats: |
||||
|
||||
Runtime |
||||
------- |
||||
|
||||
The Redis proxy filter supports the following runtime settings: |
||||
|
||||
redis.drain_close_enabled |
||||
% of connections that will be drain closed if the server is draining and would otherwise |
||||
attempt a drain close. Defaults to 100. |
@ -0,0 +1,146 @@ |
||||
.. _config_network_filters_tcp_proxy: |
||||
|
||||
TCP proxy |
||||
========= |
||||
|
||||
TCP proxy :ref:`architecture overview <arch_overview_tcp_proxy>`. |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"name": "tcp_proxy", |
||||
"config": { |
||||
"stat_prefix": "...", |
||||
"route_config": "{...}" |
||||
"access_log": "[]" |
||||
} |
||||
} |
||||
|
||||
:ref:`route_config <config_network_filters_tcp_proxy_route_config>` |
||||
*(required, object)* The route table for the filter. |
||||
All filter instances must have a route table, even if it is empty. |
||||
|
||||
stat_prefix |
||||
*(required, string)* The prefix to use when emitting :ref:`statistics |
||||
<config_network_filters_tcp_proxy_stats>`. |
||||
|
||||
:ref:`access_log <config_access_log>` |
||||
*(optional, array)* Configuration for :ref:`access logs <arch_overview_access_logs>` |
||||
emitted by the this tcp_proxy. |
||||
|
||||
.. _config_network_filters_tcp_proxy_route_config: |
||||
|
||||
Route Configuration |
||||
------------------- |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"routes": [] |
||||
} |
||||
|
||||
:ref:`routes <config_network_filters_tcp_proxy_route>` |
||||
*(required, array)* An array of route entries that make up the route table. |
||||
|
||||
.. _config_network_filters_tcp_proxy_route: |
||||
|
||||
Route |
||||
----- |
||||
|
||||
A TCP proxy route consists of a set of optional L4 criteria and the name of a |
||||
:ref:`cluster <config_cluster_manager_cluster>`. If a downstream connection matches |
||||
all the specified criteria, the cluster in the route is used for the corresponding upstream |
||||
connection. Routes are tried in the order specified until a match is found. If no match is |
||||
found, the connection is closed. A route with no criteria is valid and always produces a match. |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"cluster": "...", |
||||
"destination_ip_list": [], |
||||
"destination_ports": "...", |
||||
"source_ip_list": [], |
||||
"source_ports": "..." |
||||
} |
||||
|
||||
cluster |
||||
*(required, string)* The :ref:`cluster <config_cluster_manager_cluster>` to connect |
||||
to when a the downstream network connection matches the specified criteria. |
||||
|
||||
destination_ip_list |
||||
*(optional, array)* An optional list of IP address subnets in the form "ip_address/xx". |
||||
The criteria is satisfied if the destination IP address of the downstream connection is |
||||
contained in at least one of the specified subnets. |
||||
If the parameter is not specified or the list is empty, the destination IP address is ignored. |
||||
The destination IP address of the downstream connection might be different from the addresses |
||||
on which the proxy is listening if the connection has been redirected. Example: |
||||
|
||||
.. code-block:: json |
||||
|
||||
[ |
||||
"192.168.3.0/24", |
||||
"50.1.2.3/32", |
||||
"10.15.0.0/16", |
||||
"2001:abcd::/64" |
||||
] |
||||
|
||||
destination_ports |
||||
*(optional, string)* An optional string containing a comma-separated list of port numbers or |
||||
ranges. The criteria is satisfied if the destination port of the downstream connection |
||||
is contained in at least one of the specified ranges. |
||||
If the parameter is not specified, the destination port is ignored. The destination port address |
||||
of the downstream connection might be different from the port on which the proxy is listening if |
||||
the connection has been redirected. Example: |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"destination_ports": "1-1024,2048-4096,12345" |
||||
} |
||||
|
||||
source_ip_list |
||||
*(optional, array)* An optional list of IP address subnets in the form "ip_address/xx". |
||||
The criteria is satisfied if the source IP address of the downstream connection is contained |
||||
in at least one of the specified subnets. If the parameter is not specified or the list is empty, |
||||
the source IP address is ignored. Example: |
||||
|
||||
.. code-block:: json |
||||
|
||||
[ |
||||
"192.168.3.0/24", |
||||
"50.1.2.3/32", |
||||
"10.15.0.0/16", |
||||
"2001:abcd::/64" |
||||
] |
||||
|
||||
source_ports |
||||
*(optional, string)* An optional string containing a comma-separated list of port numbers or |
||||
ranges. The criteria is satisfied if the source port of the downstream connection is contained |
||||
in at least one of the specified ranges. If the parameter is not specified, the source port is |
||||
ignored. Example: |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"source_ports": "1-1024,2048-4096,12345" |
||||
} |
||||
|
||||
.. _config_network_filters_tcp_proxy_stats: |
||||
|
||||
Statistics |
||||
---------- |
||||
|
||||
The TCP proxy filter emits both its own downstream statistics as well as many of the :ref:`cluster |
||||
upstream statistics <config_cluster_manager_cluster_stats>` where applicable. The downstream |
||||
statistics are rooted at *tcp.<stat_prefix>.* with the following statistics: |
||||
|
||||
.. csv-table:: |
||||
:header: Name, Type, Description |
||||
:widths: 1, 1, 2 |
||||
|
||||
downstream_cx_total, Counter, Total number of connections handled by the filter. |
||||
downstream_cx_no_route, Counter, Number of connections for which no matching route was found. |
||||
downstream_cx_tx_bytes_total, Counter, Total bytes written to the downstream connection. |
||||
downstream_cx_tx_bytes_buffered, Gauge, Total bytes currently buffered to the downstream connection. |
||||
downstream_flow_control_paused_reading_total, Counter, Total number of times flow control paused reading from downstream. |
||||
downstream_flow_control_resumed_reading_total, Counter, Total number of times flow control resumed reading from downstream. |
@ -0,0 +1,27 @@ |
||||
.. _config_admin: |
||||
|
||||
Administration interface |
||||
======================== |
||||
|
||||
Administration interface :ref:`operations documentation <operations_admin_interface>`. |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"access_log_path": "...", |
||||
"profile_path": "...", |
||||
"address": "..." |
||||
} |
||||
|
||||
access_log_path |
||||
*(required, string)* The path to write the access log for the administration server. If no |
||||
access log is desired specify '/dev/null'. |
||||
|
||||
profile_path |
||||
*(optional, string)* The cpu profiler output path for the administration server. If no profile |
||||
path is specified, the default is '/var/log/envoy/envoy.prof'. |
||||
|
||||
address |
||||
*(required, string)* The TCP address that the administration server will listen on, e.g., |
||||
"tcp://127.0.0.1:1234". Note, "tcp://0.0.0.0:1234" is the wild card match for any IPv4 address |
||||
with port 1234. |
@ -0,0 +1,120 @@ |
||||
.. _config_overview: |
||||
|
||||
Overview |
||||
======== |
||||
|
||||
The Envoy configuration format is written in JSON and is validated against a JSON schema. The |
||||
schema can be found in :repo:`source/common/json/config_schemas.cc`. The main configuration for the |
||||
server is contained within the listeners and cluster manager sections. The other top level elements |
||||
specify miscellaneous configuration. |
||||
|
||||
YAML support is also provided as a syntactic convenience for hand-written configurations. Envoy will |
||||
internally convert YAML to JSON if a file path ends with .yaml. In the rest of the configuration |
||||
documentation, we refer exclusively to JSON. Envoy expects unambiguous YAML scalars, so if a cluster |
||||
name (which should be a string) is called *true*, it should be written in the configuration YAML as |
||||
*"true"*. The same applies to integer and floating point values (e.g. *1* vs. *1.0* vs. *"1.0"*). |
||||
|
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"listeners": [], |
||||
"lds": "{...}", |
||||
"admin": "{...}", |
||||
"cluster_manager": "{...}", |
||||
"flags_path": "...", |
||||
"statsd_udp_ip_address": "...", |
||||
"statsd_tcp_cluster_name": "...", |
||||
"stats_flush_interval_ms": "...", |
||||
"watchdog_miss_timeout_ms": "...", |
||||
"watchdog_megamiss_timeout_ms": "...", |
||||
"watchdog_kill_timeout_ms": "...", |
||||
"watchdog_multikill_timeout_ms": "...", |
||||
"tracing": "{...}", |
||||
"rate_limit_service": "{...}", |
||||
"runtime": "{...}", |
||||
} |
||||
|
||||
:ref:`listeners <config_listeners>` |
||||
*(required, array)* An array of :ref:`listeners <arch_overview_listeners>` that will be |
||||
instantiated by the server. A single Envoy process can contain any number of listeners. |
||||
|
||||
.. _config_overview_lds: |
||||
|
||||
:ref:`lds <config_listeners_lds>` |
||||
*(optional, object)* Configuration for the Listener Discovery Service (LDS). If not specified |
||||
only static listeners are loaded. |
||||
|
||||
:ref:`admin <config_admin>` |
||||
*(required, object)* Configuration for the :ref:`local administration HTTP server |
||||
<operations_admin_interface>`. |
||||
|
||||
:ref:`cluster_manager <config_cluster_manager>` |
||||
*(required, object)* Configuration for the :ref:`cluster manager <arch_overview_cluster_manager>` |
||||
which owns all upstream clusters within the server. |
||||
|
||||
.. _config_overview_flags_path: |
||||
|
||||
flags_path |
||||
*(optional, string)* The file system path to search for :ref:`startup flag files |
||||
<operations_file_system_flags>`. |
||||
|
||||
.. _config_overview_statsd_udp_ip_address: |
||||
|
||||
statsd_udp_ip_address |
||||
*(optional, string)* The UDP address of a running statsd compliant listener. If specified, |
||||
:ref:`statistics <arch_overview_statistics>` will be flushed to this address. IPv4 addresses should |
||||
have format host:port (ex: 127.0.0.1:855). IPv6 addresses should have URL format [host]:port |
||||
(ex: [::1]:855). |
||||
|
||||
statsd_tcp_cluster_name |
||||
*(optional, string)* The name of a cluster manager cluster that is running a TCP statsd compliant |
||||
listener. If specified, Envoy will connect to this cluster to flush :ref:`statistics |
||||
<arch_overview_statistics>`. |
||||
|
||||
.. _config_overview_stats_flush_interval_ms: |
||||
|
||||
stats_flush_interval_ms |
||||
*(optional, integer)* The time in milliseconds between flushes to configured stats sinks. For |
||||
performance reasons Envoy latches counters and only flushes counters and gauges at a periodic |
||||
interval. If not specified the default is 5000ms (5 seconds). |
||||
|
||||
watchdog_miss_timeout_ms |
||||
*(optional, integer)* The time in milliseconds after which Envoy counts a nonresponsive thread in the |
||||
"server.watchdog_miss" statistic. If not specified the default is 200ms. |
||||
|
||||
watchdog_megamiss_timeout_ms |
||||
*(optional, integer)* The time in milliseconds after which Envoy counts a nonresponsive thread in the |
||||
"server.watchdog_mega_miss" statistic. If not specified the default is 1000ms. |
||||
|
||||
watchdog_kill_timeout_ms |
||||
*(optional, integer)* If a watched thread has been nonresponsive for this many milliseconds assume |
||||
a programming error and kill the entire Envoy process. Set to 0 to disable kill behavior. If not |
||||
specified the default is 0 (disabled). |
||||
|
||||
watchdog_multikill_timeout_ms |
||||
*(optional, integer)* If at least two watched threads have been nonresponsive for at least this many |
||||
milliseconds assume a true deadlock and kill the entire Envoy process. Set to 0 to disable this |
||||
behavior. If not specified the default is 0 (disabled). |
||||
|
||||
:ref:`tracing <config_tracing>` |
||||
*(optional, object)* Configuration for an external :ref:`tracing <arch_overview_tracing>` |
||||
provider. If not specified, no tracing will be performed. |
||||
|
||||
:ref:`rate_limit_service <config_rate_limit_service>` |
||||
*(optional, object)* Configuration for an external :ref:`rate limit service |
||||
<arch_overview_rate_limit>` provider. If not specified, any calls to the rate limit service will |
||||
immediately return success. |
||||
|
||||
:ref:`runtime <config_runtime>` |
||||
*(optional, object)* Configuration for the :ref:`runtime configuration <arch_overview_runtime>` |
||||
provider. If not specified, a "null" provider will be used which will result in all defaults being |
||||
used. |
||||
|
||||
.. toctree:: |
||||
:hidden: |
||||
|
||||
admin |
||||
tracing |
||||
rate_limit |
||||
runtime |
@ -0,0 +1,37 @@ |
||||
.. _config_rate_limit_service: |
||||
|
||||
Rate limit service |
||||
================== |
||||
|
||||
The :ref:`rate limit service <arch_overview_rate_limit>` configuration specifies the global rate |
||||
limit service Envoy should talk to when it needs to make global rate limit decisions. If no rate |
||||
limit service is configured, a "null" service will be used which will always return OK if called. |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"type": "grpc_service", |
||||
"config": { |
||||
"cluster_name": "..." |
||||
} |
||||
} |
||||
|
||||
type |
||||
*(required, string)* Specifies the type of rate limit service to call. Currently the only |
||||
supported option is *grpc_service* which specifies Lyft's global rate limit service and |
||||
associated IDL. |
||||
|
||||
config |
||||
*(required, object)* Specifies type specific configuration for the rate limit service. |
||||
|
||||
cluster_name |
||||
*(required, string)* Specifies the cluster manager cluster name that hosts the rate limit |
||||
service. The client will connect to this cluster when it needs to make rate limit service |
||||
requests. |
||||
|
||||
gRPC service IDL |
||||
---------------- |
||||
|
||||
Envoy expects the rate limit service to support the gRPC IDL specified in |
||||
:repo:`/source/common/ratelimit/ratelimit.proto`. See the IDL documentation for more information |
||||
on how the API works. See Lyft's reference implementation `here <https://github.com/lyft/ratelimit>`_. |
@ -0,0 +1,107 @@ |
||||
.. _config_runtime: |
||||
|
||||
Runtime |
||||
======= |
||||
|
||||
The :ref:`runtime configuration <arch_overview_runtime>` specifies the location of the local file |
||||
system tree that contains re-loadable configuration elements. If runtime is not configured, a "null" |
||||
provider is used which has the effect of using all defaults built into the code. |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"symlink_root": "...", |
||||
"subdirectory": "...", |
||||
"override_subdirectory": "..." |
||||
} |
||||
|
||||
symlink_root |
||||
*(required, string)* The implementation assumes that the file system tree is accessed via a |
||||
symbolic link. An atomic link swap is used when a new tree should be switched to. This |
||||
parameter specifies the path to the symbolic link. Envoy will watch the location for changes |
||||
and reload the file system tree when they happen. |
||||
|
||||
subdirectory |
||||
*(required, string)* Specifies the subdirectory to load within the root directory. This is useful |
||||
if multiple systems share the same delivery mechanism. Envoy configuration elements can be |
||||
contained in a dedicated subdirectory. |
||||
|
||||
.. _config_runtime_override_subdirectory: |
||||
|
||||
override_subdirectory |
||||
*(optional, string)* Specifies an optional subdirectory to load within the root directory. If |
||||
specified and the directory exists, configuration values within this directory will override those |
||||
found in the primary subdirectory. This is useful when Envoy is deployed across many different |
||||
types of servers. Sometimes it is useful to have a per service cluster directory for runtime |
||||
configuration. See below for exactly how the override directory is used. |
||||
|
||||
File system layout |
||||
------------------ |
||||
|
||||
Various sections of the configuration guide describe the runtime settings that are available. |
||||
For example, :ref:`here <config_cluster_manager_cluster_runtime>` are the runtime settings for |
||||
upstream clusters. |
||||
|
||||
Assume that the folder ``/srv/runtime/v1`` points to the actual file system path where global |
||||
runtime configurations are stored. The following would be a typical configuration setting for |
||||
runtime: |
||||
|
||||
* *symlink_root*: ``/srv/runtime/current`` |
||||
* *subdirectory*: ``envoy`` |
||||
* *override_subdirectory*: ``envoy_override`` |
||||
|
||||
Where ``/srv/runtime/current`` is a symbolic link to ``/srv/runtime/v1``. |
||||
|
||||
Each '.' in a runtime key indicates a new directory in the hierarchy, rooted at *symlink_root* + |
||||
*subdirectory*. For example, the *health_check.min_interval* key would have the following full |
||||
file system path (using the symbolic link): |
||||
|
||||
``/srv/runtime/current/envoy/health_check/min_interval`` |
||||
|
||||
The terminal portion of a path is the file. The contents of the file constitute the runtime value. |
||||
When reading numeric values from a file, spaces and new lines will be ignored. |
||||
|
||||
The *override_subdirectory* is used along with the :option:`--service-cluster` CLI option. Assume |
||||
that :option:`--service-cluster` has been set to ``my-cluster``. Envoy will first look for the |
||||
*health_check.min_interval* key in the following full file system path: |
||||
|
||||
``/srv/runtime/current/envoy_override/my-cluster/health_check/min_interval`` |
||||
|
||||
If found, the value will override any value found in the primary lookup path. This allows the user |
||||
to customize the runtime values for individual clusters on top of global defaults. |
||||
|
||||
Comments |
||||
-------- |
||||
|
||||
Lines starting with ``#`` as the first character are treated as comments. |
||||
|
||||
Comments can be used to provide context on an existing value. Comments are also useful in an |
||||
otherwise empty file to keep a placeholder for deployment in a time of need. |
||||
|
||||
Updating runtime values via symbolic link swap |
||||
---------------------------------------------- |
||||
|
||||
There are two steps to update any runtime value. First, create a hard copy of the entire runtime |
||||
tree and update the desired runtime values. Second, atomically swap the symbolic link root from the |
||||
old tree to the new runtime tree, using the equivalent of the following command: |
||||
|
||||
.. code-block:: console |
||||
|
||||
/srv/runtime:~$ ln -s /srv/runtime/v2 new && mv -Tf new current |
||||
|
||||
It's beyond the scope of this document how the file system data is deployed, garbage collected, etc. |
||||
|
||||
Statistics |
||||
---------- |
||||
|
||||
The file system runtime provider emits some statistics in the *runtime.* namespace. |
||||
|
||||
.. csv-table:: |
||||
:header: Name, Type, Description |
||||
:widths: 1, 1, 2 |
||||
|
||||
load_error, Counter, Total number of load attempts that resulted in an error |
||||
override_dir_not_exists, Counter, Total number of loads that did not use an override directory |
||||
override_dir_exists, Counter, Total number of loads that did use an override directory |
||||
load_success, Counter, Total number of load attempts that were successful |
||||
num_keys, Gauge, Number of keys currently loaded |
@ -0,0 +1,69 @@ |
||||
.. _config_tracing: |
||||
|
||||
Tracing |
||||
======= |
||||
|
||||
The :ref:`tracing <arch_overview_tracing>` configuration specifies global settings for the HTTP |
||||
tracer used by Envoy. The configuration is defined on the :ref:`server's top level configuration |
||||
<config_overview>`. Envoy may support other tracers in the future, but right now the HTTP tracer is |
||||
the only one supported. |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"http": { |
||||
"driver": "{...}" |
||||
} |
||||
} |
||||
|
||||
http |
||||
*(optional, object)* Provides configuration for the HTTP tracer. |
||||
|
||||
driver |
||||
*(optional, object)* Provides the driver that handles trace and span creation. |
||||
|
||||
Currently `LightStep <http://lightstep.com/>`_ and `Zipkin |
||||
<http://zipkin.io>`_ drivers are supported. |
||||
|
||||
LightStep driver |
||||
---------------- |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"type": "lightstep", |
||||
"config": { |
||||
"access_token_file": "...", |
||||
"collector_cluster": "..." |
||||
} |
||||
} |
||||
|
||||
access_token_file |
||||
*(required, string)* File containing the access token to the `LightStep <http://lightstep.com/>`_ |
||||
API. |
||||
|
||||
collector_cluster |
||||
*(required, string)* The cluster manager cluster that hosts the LightStep collectors. |
||||
|
||||
|
||||
Zipkin driver |
||||
------------- |
||||
|
||||
.. code-block:: json |
||||
|
||||
{ |
||||
"type": "zipkin", |
||||
"config": { |
||||
"collector_cluster": "...", |
||||
"collector_endpoint": "..." |
||||
} |
||||
} |
||||
|
||||
collector_cluster |
||||
*(required, string)* The cluster manager cluster that hosts the Zipkin collectors. Note that the |
||||
Zipkin cluster must be defined under `clusters` in the cluster manager configuration section. |
||||
|
||||
collector_endpoint |
||||
*(optional, string)* The API endpoint of the Zipkin service where the |
||||
spans will be sent. When using a standard Zipkin installation, the |
||||
API endpoint is typically `/api/v1/spans`, which is the default value. |
@ -0,0 +1,170 @@ |
||||
.. _config_tools_router_check_tool: |
||||
|
||||
Route table check tool |
||||
====================== |
||||
|
||||
**NOTE: The following configuration is for the route table check tool only and is not part of the Envoy binary. |
||||
The route table check tool is a standalone binary that can be used to verify Envoy's routing for a given configuration |
||||
file.** |
||||
|
||||
The following specifies input to the route table check tool. The route table check tool checks if |
||||
the route returned by a :ref:`router <config_http_conn_man_route_table>` matches what is expected. |
||||
The tool can be used to check cluster name, virtual cluster name, |
||||
virtual host name, manual path rewrite, manual host rewrite, path redirect, and |
||||
header field matches. Extensions for other test cases can be added. Details about installing the tool |
||||
and sample tool input/output can be found at :ref:`installation <install_tools_route_table_check_tool>`. |
||||
|
||||
The route table check tool config is composed of an array of json test objects. Each test object is composed of |
||||
three parts. |
||||
|
||||
Test name |
||||
This field specifies the name of each test object. |
||||
|
||||
Input values |
||||
The input value fields specify the parameters to be passed to the router. Example input fields include |
||||
the :authority, :path, and :method header fields. The :authority and :path fields specify the url |
||||
sent to the router and are required. All other input fields are optional. |
||||
|
||||
Validate |
||||
The validate fields specify the expected values and test cases to check. At least one test |
||||
case is required. |
||||
|
||||
A simple tool configuration json has one test case and is writen as follows. The test |
||||
expects a cluster name match of "instant-server".:: |
||||
|
||||
[ |
||||
{ |
||||
"test_name: "Cluster_name_test", |
||||
"input": |
||||
{ |
||||
":authority":"api.lyft.com", |
||||
":path": "/api/locations" |
||||
} |
||||
"validate" |
||||
{ |
||||
"cluster_name": "instant-server" |
||||
} |
||||
} |
||||
] |
||||
|
||||
.. code-block:: json |
||||
|
||||
[ |
||||
{ |
||||
"test_name": "...", |
||||
"input": |
||||
{ |
||||
":authority": "...", |
||||
":path": "...", |
||||
":method": "...", |
||||
"internal" : "...", |
||||
"random_value" : "...", |
||||
"ssl" : "...", |
||||
"additional_headers": [ |
||||
{ |
||||
"field": "...", |
||||
"value": "..." |
||||
}, |
||||
{ |
||||
"..." |
||||
} |
||||
] |
||||
} |
||||
"validate": { |
||||
"cluster_name": "...", |
||||
"virtual_cluster_name": "...", |
||||
"virtual_host_name": "...", |
||||
"host_rewrite": "...", |
||||
"path_rewrite": "...", |
||||
"path_redirect": "...", |
||||
"header_fields" : [ |
||||
{ |
||||
"field": "...", |
||||
"value": "..." |
||||
}, |
||||
{ |
||||
"..." |
||||
} |
||||
] |
||||
} |
||||
}, |
||||
{ |
||||
"..." |
||||
} |
||||
] |
||||
|
||||
test_name |
||||
*(required, string)* The name of a test object. |
||||
|
||||
input |
||||
*(required, object)* Input values sent to the router that determine the returned route. |
||||
|
||||
:authority |
||||
*(required, string)* The url authority. This value along with the path parameter define |
||||
the url to be matched. An example authority value is "api.lyft.com". |
||||
|
||||
:path |
||||
*(required, string)* The url path. An example path value is "/foo". |
||||
|
||||
:method |
||||
*(optional, string)* The request method. If not specified, the default method is GET. The options |
||||
are GET, PUT, or POST. |
||||
|
||||
internal |
||||
*(optional, boolean)* A flag that determines whether to set x-envoy-internal to "true". |
||||
If not specified, or if internal is equal to false, x-envoy-internal is not set. |
||||
|
||||
random_value |
||||
*(optional, integer)* An integer used to identify the target for weighted cluster selection. |
||||
The default value of random_value is 0. |
||||
|
||||
ssl |
||||
*(optional, boolean)* A flag that determines whether to set x-forwarded-proto to https or http. |
||||
By setting x-forwarded-proto to a given protocol, the tool is able to simulate the behavior of |
||||
a client issuing a request via http or https. By default ssl is false which corresponds to |
||||
x-forwarded-proto set to http. |
||||
|
||||
additional_headers |
||||
*(optional, array)* Additional headers to be added as input for route determination. The ":authority", |
||||
":path", ":method", "x-forwarded-proto", and "x-envoy-internal" fields are specified by the other config |
||||
options and should not be set here. |
||||
|
||||
field |
||||
*(required, string)* The name of the header field to add. |
||||
|
||||
value |
||||
*(required, string)* The value of the header field to add. |
||||
|
||||
validate |
||||
*(required, object)* The validate object specifies the returned route parameters to match. At least one |
||||
test parameter must be specificed. Use "" (empty string) to indicate that no return value is expected. |
||||
For example, to test that no cluster match is expected use {"cluster_name": ""}. |
||||
|
||||
cluster_name |
||||
*(optional, string)* Match the cluster name. |
||||
|
||||
virutal_cluster_name |
||||
*(optional, string)* Match the virtual cluster name. |
||||
|
||||
virtual_host_name |
||||
*(optional, string)* Match the virtual host name. |
||||
|
||||
host_rewrite |
||||
*(optional, string)* Match the host header field after rewrite. |
||||
|
||||
path_rewrite |
||||
*(optional, string)* Match the path header field after rewrite. |
||||
|
||||
path_redirect |
||||
*(optional, string)* Match the returned redirect path. |
||||
|
||||
header_fields |
||||
*(optional, array)* Match the listed header fields. Examples header fields include the ":path", "cookie", |
||||
and "date" fields. The header fields are checked after all other test cases. Thus, the header fields checked |
||||
will be those of the redirected or rewriten routes when applicable. |
||||
|
||||
field |
||||
*(required, string)* The name of the header field to match. |
||||
|
||||
value |
||||
*(required, string)* The value of the header field to match. |
@ -0,0 +1,10 @@ |
||||
.. _extending: |
||||
|
||||
Extending Envoy for custom use cases |
||||
==================================== |
||||
|
||||
The Envoy architecture makes it fairly easily extensible via both :ref:`network filters |
||||
<arch_overview_network_filters>` and :ref:`HTTP filters <arch_overview_http_filters>`. |
||||
|
||||
An example of how to add a network filter and structure the repository and build dependencies can |
||||
be found at `envoy-filter-example <https://github.com/envoyproxy/envoy-filter-example>`_. |
After Width: | Height: | Size: 66 KiB |
@ -0,0 +1,13 @@ |
||||
Envoy documentation |
||||
================================= |
||||
|
||||
.. toctree:: |
||||
:maxdepth: 2 |
||||
|
||||
about_docs |
||||
intro/intro |
||||
install/install |
||||
configuration/configuration |
||||
operations/operations |
||||
extending/extending |
||||
api/api |
@ -0,0 +1,8 @@ |
||||
Building |
||||
======== |
||||
|
||||
The Envoy build system uses Bazel. In order to ease initial building and for a quick start, we |
||||
provide an Ubuntu 16 based docker container that has everything needed inside of it to build |
||||
and *statically link* envoy, see :repo:`ci/README.md`. |
||||
|
||||
In order to build manually, follow the instructions at :repo:`bazel/README.md`. |
@ -0,0 +1,14 @@ |
||||
.. _install: |
||||
|
||||
Building and installation |
||||
========================= |
||||
|
||||
.. toctree:: |
||||
:maxdepth: 2 |
||||
|
||||
requirements |
||||
building |
||||
installation |
||||
ref_configs |
||||
sandboxes/sandboxes.rst |
||||
tools/tools |
@ -0,0 +1,6 @@ |
||||
Installation |
||||
============ |
||||
|
||||
Currently we do not provide any pre-compiled binaries or startup scripts. Typically Envoy will be |
||||
used with the :ref:`hot restart wrapper <operations_hot_restarter>` for launching. In the future we |
||||
may provide OS specific deployment packages. |
@ -0,0 +1,70 @@ |
||||
.. _install_ref_configs: |
||||
|
||||
Reference configurations |
||||
======================== |
||||
|
||||
The source distribution includes a set of example configuration templates for each of the three |
||||
major Envoy deployment types: |
||||
|
||||
* :ref:`Service to service <deployment_type_service_to_service>` |
||||
* :ref:`Front proxy <deployment_type_front_proxy>` |
||||
* :ref:`Double proxy <deployment_type_double_proxy>` |
||||
|
||||
The goal of this set of example configurations is to demonstrate the full capabilities of Envoy in |
||||
a complex deployment. All features will not be applicable to all use cases. For full documentation |
||||
see the :ref:`configuration reference <config>`. |
||||
|
||||
Configuration generator |
||||
----------------------- |
||||
|
||||
Envoy configurations can become relatively complicated. At Lyft we use `jinja |
||||
<http://jinja.pocoo.org/>`_ templating to make the configurations easier to create and manage. The |
||||
source distribution includes a version of the configuration generator that loosely approximates what |
||||
we use at Lyft. We have also included three example configuration templates for each of the above |
||||
three scenarios. |
||||
|
||||
* Generator script: :repo:`configs/configgen.py` |
||||
* Service to service template: :repo:`configs/envoy_service_to_service.template.json` |
||||
* Front proxy template: :repo:`configs/envoy_front_proxy.template.json` |
||||
* Double proxy template: :repo:`configs/envoy_double_proxy.template.json` |
||||
|
||||
To generate the example configurations run the following from the root of the repo: |
||||
|
||||
.. code-block:: console |
||||
|
||||
mkdir -p generated/configs |
||||
bazel build //configs:example_configs |
||||
tar xvf $PWD/bazel-genfiles/configs/example_configs.tar -C generated/configs |
||||
|
||||
The previous command will produce three fully expanded configurations using some variables |
||||
defined inside of `configgen.py`. See the comments inside of `configgen.py` for detailed |
||||
information on how the different expansions work. |
||||
|
||||
A few notes about the example configurations: |
||||
|
||||
* An instance of :ref:`service discovery service <arch_overview_service_discovery_sds>` is assumed |
||||
to be running at `discovery.yourcompany.net`. |
||||
* DNS for `yourcompany.net` is assumed to be setup for various things. Search the configuration |
||||
templates for different instances of this. |
||||
* Tracing is configured for `LightStep <http://lightstep.com/>`_. To |
||||
disable this or enable `Zipkin <http://zipkin.io>` tracing, delete or |
||||
change the :ref:`tracing configuration <config_tracing>` accordingly. |
||||
* The configuration demonstrates the use of a :ref:`global rate limiting service |
||||
<arch_overview_rate_limit>`. To disable this delete the :ref:`rate limit configuration |
||||
<config_rate_limit_service>`. |
||||
* :ref:`Route discovery service <config_http_conn_man_rds>` is configured for the service to service |
||||
reference configuration and it is assumed to be running at `rds.yourcompany.net`. |
||||
* :ref:`Cluster discovery service <config_cluster_manager_cds>` is configured for the service to |
||||
service reference configuration and it is assumed that be running at `cds.yourcompany.net`. |
||||
|
||||
Smoketest configuration |
||||
----------------------- |
||||
|
||||
A very minimal Envoy configuration that can be used to validate basic plain HTTP proxying is |
||||
available in :repo:`configs/google_com_proxy.json`. This is not intended to represent a realistic |
||||
Envoy deployment. To smoketest Envoy with this, run: |
||||
|
||||
.. code-block:: console |
||||
|
||||
build/source/exe/envoy -c configs/google_com_proxy.json -l debug |
||||
curl -v localhost:10000 |
@ -0,0 +1,37 @@ |
||||
.. _install_requirements: |
||||
|
||||
Requirements |
||||
============ |
||||
|
||||
Envoy was initially developed and deployed on Ubuntu 14 LTS. It should work on any reasonably |
||||
recent Linux including Ubuntu 16 LTS. |
||||
|
||||
Envoy has the following requirements: |
||||
|
||||
* GCC 5+ (for C++14 support) |
||||
* `backward <https://github.com/bombela/backward-cpp>`_ (last tested with 1.3) |
||||
* `Bazel <https://github.com/bazelbuild/bazel>`_ (last tested with 0.5.3) |
||||
* `BoringSSL <https://boringssl.googlesource.com/boringssl>`_ (last tested with sha ae9f0616c58bddcbe7a6d80d29d796bee9aaff2e) |
||||
* `c-ares <https://github.com/c-ares/c-ares>`_ (last tested with 1.13.0) |
||||
* `spdlog <https://github.com/gabime/spdlog>`_ (last tested with 0.14.0) |
||||
* `fmtlib <https://github.com/fmtlib/fmt/>`_ (last tested with 4.0.0) |
||||
* `gperftools <https://github.com/gperftools/gperftools>`_ (last tested with 2.6.1) |
||||
* `http-parser <https://github.com/nodejs/http-parser>`_ (last tested with 2.7.1) |
||||
* `libevent <http://libevent.org/>`_ (last tested with 2.1.8) |
||||
* `lightstep-tracer-cpp <https://github.com/lightstep/lightstep-tracer-cpp/>`_ (last tested with 0.36) |
||||
* `luajit <http://luajit.org/>`_ (last tested with 2.0.5) |
||||
* `nghttp2 <https://github.com/nghttp2/nghttp2>`_ (last tested with 1.25.0) |
||||
* `protobuf <https://github.com/google/protobuf>`_ (last tested with 3.4.0) |
||||
* `tclap <http://tclap.sourceforge.net/>`_ (last tested with 1.2.1) |
||||
* `rapidjson <https://github.com/miloyip/rapidjson/>`_ (last tested with 1.1.0) |
||||
* `xxHash <https://github.com/Cyan4973/xxHash>`_ (last tested with 0.6.3) |
||||
* `yaml-cpp <https://github.com/jbeder/yaml-cpp>`_ (last tested with sha e2818c423e5058a02f46ce2e519a82742a8ccac9) |
||||
* `zlib <https://github.com/madler/zlib>`_ (last tested with 1.2.11) |
||||
|
||||
In order to compile and run the tests the following is required: |
||||
|
||||
* `googletest <https://github.com/google/googletest>`_ (last tested with sha 43863938377a9ea1399c0596269e0890b5c5515a) |
||||
|
||||
In order to run code coverage the following is required: |
||||
|
||||
* `gcovr <http://gcovr.com/>`_ (last tested with 3.3) |
@ -0,0 +1,228 @@ |
||||
.. _install_sandboxes_front_proxy: |
||||
|
||||
Front Proxy |
||||
=========== |
||||
|
||||
To get a flavor of what Envoy has to offer as a front proxy, we are releasing a |
||||
`docker compose <https://docs.docker.com/compose/>`_ sandbox that deploys a front |
||||
envoy and a couple of services (simple flask apps) colocated with a running |
||||
service envoy. The three containers will be deployed inside a virtual network |
||||
called ``envoymesh``. |
||||
|
||||
Below you can see a graphic showing the docker compose deployment: |
||||
|
||||
.. image:: /_static/docker_compose_v0.1.svg |
||||
:width: 100% |
||||
|
||||
All incoming requests are routed via the front envoy, which is acting as a reverse proxy sitting on |
||||
the edge of the ``envoymesh`` network. Port ``80`` is mapped to port ``8000`` by docker compose |
||||
(see :repo:`/examples/front-proxy/docker-compose.yml`). Moreover, notice |
||||
that all traffic routed by the front envoy to the service containers is actually routed to the |
||||
service envoys (routes setup in :repo:`/examples/front-proxy/front-envoy.json`). In turn the service |
||||
envoys route the request to the flask app via the loopback address (routes setup in |
||||
:repo:`/examples/front-proxy/service-envoy.json`). This setup |
||||
illustrates the advantage of running service envoys collocated with your services: all requests are |
||||
handled by the service envoy, and efficiently routed to your services. |
||||
|
||||
Running the Sandbox |
||||
~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
The following documentation runs through the setup of an envoy cluster organized |
||||
as is described in the image above. |
||||
|
||||
**Step 1: Install Docker** |
||||
|
||||
Ensure that you have a recent versions of ``docker, docker-compose`` and |
||||
``docker-machine`` installed. |
||||
|
||||
A simple way to achieve this is via the `Docker Toolbox <https://www.docker.com/products/docker-toolbox>`_. |
||||
|
||||
**Step 2: Docker Machine setup** |
||||
|
||||
First let's create a new machine which will hold the containers:: |
||||
|
||||
$ docker-machine create --driver virtualbox default |
||||
$ eval $(docker-machine env default) |
||||
|
||||
**Step 4: Clone the Envoy repo, and start all of our containers** |
||||
|
||||
If you have not cloned the envoy repo, clone it with ``git clone git@github.com:envoyproxy/envoy`` |
||||
or ``git clone https://github.com/envoyproxy/envoy.git``:: |
||||
|
||||
$ pwd |
||||
envoy/examples/front-proxy |
||||
$ docker-compose up --build -d |
||||
$ docker-compose ps |
||||
Name Command State Ports |
||||
------------------------------------------------------------------------------------------------------------- |
||||
example_service1_1 /bin/sh -c /usr/local/bin/ ... Up 80/tcp |
||||
example_service2_1 /bin/sh -c /usr/local/bin/ ... Up 80/tcp |
||||
example_front-envoy_1 /bin/sh -c /usr/local/bin/ ... Up 0.0.0.0:8000->80/tcp, 0.0.0.0:8001->8001/tcp |
||||
|
||||
**Step 5: Test Envoy's routing capabilities** |
||||
|
||||
You can now send a request to both services via the front-envoy. |
||||
|
||||
For service1:: |
||||
|
||||
$ curl -v $(docker-machine ip default):8000/service/1 |
||||
* Trying 192.168.99.100... |
||||
* Connected to 192.168.99.100 (192.168.99.100) port 8000 (#0) |
||||
> GET /service/1 HTTP/1.1 |
||||
> Host: 192.168.99.100:8000 |
||||
> User-Agent: curl/7.43.0 |
||||
> Accept: */* |
||||
> |
||||
< HTTP/1.1 200 OK |
||||
< content-type: text/html; charset=utf-8 |
||||
< content-length: 89 |
||||
< x-envoy-upstream-service-time: 1 |
||||
< server: envoy |
||||
< date: Fri, 26 Aug 2016 19:39:19 GMT |
||||
< x-envoy-protocol-version: HTTP/1.1 |
||||
< |
||||
Hello from behind Envoy (service 1)! hostname: f26027f1ce28 resolvedhostname: 172.19.0.6 |
||||
* Connection #0 to host 192.168.99.100 left intact |
||||
|
||||
For service2:: |
||||
|
||||
$ curl -v $(docker-machine ip default):8000/service/2 |
||||
* Trying 192.168.99.100... |
||||
* Connected to 192.168.99.100 (192.168.99.100) port 8000 (#0) |
||||
> GET /service/2 HTTP/1.1 |
||||
> Host: 192.168.99.100:8000 |
||||
> User-Agent: curl/7.43.0 |
||||
> Accept: */* |
||||
> |
||||
< HTTP/1.1 200 OK |
||||
< content-type: text/html; charset=utf-8 |
||||
< content-length: 89 |
||||
< x-envoy-upstream-service-time: 2 |
||||
< server: envoy |
||||
< date: Fri, 26 Aug 2016 19:39:23 GMT |
||||
< x-envoy-protocol-version: HTTP/1.1 |
||||
< |
||||
Hello from behind Envoy (service 2)! hostname: 92f4a3737bbc resolvedhostname: 172.19.0.2 |
||||
* Connection #0 to host 192.168.99.100 left intact |
||||
|
||||
Notice that each request, while sent to the front envoy, was correctly routed |
||||
to the respective application. |
||||
|
||||
**Step 6: Test Envoy's load balancing capabilities** |
||||
|
||||
Now let's scale up our service1 nodes to demonstrate the clustering abilities |
||||
of envoy.:: |
||||
|
||||
$ docker-compose scale service1=3 |
||||
Creating and starting example_service1_2 ... done |
||||
Creating and starting example_service1_3 ... done |
||||
|
||||
Now if we send a request to service1 multiple times, the front envoy will load balance the |
||||
requests by doing a round robin of the three service1 machines:: |
||||
|
||||
$ curl -v $(docker-machine ip default):8000/service/1 |
||||
* Trying 192.168.99.100... |
||||
* Connected to 192.168.99.100 (192.168.99.100) port 8000 (#0) |
||||
> GET /service/1 HTTP/1.1 |
||||
> Host: 192.168.99.100:8000 |
||||
> User-Agent: curl/7.43.0 |
||||
> Accept: */* |
||||
> |
||||
< HTTP/1.1 200 OK |
||||
< content-type: text/html; charset=utf-8 |
||||
< content-length: 89 |
||||
< x-envoy-upstream-service-time: 1 |
||||
< server: envoy |
||||
< date: Fri, 26 Aug 2016 19:40:21 GMT |
||||
< x-envoy-protocol-version: HTTP/1.1 |
||||
< |
||||
Hello from behind Envoy (service 1)! hostname: 85ac151715c6 resolvedhostname: 172.19.0.3 |
||||
* Connection #0 to host 192.168.99.100 left intact |
||||
$ curl -v $(docker-machine ip default):8000/service/1 |
||||
* Trying 192.168.99.100... |
||||
* Connected to 192.168.99.100 (192.168.99.100) port 8000 (#0) |
||||
> GET /service/1 HTTP/1.1 |
||||
> Host: 192.168.99.100:8000 |
||||
> User-Agent: curl/7.43.0 |
||||
> Accept: */* |
||||
> |
||||
< HTTP/1.1 200 OK |
||||
< content-type: text/html; charset=utf-8 |
||||
< content-length: 89 |
||||
< x-envoy-upstream-service-time: 1 |
||||
< server: envoy |
||||
< date: Fri, 26 Aug 2016 19:40:22 GMT |
||||
< x-envoy-protocol-version: HTTP/1.1 |
||||
< |
||||
Hello from behind Envoy (service 1)! hostname: 20da22cfc955 resolvedhostname: 172.19.0.5 |
||||
* Connection #0 to host 192.168.99.100 left intact |
||||
$ curl -v $(docker-machine ip default):8000/service/1 |
||||
* Trying 192.168.99.100... |
||||
* Connected to 192.168.99.100 (192.168.99.100) port 8000 (#0) |
||||
> GET /service/1 HTTP/1.1 |
||||
> Host: 192.168.99.100:8000 |
||||
> User-Agent: curl/7.43.0 |
||||
> Accept: */* |
||||
> |
||||
< HTTP/1.1 200 OK |
||||
< content-type: text/html; charset=utf-8 |
||||
< content-length: 89 |
||||
< x-envoy-upstream-service-time: 1 |
||||
< server: envoy |
||||
< date: Fri, 26 Aug 2016 19:40:24 GMT |
||||
< x-envoy-protocol-version: HTTP/1.1 |
||||
< |
||||
Hello from behind Envoy (service 1)! hostname: f26027f1ce28 resolvedhostname: 172.19.0.6 |
||||
* Connection #0 to host 192.168.99.100 left intact |
||||
|
||||
**Step 7: enter containers and curl services** |
||||
|
||||
In addition of using ``curl`` from your host machine, you can also enter the |
||||
containers themselves and ``curl`` from inside them. To enter a container you |
||||
can use ``docker-compose exec <container_name> /bin/bash``. For example we can |
||||
enter the ``front-envoy`` container, and ``curl`` for services locally:: |
||||
|
||||
$ docker-compose exec front-envoy /bin/bash |
||||
root@81288499f9d7:/# curl localhost:80/service/1 |
||||
Hello from behind Envoy (service 1)! hostname: 85ac151715c6 resolvedhostname: 172.19.0.3 |
||||
root@81288499f9d7:/# curl localhost:80/service/1 |
||||
Hello from behind Envoy (service 1)! hostname: 20da22cfc955 resolvedhostname: 172.19.0.5 |
||||
root@81288499f9d7:/# curl localhost:80/service/1 |
||||
Hello from behind Envoy (service 1)! hostname: f26027f1ce28 resolvedhostname: 172.19.0.6 |
||||
root@81288499f9d7:/# curl localhost:80/service/2 |
||||
Hello from behind Envoy (service 2)! hostname: 92f4a3737bbc resolvedhostname: 172.19.0.2 |
||||
|
||||
**Step 8: enter containers and curl admin** |
||||
|
||||
When envoy runs it also attaches an ``admin`` to your desired port. In the example |
||||
configs the admin is bound to port ``8001``. We can ``curl`` it to gain useful information. |
||||
For example you can ``curl`` ``/server_info`` to get information about the |
||||
envoy version you are running. Addionally you can ``curl`` ``/stats`` to get |
||||
statistics. For example inside ``frontenvoy`` we can get:: |
||||
|
||||
$ docker-compose exec front-envoy /bin/bash |
||||
root@e654c2c83277:/# curl localhost:8001/server_info |
||||
envoy 10e00b/RELEASE live 142 142 0 |
||||
root@e654c2c83277:/# curl localhost:8001/stats |
||||
cluster.service1.external.upstream_rq_200: 7 |
||||
... |
||||
cluster.service1.membership_change: 2 |
||||
cluster.service1.membership_total: 3 |
||||
... |
||||
cluster.service1.upstream_cx_http2_total: 3 |
||||
... |
||||
cluster.service1.upstream_rq_total: 7 |
||||
... |
||||
cluster.service2.external.upstream_rq_200: 2 |
||||
... |
||||
cluster.service2.membership_change: 1 |
||||
cluster.service2.membership_total: 1 |
||||
... |
||||
cluster.service2.upstream_cx_http2_total: 1 |
||||
... |
||||
cluster.service2.upstream_rq_total: 2 |
||||
... |
||||
|
||||
Notice that we can get the number of members of upstream clusters, number of requests |
||||
fulfilled by them, information about http ingress, and a plethora of other useful |
||||
stats. |
@ -0,0 +1,68 @@ |
||||
.. _install_sandboxes_grpc_bridge: |
||||
|
||||
gRPC Bridge |
||||
=========== |
||||
|
||||
Envoy gRPC |
||||
~~~~~~~~~~ |
||||
|
||||
The gRPC bridge sandbox is an example usage of Envoy's |
||||
:ref:`gRPC bridge filter <config_http_filters_grpc_bridge>`. |
||||
Included in the sandbox is a gRPC in-memory Key/Value store with a Python HTTP |
||||
client. The Python client makes HTTP/1 requests through the Envoy sidecar |
||||
process which are upgraded into HTTP/2 gRPC requests. Response trailers are then |
||||
buffered and sent back to the client as a HTTP/1 header payload. |
||||
|
||||
Another Envoy feature demonstrated in this example is Envoy's ability to do authority |
||||
base routing via its route configuration. |
||||
|
||||
Building the Go service |
||||
~~~~~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
To build the Go gRPC service run:: |
||||
|
||||
$ pwd |
||||
envoy/examples/grpc-bridge |
||||
$ script/bootstrap |
||||
$ script/build |
||||
|
||||
Note: ``build`` requires that your Envoy codebase (or a working copy thereof) is in ``$GOPATH/src/github.com/envoyproxy/envoy``. |
||||
|
||||
Docker compose |
||||
~~~~~~~~~~~~~~ |
||||
|
||||
To run the docker compose file, and set up both the Python and the gRPC containers |
||||
run:: |
||||
|
||||
$ pwd |
||||
envoy/examples/grpc-bridge |
||||
$ docker-compose up --build |
||||
|
||||
Sending requests to the Key/Value store |
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
To use the Python service and send gRPC requests:: |
||||
|
||||
$ pwd |
||||
envoy/examples/grpc-bridge |
||||
# set a key |
||||
$ docker-compose exec python /client/client.py set foo bar |
||||
setf foo to bar |
||||
|
||||
# get a key |
||||
$ docker-compose exec python /client/client.py get foo |
||||
bar |
||||
|
||||
# modify an existing key |
||||
$ docker-compose exec python /client/client.py set foo baz |
||||
setf foo to baz |
||||
|
||||
# get the modified key |
||||
$ docker-compose exec python /client/client.py get foo |
||||
baz |
||||
|
||||
In the running docker-compose container, you should see the gRPC service printing a record of its activity:: |
||||
|
||||
grpc_1 | 2017/05/30 12:05:09 set: foo = bar |
||||
grpc_1 | 2017/05/30 12:05:12 get: foo |
||||
grpc_1 | 2017/05/30 12:05:18 set: foo = baz |
@ -0,0 +1,81 @@ |
||||
.. _install_sandboxes_jaeger_tracing: |
||||
|
||||
Jaeger Tracing |
||||
============== |
||||
|
||||
The Jaeger tracing sandbox demonstrates Envoy's :ref:`request tracing <arch_overview_tracing>` |
||||
capabilities using `Jaeger <https://uber.github.io/jaeger/>`_ as the tracing provider. This sandbox |
||||
is very similar to the front proxy architecture described above, with one difference: |
||||
service1 makes an API call to service2 before returning a response. |
||||
The three containers will be deployed inside a virtual network called ``envoymesh``. |
||||
|
||||
All incoming requests are routed via the front envoy, which is acting as a reverse proxy |
||||
sitting on the edge of the ``envoymesh`` network. Port ``80`` is mapped to port ``8000`` |
||||
by docker compose (see :repo:`/examples/jaeger-tracing/docker-compose.yml`). Notice that |
||||
all envoys are configured to collect request traces (e.g., http_connection_manager/config/tracing setup in |
||||
:repo:`/examples/jaeger-tracing/front-envoy-jaeger.json`) and setup to propagate the spans generated |
||||
by the Jaeger tracer to a Jaeger cluster (trace driver setup |
||||
in :repo:`/examples/jaeger-tracing/front-envoy-jaeger.json`). |
||||
|
||||
Before routing a request to the appropriate service envoy or the application, Envoy will take |
||||
care of generating the appropriate spans for tracing (parent/child context spans). |
||||
At a high-level, each span records the latency of upstream API calls as well as information |
||||
needed to correlate the span with other related spans (e.g., the trace ID). |
||||
|
||||
One of the most important benefits of tracing from Envoy is that it will take care of |
||||
propagating the traces to the Jaeger service cluster. However, in order to fully take advantage |
||||
of tracing, the application has to propagate trace headers that Envoy generates, while making |
||||
calls to other services. In the sandbox we have provided, the simple flask app |
||||
(see trace function in :repo:`/examples/front-proxy/service.py`) acting as service1 propagates |
||||
the trace headers while making an outbound call to service2. |
||||
|
||||
|
||||
Running the Sandbox |
||||
~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
The following documentation runs through the setup of an envoy cluster organized |
||||
as is described in the image above. |
||||
|
||||
**Step 1: Build the sandbox** |
||||
|
||||
To build this sandbox example, and start the example apps run the following commands:: |
||||
|
||||
$ pwd |
||||
envoy/examples/jaeger-tracing |
||||
$ docker-compose up --build -d |
||||
$ docker-compose ps |
||||
Name Command State Ports |
||||
------------------------------------------------------------------------------------------------------------- |
||||
jaegertracing_service1_1 /bin/sh -c /usr/local/bin/ ... Up 80/tcp |
||||
jaegertracing_service2_1 /bin/sh -c /usr/local/bin/ ... Up 80/tcp |
||||
jaegertracing_front-envoy_1 /bin/sh -c /usr/local/bin/ ... Up 0.0.0.0:8000->80/tcp, 0.0.0.0:8001->8001/tcp |
||||
|
||||
**Step 2: Generate some load** |
||||
|
||||
You can now send a request to service1 via the front-envoy as follows:: |
||||
|
||||
$ curl -v $(docker-machine ip default):8000/trace/1 |
||||
* Trying 192.168.99.100... |
||||
* Connected to 192.168.99.100 (192.168.99.100) port 8000 (#0) |
||||
> GET /trace/1 HTTP/1.1 |
||||
> Host: 192.168.99.100:8000 |
||||
> User-Agent: curl/7.43.0 |
||||
> Accept: */* |
||||
> |
||||
< HTTP/1.1 200 OK |
||||
< content-type: text/html; charset=utf-8 |
||||
< content-length: 89 |
||||
< x-envoy-upstream-service-time: 1 |
||||
< server: envoy |
||||
< date: Fri, 26 Aug 2016 19:39:19 GMT |
||||
< x-envoy-protocol-version: HTTP/1.1 |
||||
< |
||||
Hello from behind Envoy (service 1)! hostname: f26027f1ce28 resolvedhostname: 172.19.0.6 |
||||
* Connection #0 to host 192.168.99.100 left intact |
||||
|
||||
**Step 3: View the traces in Jaeger UI** |
||||
|
||||
Point your browser to http://localhost:16686 . You should see the Jaeger dashboard. |
||||
Set the service to "front-proxy" and hit 'Find Traces'. You should see traces from the front-proxy. |
||||
Click on a trace to explore the path taken by the request from front-proxy to service1 |
||||
to service2, as well as the latency incurred at each hop. |
@ -0,0 +1,35 @@ |
||||
.. _install_sandboxes_local_docker_build: |
||||
|
||||
Building an Envoy Docker image |
||||
============================== |
||||
|
||||
The following steps guide you through building your own Envoy binary, and |
||||
putting that in a clean Ubuntu container. |
||||
|
||||
**Step 1: Build Envoy** |
||||
|
||||
Using ``envoyproxy/envoy-build`` you will compile Envoy. |
||||
This image has all software needed to build Envoy. From your Envoy directory:: |
||||
|
||||
$ pwd |
||||
src/envoy |
||||
$ ./ci/run_envoy_docker.sh './ci/do_ci.sh bazel.release' |
||||
|
||||
That command will take some time to run because it is compiling an Envoy binary and running tests. |
||||
|
||||
For more information on building and different build targets, please refer to :repo:`ci/README.md`. |
||||
|
||||
**Step 2: Build image with only envoy binary** |
||||
|
||||
In this step we'll build an image that only has the Envoy binary, and none |
||||
of the software used to build it.:: |
||||
|
||||
$ pwd |
||||
src/envoy/ |
||||
$ docker build -f ci/Dockerfile-envoy-image -t envoy . |
||||
|
||||
Now you can use this ``envoy`` image to build the any of the sandboxes if you change |
||||
the ``FROM`` line in any Dockerfile. |
||||
|
||||
This will be particularly useful if you are interested in modifying Envoy, and testing |
||||
your changes. |
@ -0,0 +1,17 @@ |
||||
.. _install_sandboxes: |
||||
|
||||
Sandboxes |
||||
========= |
||||
|
||||
The docker-compose sandboxes give you different environments to test out Envoy's |
||||
features. As we gauge people's interests we will add more sandboxes demonstrating |
||||
different features. The following sandboxes are available: |
||||
|
||||
.. toctree:: |
||||
:maxdepth: 1 |
||||
|
||||
front_proxy |
||||
zipkin_tracing |
||||
jaeger_tracing |
||||
grpc_bridge |
||||
local_docker_build |
@ -0,0 +1,82 @@ |
||||
.. _install_sandboxes_zipkin_tracing: |
||||
|
||||
Zipkin Tracing |
||||
============== |
||||
|
||||
The Zipkin tracing sandbox demonstrates Envoy's :ref:`request tracing <arch_overview_tracing>` |
||||
capabilities using `Zipkin <http://zipkin.io/>`_ as the tracing provider. This sandbox |
||||
is very similar to the front proxy architecture described above, with one difference: |
||||
service1 makes an API call to service2 before returning a response. |
||||
The three containers will be deployed inside a virtual network called ``envoymesh``. |
||||
|
||||
All incoming requests are routed via the front envoy, which is acting as a reverse proxy |
||||
sitting on the edge of the ``envoymesh`` network. Port ``80`` is mapped to port ``8000`` |
||||
by docker compose (see :repo:`/examples/zipkin-tracing/docker-compose.yml`). Notice that |
||||
all envoys are configured to collect request traces (e.g., http_connection_manager/config/tracing setup in |
||||
:repo:`/examples/zipkin-tracing/front-envoy-zipkin.json`) and setup to propagate the spans generated |
||||
by the Zipkin tracer to a Zipkin cluster (trace driver setup |
||||
in :repo:`/examples/zipkin-tracing/front-envoy-zipkin.json`). |
||||
|
||||
Before routing a request to the appropriate service envoy or the application, Envoy will take |
||||
care of generating the appropriate spans for tracing (parent/child/shared context spans). |
||||
At a high-level, each span records the latency of upstream API calls as well as information |
||||
needed to correlate the span with other related spans (e.g., the trace ID). |
||||
|
||||
One of the most important benefits of tracing from Envoy is that it will take care of |
||||
propagating the traces to the Zipkin service cluster. However, in order to fully take advantage |
||||
of tracing, the application has to propagate trace headers that Envoy generates, while making |
||||
calls to other services. In the sandbox we have provided, the simple flask app |
||||
(see trace function in :repo:`/examples/front-proxy/service.py`) acting as service1 propagates |
||||
the trace headers while making an outbound call to service2. |
||||
|
||||
|
||||
Running the Sandbox |
||||
~~~~~~~~~~~~~~~~~~~ |
||||
|
||||
The following documentation runs through the setup of an envoy cluster organized |
||||
as is described in the image above. |
||||
|
||||
**Step 1: Build the sandbox** |
||||
|
||||
To build this sandbox example, and start the example apps run the following commands:: |
||||
|
||||
$ pwd |
||||
envoy/examples/zipkin-tracing |
||||
$ docker-compose up --build -d |
||||
$ docker-compose ps |
||||
Name Command State Ports |
||||
------------------------------------------------------------------------------------------------------------- |
||||
zipkintracing_service1_1 /bin/sh -c /usr/local/bin/ ... Up 80/tcp |
||||
zipkintracing_service2_1 /bin/sh -c /usr/local/bin/ ... Up 80/tcp |
||||
zipkintracing_front-envoy_1 /bin/sh -c /usr/local/bin/ ... Up 0.0.0.0:8000->80/tcp, 0.0.0.0:8001->8001/tcp |
||||
|
||||
**Step 2: Generate some load** |
||||
|
||||
You can now send a request to service1 via the front-envoy as follows:: |
||||
|
||||
$ curl -v $(docker-machine ip default):8000/trace/1 |
||||
* Trying 192.168.99.100... |
||||
* Connected to 192.168.99.100 (192.168.99.100) port 8000 (#0) |
||||
> GET /trace/1 HTTP/1.1 |
||||
> Host: 192.168.99.100:8000 |
||||
> User-Agent: curl/7.43.0 |
||||
> Accept: */* |
||||
> |
||||
< HTTP/1.1 200 OK |
||||
< content-type: text/html; charset=utf-8 |
||||
< content-length: 89 |
||||
< x-envoy-upstream-service-time: 1 |
||||
< server: envoy |
||||
< date: Fri, 26 Aug 2016 19:39:19 GMT |
||||
< x-envoy-protocol-version: HTTP/1.1 |
||||
< |
||||
Hello from behind Envoy (service 1)! hostname: f26027f1ce28 resolvedhostname: 172.19.0.6 |
||||
* Connection #0 to host 192.168.99.100 left intact |
||||
|
||||
**Step 3: View the traces in Zipkin UI** |
||||
|
||||
Point your browser to http://localhost:9411 . You should see the Zipkin dashboard. |
||||
Set the service to "front-proxy" and set the start time to a few minutes before |
||||
the start of the test (step 2) and hit enter. You should see traces from the front-proxy. |
||||
Click on a trace to explore the path taken by the request from front-proxy to service1 |
||||
to service2, as well as the latency incurred at each hop. |
@ -0,0 +1,30 @@ |
||||
.. _install_tools_config_load_check_tool: |
||||
|
||||
Config load check tool |
||||
====================== |
||||
|
||||
The config load check tool checks that a configuration file in JSON format is written using valid JSON |
||||
and conforms to the Envoy JSON schema. This tool leverages the configuration test in |
||||
``test/config_test/config_test.cc``. The test loads the JSON configuration file and runs server configuration |
||||
initialization with it. |
||||
|
||||
Input |
||||
The tool expects a PATH to the root of a directory that holds JSON Envoy configuration files. The tool |
||||
will recursively go through the file system tree and run a configuration test for each file found. Keep in mind that |
||||
the tool will try to load all files found in the path. |
||||
|
||||
Output |
||||
The tool will output Envoy logs as it initializes the server configuration with the config it is currently testing. |
||||
If there are configuration files where the JSON file is malformed or is does not conform to the Envoy JSON schema, the |
||||
tool will exit with status EXIT_FAILURE. If the tool successfully loads all configuration files found it will |
||||
exit with status EXIT_SUCCESS. |
||||
|
||||
Building |
||||
The tool can be built locally using Bazel. :: |
||||
|
||||
bazel build //test/tools/config_load_check:config_load_check_tool |
||||
|
||||
Running |
||||
The tool takes a path as described above. :: |
||||
|
||||
bazel-bin/test/tools/config_load_check/config_load_check_tool PATH |
@ -0,0 +1,65 @@ |
||||
.. _install_tools_route_table_check_tool: |
||||
|
||||
Route table check tool |
||||
======================= |
||||
|
||||
The route table check tool checks whether the route parameters returned by a router match what is expected. |
||||
The tool can also be used to check whether a path redirect, path rewrite, or host rewrite |
||||
match what is expected. |
||||
|
||||
Input |
||||
The tool expects two input JSON files: |
||||
|
||||
1. A router config JSON file. The router config JSON file schema is found in |
||||
:ref:`config <config_http_conn_man_route_table>`. |
||||
|
||||
2. A tool config JSON file. The tool config JSON file schema is found in |
||||
:ref:`config <config_tools_router_check_tool>`. |
||||
The tool config input file specifies urls (composed of authorities and paths) |
||||
and expected route parameter values. Additonal parameters such as additonal headers are optional. |
||||
|
||||
Output |
||||
The program exits with status EXIT_FAILURE if any test case does not match the expected route parameter |
||||
value. |
||||
|
||||
The ``--details`` option prints out details for each test. The first line indicates the test name. |
||||
|
||||
If a test fails, details of the failed test cases are printed. The first field is the expected |
||||
route parameter value. The second field is the actual route parameter value. The third field indicates |
||||
the parameter that is compared. In the following example, Test_2 and Test_5 failed while the other tests |
||||
passed. In the failed test cases, conflict details are printed. :: |
||||
|
||||
Test_1 |
||||
Test_2 |
||||
default other virtual_host_name |
||||
Test_3 |
||||
Test_4 |
||||
Test_5 |
||||
locations ats cluster_name |
||||
Test_6 |
||||
|
||||
Testing with valid :ref:`runtime values <config_http_conn_man_route_table_route>` is not currently supported, |
||||
this may be added in future work. |
||||
|
||||
Building |
||||
The tool can be built locally using Bazel. :: |
||||
|
||||
bazel build //test/tools/router_check:router_check_tool |
||||
|
||||
Running |
||||
The tool takes two input json files and an optional command line parameter ``--details``. The |
||||
expected order of command line arguements is: |
||||
1. The router configuration json file. |
||||
2. The tool configuration json file. |
||||
3. The optional details flag. :: |
||||
|
||||
bazel-bin/test/tools/router_check/router_check_tool router_config.json tool_config.json |
||||
|
||||
bazel-bin/test/tools/router_check/router_check_tool router_config.json tool_config.json --details |
||||
|
||||
Testing |
||||
A bash shell script test can be run with bazel. The test compares routes using different router and |
||||
tool configuration json files. The configuration json files can be found in |
||||
test/tools/router_check/test/config/... . :: |
||||
|
||||
bazel test //test/tools/router_check/... |
@ -0,0 +1,33 @@ |
||||
.. _install_tools_schema_validator_check_tool: |
||||
|
||||
Schema Validator check tool |
||||
=========================== |
||||
|
||||
The schema validator tool validates that the passed in JSON conforms to a schema in |
||||
the configuration. To validate the entire config, please refer to the |
||||
:ref:`config load check tool<install_tools_config_load_check_tool>`. Currently, only |
||||
:ref:`route config<config_http_conn_man_route_table>` schema validation is supported. |
||||
|
||||
Input |
||||
The tool expects two inputs: |
||||
|
||||
1. The schema type to check the passed in JSON against. The supported type is: |
||||
|
||||
* `route` - for :ref:`route configuration<config_http_conn_man_route_table>` validation. |
||||
|
||||
2. The path to the JSON. |
||||
|
||||
Output |
||||
If the JSON conforms to the schema, the tool will exit with status EXIT_SUCCESS. If the JSON does |
||||
not conform to the schema, an error message is outputted detailing what doesn't conform to the |
||||
schema. The tool will exit with status EXIT_FAILURE. |
||||
|
||||
Building |
||||
The tool can be built locally using Bazel. :: |
||||
|
||||
bazel build //test/tools/schema_validator:schema_validator_tool |
||||
|
||||
Running |
||||
The tool takes a path as described above. :: |
||||
|
||||
bazel-bin/test/tools/schema_validator/schema_validator_tool --schema-type SCHEMA_TYPE --json-path PATH |
@ -0,0 +1,9 @@ |
||||
Tools |
||||
===== |
||||
|
||||
.. toctree:: |
||||
:maxdepth: 2 |
||||
|
||||
config_load_check_tool |
||||
route_table_check_tool |
||||
schema_validator_check_tool |
@ -0,0 +1,19 @@ |
||||
.. _arch_overview_access_logs: |
||||
|
||||
Access logging |
||||
=================== |
||||
|
||||
The :ref:`HTTP connection manager <arch_overview_http_conn_man>` and |
||||
:ref:`tcp proxy <arch_overview_tcp_proxy>` supports extensible access logging with the following |
||||
features: |
||||
|
||||
* Any number of access logs per connection manager or tcp proxy. |
||||
* Asynchronous IO flushing architecture. Access logging will never block the main network processing |
||||
threads. |
||||
* Customizable access log formats using predefined fields as well as arbitrary HTTP request and |
||||
response headers. |
||||
* Customizable access log filters that allow different types of requests and responses to be written |
||||
to different access logs. |
||||
|
||||
Access log :ref:`configuration <config_access_log>`. |
||||
|
@ -0,0 +1,37 @@ |
||||
Architecture overview |
||||
===================== |
||||
|
||||
.. toctree:: |
||||
:maxdepth: 2 |
||||
|
||||
terminology |
||||
threading_model |
||||
listeners |
||||
network_filters |
||||
http_connection_management |
||||
http_filters |
||||
http_routing |
||||
grpc |
||||
websocket |
||||
cluster_manager |
||||
service_discovery |
||||
health_checking |
||||
connection_pooling |
||||
load_balancing |
||||
outlier |
||||
circuit_breaking |
||||
global_rate_limiting |
||||
ssl |
||||
statistics |
||||
runtime |
||||
tracing |
||||
tcp_proxy |
||||
access_logging |
||||
mongo |
||||
dynamo |
||||
redis |
||||
hot_restart |
||||
dynamic_configuration |
||||
init |
||||
draining |
||||
scripting |
@ -0,0 +1,38 @@ |
||||
.. _arch_overview_circuit_break: |
||||
|
||||
Circuit breaking |
||||
================ |
||||
|
||||
Circuit breaking is a critical component of distributed systems. It’s nearly always better to fail |
||||
quickly and apply back pressure downstream as soon as possible. One of the main benefits of an Envoy |
||||
mesh is that Envoy enforces circuit breaking limits at the network level as opposed to having to |
||||
configure and code each application independently. Envoy supports various types of fully distributed |
||||
(not coordinated) circuit breaking: |
||||
|
||||
* **Cluster maximum connections**: The maximum number of connections that Envoy will establish to |
||||
all hosts in an upstream cluster. In practice this is only applicable to HTTP/1.1 clusters since |
||||
HTTP/2 uses a single connection to each host. |
||||
* **Cluster maximum pending requests**: The maximum number of requests that will be queued while |
||||
waiting for a ready connection pool connection. In practice this is only applicable to HTTP/1.1 |
||||
clusters since HTTP/2 connection pools never queue requests. HTTP/2 requests are multiplexed |
||||
immediately. If this circuit breaker overflows the :ref:`upstream_rq_pending_overflow |
||||
<config_cluster_manager_cluster_stats>` counter for the cluster will increment. |
||||
* **Cluster maximum requests**: The maximum number of requests that can be outstanding to all hosts |
||||
in a cluster at any given time. In practice this is applicable to HTTP/2 clusters since HTTP/1.1 |
||||
clusters are governed by the maximum connections circuit breaker. If this circuit breaker |
||||
overflows the :ref:`upstream_rq_pending_overflow <config_cluster_manager_cluster_stats>` counter |
||||
for the cluster will increment. |
||||
* **Cluster maximum active retries**: The maximum number of retries that can be outstanding to all |
||||
hosts in a cluster at any given time. In general we recommend aggressively circuit breaking |
||||
retries so that retries for sporadic failures are allowed but the overall retry volume cannot |
||||
explode and cause large scale cascading failure. If this circuit breaker overflows the |
||||
:ref:`upstream_rq_retry_overflow <config_cluster_manager_cluster_stats>` counter for the cluster |
||||
will increment. |
||||
|
||||
Each circuit breaking limit is :ref:`configurable <config_cluster_manager_cluster_circuit_breakers>` |
||||
and tracked on a per upstream cluster and per priority basis. This allows different components of |
||||
the distributed system to be tuned independently and have different limits. |
||||
|
||||
Note that circuit breaking will cause the :ref:`x-envoy-overloaded |
||||
<config_http_filters_router_x-envoy-overloaded>` header to be set by the router filter in the |
||||
case of HTTP requests. |
@ -0,0 +1,26 @@ |
||||
.. _arch_overview_cluster_manager: |
||||
|
||||
Cluster manager |
||||
=============== |
||||
|
||||
Envoy’s cluster manager manages all configured upstream clusters. Just as the Envoy configuration |
||||
can contain any number of listeners, the configuration can also contain any number of independently |
||||
configured upstream clusters. |
||||
|
||||
Upstream clusters and hosts are abstracted from the network/HTTP filter stack given that upstream |
||||
clusters and hosts may be used for any number of different proxy tasks. The cluster manager exposes |
||||
APIs to the filter stack that allow filters to obtain a L3/L4 connection to an upstream cluster, or |
||||
a handle to an abstract HTTP connection pool to an upstream cluster (whether the upstream host |
||||
supports HTTP/1.1 or HTTP/2 is hidden). A filter stage determines whether it needs an L3/L4 |
||||
connection or a new HTTP stream and the cluster manager handles all of the complexity of knowing |
||||
which hosts are available and healthy, load balancing, thread local storage of upstream connection |
||||
data (since most Envoy code is written to be single threaded), upstream connection type (TCP/IP, |
||||
UDS), upstream protocol where applicable (HTTP/1.1, HTTP/2), etc. |
||||
|
||||
Clusters known to the cluster manager can be configured either statically, or fetched dynamically |
||||
via the cluster discovery service (CDS) API. Dynamic cluster fetches allow more configuration to |
||||
be stored in a central configuration server and thus requires fewer Envoy restarts and configuration |
||||
distribution. |
||||
|
||||
* Cluster manager :ref:`configuration <config_cluster_manager>`. |
||||
* CDS :ref:`configuration <config_cluster_manager_cds>`. |
@ -0,0 +1,37 @@ |
||||
.. _arch_overview_conn_pool: |
||||
|
||||
Connection pooling |
||||
================== |
||||
|
||||
For HTTP traffic, Envoy supports abstract connection pools that are layered on top of the underlying |
||||
wire protocol (HTTP/1.1 or HTTP/2). The utilizing filter code does not need to be aware of whether |
||||
the underlying protocol supports true multiplexing or not. In practice the underlying |
||||
implementations have the following high level properties: |
||||
|
||||
HTTP/1.1 |
||||
-------- |
||||
|
||||
The HTTP/1.1 connection pool acquires connections as needed to an upstream host (up to the circuit |
||||
breaking limit). Requests are bound to connections as they become available, either because a |
||||
connection is done processing a previous request or because a new connection is ready to receive its |
||||
first request. The HTTP/1.1 connection pool does not make use of pipelining so that only a single |
||||
downstream request must be reset if the upstream connection is severed. |
||||
|
||||
HTTP/2 |
||||
------ |
||||
|
||||
The HTTP/2 connection pool acquires a single connection to an upstream host. All requests are |
||||
multiplexed over this connection. If a GOAWAY frame is received or if the connection reaches the |
||||
maximum stream limit, the connection pool will create a new connection and drain the existing one. |
||||
HTTP/2 is the preferred communication protocol as connections rarely if ever get severed. |
||||
|
||||
.. _arch_overview_conn_pool_health_checking: |
||||
|
||||
Health checking interactions |
||||
---------------------------- |
||||
|
||||
If Envoy is configured for either active or passive :ref:`health checking |
||||
<arch_overview_health_checking>`, all connection pool connections will be closed on behalf of a host |
||||
that transitions from a healthy state to an unhealthy state. If the host reenters the load |
||||
balancing rotation it will create fresh connections which will maximize the chance of working |
||||
around a bad flow (due to ECMP route or something else). |
@ -0,0 +1,35 @@ |
||||
.. _arch_overview_draining: |
||||
|
||||
Draining |
||||
======== |
||||
|
||||
Draining is the process by which Envoy attempts to gracefully shed connections in response to |
||||
various events. Draining occurs at the following times: |
||||
|
||||
* The server has been manually health check failed via the :ref:`healthcheck/fail |
||||
<operations_admin_interface_healthcheck_fail>` admin endpoint. See the :ref:`health check filter |
||||
<arch_overview_health_checking_filter>` architecture overview for more information. |
||||
* The server is being :ref:`hot restarted <arch_overview_hot_restart>`. |
||||
* Individual listeners are being modified or removed via :ref:`LDS |
||||
<arch_overview_dynamic_config_lds>`. |
||||
|
||||
Each :ref:`configured listener <arch_overview_listeners>` has a :ref:`drain_type |
||||
<config_listeners_drain_type>` setting which controls when draining takes place. The currently |
||||
supported values are: |
||||
|
||||
default |
||||
Envoy will drain listeners in response to all three cases above (admin drain, hot restart, and |
||||
LDS update/remove). This is the default setting. |
||||
|
||||
modify_only |
||||
Envoy will drain listeners only in response to the 2nd and 3rd cases above (hot restart and |
||||
LDS update/remove). This setting is useful if Envoy is hosting both ingress and egress listeners. |
||||
It may be desirable to set *modify_only* on egress listeners so they only drain during |
||||
modifications while relying on ingress listener draining to perform full server draining when |
||||
attempting to do a controlled shutdown. |
||||
|
||||
Note that although draining is a per-listener concept, it must be supported at the network filter |
||||
level. Currently the only filters that support graceful draining are |
||||
:ref:`HTTP connection manager <config_http_conn_man>`, |
||||
:ref:`Redis <config_network_filters_redis_proxy>`, and |
||||
:ref:`Mongo <config_network_filters_mongo_proxy>`. |
@ -0,0 +1,81 @@ |
||||
.. _arch_overview_dynamic_config: |
||||
|
||||
Dynamic configuration |
||||
===================== |
||||
|
||||
Envoy is architected such that different types of configuration management approaches are possible. |
||||
The approach taken in a deployment will be dependent on the needs of the implementor. Simple |
||||
deployments are possible with a fully static configuration. More complicated deployments can |
||||
incrementally add more complex dynamic configuration, the downside being that the implementor must |
||||
provide one or more external REST based configuration provider APIs. This document gives an overview |
||||
of the options currently available. |
||||
|
||||
* Top level configuration :ref:`reference <config>`. |
||||
* :ref:`Reference configurations <install_ref_configs>`. |
||||
|
||||
Fully static |
||||
------------ |
||||
|
||||
In a fully static configuration, the implementor provides a set of :ref:`listeners |
||||
<config_listeners>` (and :ref:`filter chains <config_listener_filters>`), :ref:`clusters |
||||
<config_cluster_manager>`, and optionally :ref:`HTTP route configurations |
||||
<config_http_conn_man_route_table>`. Dynamic host discovery is only possible via DNS based |
||||
:ref:`service discovery <arch_overview_service_discovery>`. Configuration reloads must take place |
||||
via the built in :ref:`hot restart <arch_overview_hot_restart>` mechanism. |
||||
|
||||
Though simplistic, fairly complicated deployments can be created using static configurations and |
||||
graceful hot restarts. |
||||
|
||||
.. _arch_overview_dynamic_config_sds: |
||||
|
||||
SDS only |
||||
-------- |
||||
|
||||
The :ref:`service discovery service (SDS) API <config_cluster_manager_sds>` provides a more advanced |
||||
mechanism by which Envoy can discover members of an upstream cluster. Layered on top of a static |
||||
configuration, SDS allows an Envoy deployment to circumvent the limitations of DNS (maximum records |
||||
in a response, etc.) as well as consume more information used in load balancing and routing (e.g., |
||||
canary status, zone, etc.). |
||||
|
||||
.. _arch_overview_dynamic_config_cds: |
||||
|
||||
SDS and CDS |
||||
----------- |
||||
|
||||
The :ref:`cluster discovery service (CDS) API <config_cluster_manager_cds>` layers on a mechanism by |
||||
which Envoy can discover upstream clusters used during routing. Envoy will gracefully add, update, |
||||
and remove clusters as specified by the API. This API allows implementors to build a topology in |
||||
which Envoy does not need to be aware of all upstream clusters at initial configuration time. |
||||
Typically, when doing HTTP routing along with CDS (but without route discovery service), |
||||
implementors will make use of the router's ability to forward requests to a cluster specified in an |
||||
:ref:`HTTP request header <config_http_conn_man_route_table_route_cluster_header>`. |
||||
|
||||
Although it is possible to use CDS without SDS by specifying fully static clusters, we recommend |
||||
still using the SDS API for clusters specified via CDS. Internally, when a cluster definition is |
||||
updated, the operation is graceful. However, all existing connection pools will be drained and |
||||
reconnected. SDS does not suffer from this limitation. When hosts are added and removed via SDS, |
||||
the existing hosts in the cluster are unaffected. |
||||
|
||||
.. _arch_overview_dynamic_config_rds: |
||||
|
||||
SDS, CDS, and RDS |
||||
----------------- |
||||
|
||||
The :ref:`route discovery service (RDS) API <config_http_conn_man_rds>` layers on a mechanism by which |
||||
Envoy can discover the entire route configuration for an HTTP connection manager filter at runtime. |
||||
The route configuration will be gracefully swapped in without affecting existing requests. This API, |
||||
when used alongside SDS and CDS, allows implementors to build a complex routing topology |
||||
(:ref:`traffic shifting <config_http_conn_man_route_table_traffic_splitting>`, blue/green |
||||
deployment, etc.) that will not require any Envoy restarts other than to obtain a new Envoy binary. |
||||
|
||||
.. _arch_overview_dynamic_config_lds: |
||||
|
||||
SDS, CDS, RDS, and LDS |
||||
---------------------- |
||||
|
||||
The :ref:`listener discovery service (LDS) <config_overview_lds>` layers on a mechanism by which |
||||
Envoy can discover entire listeners at runtime. This includes all filter stacks, up to and including |
||||
HTTP filters with embedded references to :ref:`RDS <config_http_conn_man_rds>`. Adding LDS into |
||||
the mix allows almost every aspect of Envoy to be dynamically configured. Hot restart should |
||||
only be required for very rare configuration changes (admin, tracing driver, etc.) or binary |
||||
updates. |
@ -0,0 +1,18 @@ |
||||
.. _arch_overview_dynamo: |
||||
|
||||
DynamoDB |
||||
======== |
||||
|
||||
Envoy supports an HTTP level DynamoDB sniffing filter with the following features: |
||||
|
||||
* DynamoDB API request/response parser. |
||||
* DynamoDB per operation/per table/per partition and operation statistics. |
||||
* Failure type statistics for 4xx responses, parsed from response JSON, |
||||
e.g., ProvisionedThroughputExceededException. |
||||
* Batch operation partial failure statistics. |
||||
|
||||
The DynamoDB filter is a good example of Envoy’s extensibility and core abstractions at the HTTP |
||||
layer. At Lyft we use this filter for all application communication with DynamoDB. It provides an |
||||
invaluable source of data agnostic to the application platform and specific AWS SDK in use. |
||||
|
||||
DynamoDB filter :ref:`configuration <config_http_filters_dynamo>`. |
@ -0,0 +1,31 @@ |
||||
.. _arch_overview_rate_limit: |
||||
|
||||
Global rate limiting |
||||
==================== |
||||
|
||||
Although distributed :ref:`circuit breaking <arch_overview_circuit_break>` is generally extremely |
||||
effective in controlling throughput in distributed systems, there are times when it is not very |
||||
effective and global rate limiting is desired. The most common case is when a large number of hosts |
||||
are forwarding to a small number of hosts and the average request latency is low (e.g., |
||||
connections/requests to a database server). If the target hosts become backed up, the downstream |
||||
hosts will overwhelm the upstream cluster. In this scenario it is extremely difficult to configure a |
||||
tight enough circuit breaking limit on each downstream host such that the system will operate |
||||
normally during typical request patterns but still prevent cascading failure when the system starts |
||||
to fail. Global rate limiting is a good solution for this case. |
||||
|
||||
Envoy integrates directly with a global gRPC rate limiting service. Although any service that |
||||
implements the defined RPC/IDL protocol can be used, Lyft provides a `reference implementation <https://github.com/lyft/ratelimit>`_ |
||||
written in Go which uses a Redis backend. Envoy’s rate limit integration has the following features: |
||||
|
||||
* **Network level rate limit filter**: Envoy will call the rate limit service for every new |
||||
connection on the listener where the filter is installed. The configuration specifies a specific |
||||
domain and descriptor set to rate limit on. This has the ultimate effect of rate limiting the |
||||
connections per second that transit the listener. :ref:`Configuration reference |
||||
<config_network_filters_rate_limit>`. |
||||
* **HTTP level rate limit filter**: Envoy will call the rate limit service for every new request on |
||||
the listener where the filter is installed and where the route table specifies that the global |
||||
rate limit service should be called. All requests to the target upstream cluster as well as all |
||||
requests from the originating cluster to the target cluster can be rate limited. |
||||
:ref:`Configuration reference <config_http_filters_rate_limit>` |
||||
|
||||
Rate limit service :ref:`configuration <config_rate_limit_service>`. |
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue