Skip to content

Field reference for clusters: discovery types, load balancing, endpoints, health checks, circuit breakers, protocol options and upstream TLS.

Clusters are declared under envoy_bootstrap.static_resources.clusters (or delivered over CDS) using standard Envoy field names; fields outside this reference make Arion refuse the configuration.

cluster

FieldTypeRequiredDefaultDescription
namestringyes—Unique cluster name; routes reference it.
typeenumyes—STATIC, STRICT_DNS, EDS or ORIGINAL_DST. LOGICAL_DNS is not supported.
load_assignmentobjectsee below—Endpoints. Required for STATIC (IP, pipe or internal addresses) and STRICT_DNS (host names resolved over DNS); forbidden for EDS (endpoints arrive over ADS, see xDS resource types) and ignored for ORIGINAL_DST.
lb_policyenumnoROUND_ROBINROUND_ROBIN, RANDOM, LEAST_REQUEST, RING_HASH, MAGLEV or CLUSTER_PROVIDED. RING_HASH and MAGLEV hash with the route's hash_policy; ORIGINAL_DST clusters must use CLUSTER_PROVIDED.
load_balancing_policyobjectno—Typed alternative to lb_policy: exactly one policy whose typed_config is one of the six accepted @types (below).
connect_timeoutdurationnononeUpstream connection establishment timeout.
cleanup_intervaldurationno5sHow long an idle ORIGINAL_DST host is kept before it is expired.
health_checkslistno[]At most one health check.
circuit_breakersobjectnodefaultsThresholds per routing priority.
typed_extension_protocol_optionsmapnoHTTP/1.1One entry of HTTP protocol options.
transport_socketobjectnoplaintextUpstream TLS, RawBuffer, or PROXY protocol upstream transport.
upstream_bind_configobjectno—Only socket_options with a single SO_BINDTODEVICE entry (level: 1, name: 25).
original_dst_lb_configobjectno—Original-destination routing settings; only valid with type: ORIGINAL_DST.

load_balancing_policy accepts these typed_config types (all under type.googleapis.com/envoy.extensions.load_balancing_policies.): round_robin.v3.RoundRobin, random.v3.Random, least_request.v3.LeastRequest, ring_hash.v3.RingHash, maglev.v3.Maglev and override_host.v3.OverrideHost — each with an empty config, except OverrideHost which takes exactly one override_host_sources entry with header: <name> plus a required fallback_policy (any of the other five).

clusters:
  - name: api
    type: STATIC
    lb_policy: ROUND_ROBIN
    connect_timeout: 0.25s
    load_assignment:
      endpoints:
        - lb_endpoints:
            - endpoint:
                address:
                  socket_address: { address: 127.0.0.1, port_value: 5678 }

load_assignment

FieldTypeRequiredDefaultDescription
cluster_namestringno—Informational; the enclosing cluster's name is what routes use.
endpointslistyes—Endpoint groups. locality metadata is not supported inside a group.
endpoints[].priorityuint32no0Failover priority. Priorities used across groups must run 0..N without gaps; priority 0 serves first and traffic spills to the next priority as its hosts become unhealthy.
endpoints[].lb_endpointslistyes—The endpoints of the group.
lb_endpoints[].endpoint.addressobjectyes—socket_address (address, port_value), pipe (path) or envoy_internal_address (server_listener_name).
lb_endpoints[].load_balancing_weightuint32no1Relative weight, at least 1.
lb_endpoints[].health_statusenumnoHEALTHYInitial health (HEALTHY, UNHEALTHY; UNKNOWN counts as healthy).
load_assignment:
  endpoints:
    - priority: 0
      lb_endpoints:
        - endpoint:
            address:
              socket_address: { address: 10.0.0.1, port_value: 8080 }
          load_balancing_weight: 3
        - endpoint:
            address:
              socket_address: { address: 10.0.0.2, port_value: 8080 }
          load_balancing_weight: 1
    - priority: 1
      lb_endpoints:
        - endpoint:
            address:
              socket_address: { address: 10.0.1.1, port_value: 8080 }

Health checks

One entry under health_checks. The timing fields sit at the top level; the checker itself is one of http_health_check, tcp_health_check or grpc_health_check.

FieldTypeRequiredDefaultDescription
timeoutdurationyes—Time to wait for a check response.
intervaldurationyes—Interval between checks.
unhealthy_thresholduint16yes—Failures before a host is marked unhealthy.
healthy_thresholduint16yes—Successes before a host is marked healthy again.
initial_jitterdurationnononeRandom delay before the first check.
interval_jitterdurationnononeRandom amount added to each interval.
interval_jitter_percentfloatno0Fraction of interval (0.0-1.0) added as jitter; combines with interval_jitter.
unhealthy_intervaldurationnointervalInterval used while a host is unhealthy.
unhealthy_edge_intervaldurationnounhealthy_intervalInterval for the first check after a host turns unhealthy.
healthy_edge_intervaldurationnointervalInterval for the first check after a host turns healthy.

http_health_check

FieldTypeRequiredDefaultDescription
pathstringnononeRequest path; must not contain a query string.
hoststringnocluster nameValue of the Host header; the cluster name must be a valid authority if this is unset.
methodenumnoGETOnly GET is supported.
expected_statuseslistno[[200,201)]Status ranges (start inclusive, end exclusive, within 100-600) that count as healthy.
retriable_statuseslistno[]Status ranges that do not immediately mark the host unhealthy.
codec_client_typeenumnoHTTP1HTTP1 or HTTP2; must match the cluster's protocol options.

tcp_health_check

FieldTypeRequiredDefaultDescription
sendobjectnoconnect onlyPayload to send: {text: "<hex>"} (hex-encoded bytes) or {binary: <bytes>}.
receivelistno[]Payloads that must appear in the response, same forms as send.

grpc_health_check

FieldTypeRequiredDefaultDescription
service_namestringno""Service name passed to the standard gRPC health service. The cluster must use HTTP/2 protocol options.
health_checks:
  - timeout: 0.1s
    interval: 5s
    healthy_threshold: 3
    unhealthy_threshold: 2
    http_health_check:
      path: /health

Circuit breakers

circuit_breakers.thresholds is a list; each entry applies to one routing priority and the last entry for a priority wins. Requests routed with priority: HIGH on the route action use the HIGH entry. When a limit trips, HTTP requests are rejected with 503 and x-envoy-overloaded: true.

FieldTypeRequiredDefaultDescription
priorityenumnoDEFAULTDEFAULT or HIGH.
max_connectionsuint32no1024Maximum concurrent upstream connections.
max_requestsuint32no1024Maximum concurrent in-flight requests.
max_retriesuint32no3Maximum concurrent retries.
track_remainingboolnofalseTrack remaining capacity for observability.

max_pending_requests, retry_budget and per_host_thresholds are not supported.

circuit_breakers:
  thresholds:
    - priority: DEFAULT
      max_requests: 50
      max_retries: 3
    - priority: HIGH
      max_requests: 100
      max_retries: 5

HTTP protocol options

One entry under typed_extension_protocol_options with @type: type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions. Only explicit_http_config is supported (auto_config and use_downstream_protocol_config are not).

FieldTypeRequiredDefaultDescription
common_http_protocol_options.idle_timeoutdurationnononeIdle timeout for upstream connections.
explicit_http_config.http_protocol_optionsobjectone ofselectedSelects HTTP/1.1. Only enable_trailers (bool, default false) is accepted inside.
explicit_http_config.http2_protocol_optionsobjectone of—Selects HTTP/2; fields below.

http2_protocol_options

FieldTypeRequiredDefaultDescription
max_concurrent_streamsuint32nononeMaximum concurrent streams per connection.
initial_stream_window_sizeuint32nononePer-stream flow-control window; must be greater than 0.
initial_connection_window_sizeuint32nononePer-connection flow-control window; must be greater than 0.
connection_keepalive.intervaldurationyes*—PING keepalive interval (* required inside connection_keepalive).
connection_keepalive.timeoutdurationnononeTime to wait for a PING response before closing the connection.
typed_extension_protocol_options:
  envoy.extensions.upstreams.http.v3.HttpProtocolOptions:
    "@type": type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions
    explicit_http_config:
      http2_protocol_options: {}

Upstream TLS (UpstreamTlsContext)

Set as the cluster transport_socket with @type: type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext.

FieldTypeRequiredDefaultDescription
snistringyes—Server name sent in the TLS handshake and used to verify the upstream certificate.
common_tls_context.tls_paramsobjectnomin TLS 1.2Same protocol bounds as downstream TLS.
common_tls_context.tls_certificateslistnononeAt most one client certificate ({certificate_chain, private_key}) for mTLS.
common_tls_context.tls_certificate_sds_secret_configslistnononeAt most one named secret reference instead of an inline certificate.
common_tls_context.validation_contextobjectno—{trusted_ca, trust_chain_verification} for verifying the upstream certificate.
common_tls_context.validation_context_sds_secret_configobjectno—Named reference to a validation-context secret.
transport_socket:
  name: envoy.transport_sockets.tls
  typed_config:
    "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext
    sni: api.example.com
    common_tls_context:
      validation_context:
        trusted_ca:
          filename: /etc/ssl/certs/ca-certificates.crt

PROXY protocol upstream transport

@type: type.googleapis.com/envoy.extensions.transport_sockets.proxy_protocol.v3.ProxyProtocolUpstreamTransport wraps the upstream connection in a PROXY protocol header.

FieldTypeRequiredDefaultDescription
config.versionenumyes—V1 or V2.
config.pass_through_tlvsobjectnononematch_type (INCLUDE_ALL or INCLUDE) and tlv_type list — TLVs copied from the downstream PROXY header (v2).
config.added_tlvslistno[]{type, value} TLV entries to append (type 0-255).
transport_socketobjectnoplaintextInner transport: an UpstreamTlsContext or RawBuffer.

Original destination

type: ORIGINAL_DST clusters pick the upstream address per request instead of from load_assignment; lb_policy must be CLUSTER_PROVIDED. The routing method comes from original_dst_lb_config; with neither method configured, the request authority (Host) is used as the destination:

FieldTypeRequiredDefaultDescription
use_http_headerboolnofalseTake the destination from a request header. Mutually exclusive with metadata_key.
http_header_namestringnox-envoy-original-dst-hostHeader carrying host:port when use_http_header is true.
metadata_keyobjectno—{key, path: [{key: ...}]} — read the destination from request metadata set by an earlier filter.
upstream_port_overrideuint16nononeReplace the port of the resolved destination.
clusters:
  - name: dynamic
    type: ORIGINAL_DST
    lb_policy: CLUSTER_PROVIDED
    connect_timeout: 5s
    original_dst_lb_config:
      use_http_header: true

Continue

Start typing to search the site.

↑ ↓ to move Enter to open Esc to close