diff --git a/website/content/docs/k8s/multiport/reference/grpcroute.mdx b/website/content/docs/k8s/multiport/reference/grpcroute.mdx
index 7176f4f42def..9b991129afe3 100644
--- a/website/content/docs/k8s/multiport/reference/grpcroute.mdx
+++ b/website/content/docs/k8s/multiport/reference/grpcroute.mdx
@@ -746,11 +746,11 @@ Specifies the total amount of time spent processing the entire downstream reques
## Examples
-If you have more than one example to show, create an Examples section (general block) and introduce the examples per the style guide.
+The following examples demonstrate common GRPCRoute CRD configuration patterns for specific use cases.
### Split gRPC traffic between two ports
-The following configuration splits traffic for the `api` service. GRPC traffic for services registered to the Consul catalog that are available at the `api-workload` port is split so that 50% of the traffic routes to the service at the `api-workload` port and 50% routes to the service at the `admin-workload` port.
+The following example splits traffic for the `api` service. GRPC traffic for services registered to the Consul catalog that are available at the `api-workload` port is split so that 50% of the traffic routes to the service at the `api-workload` port and 50% routes to the service at the `admin-workload` port.
```yaml
apiVersion: mesh.consul.hashicorp.com/v2beta1
@@ -797,7 +797,7 @@ spec:
### Route traffic by matching header
-The following configuration routes gRPC traffic for the `api` service according to its header GRPC traffic for services registered to the Consul catalog that are available at the `api-workload` port are routed according to the following criteria:
+The following examples routes gRPC traffic for the `api` service according to its header GRPC traffic for services registered to the Consul catalog that are available at the `api-workload` port are routed according to the following criteria:
- Traffic with a header that contains a `x-debug` value of exactly `1` has their response and request headers modified and is routed to the service with the `api` workload identity.
- Traffic with a header that contains a `x-debug` value of exactly `2` has their response and request headers modified and is routed to the service with the `api-admin` workload identity.
diff --git a/website/content/docs/k8s/multiport/reference/httproute.mdx b/website/content/docs/k8s/multiport/reference/httproute.mdx
index 64390d994ae3..6103046b5e28 100644
--- a/website/content/docs/k8s/multiport/reference/httproute.mdx
+++ b/website/content/docs/k8s/multiport/reference/httproute.mdx
@@ -1,12 +1,12 @@
---
layout: docs
page_title: HTTPRoute resource configuration reference
-description: The HTTPRoute resource CRD configures L7 GRPC traffic behavior within the service mesh. GRPCRoute is a GAMMA resource that requires the v2 catalog API. Learn how to configure the HTTPRoute CRD with specifications and example configurations.
+description: The HTTPRoute resource CRD configures L7 HTTP traffic behavior within the service mesh. GRPCRoute is a GAMMA resource that requires the v2 catalog API. Learn how to configure the HTTPRoute CRD with specifications and example configurations.
---
# HTTPRoute resource configuration reference
-This page provides reference information for the GRPCRoute resource, which defines L7 GRPC traffic within the service mesh.
+This page provides reference information for the GRPCRoute resource, which defines L7 HTTP traffic within the service mesh.
This custom resource definition (CRD) describes a GAMMA resource that requires the [v2 catalog API](/consul/docs/architecture/catalog/v2). It is not compatible with the [v1 catalog API](/consul/docs/architecture/catalog/v1). For more information about GAMMA resources, refer to the [Kubernetes Gateway API documentation](https://gateway-api.sigs.k8s.io/concepts/gamma/).
@@ -14,211 +14,744 @@ This custom resource definition (CRD) describes a GAMMA resource that requires t
The following list outlines field hierarchy, language-specific data types, and requirements in an HTTPRoute CRD. Click on a property name to view additional details, including default values.
-- [`apiVersion`](#apiversion): string | required
-- [`kind`](#kind): string | required
+The following list outlines field hierarchy, language-specific data types, and requirements in a GRPCRoute CRD. Click on a property name to view additional details, including default values.
+
+- [`apiVersion`](#apiversion): string | required | must be set to `mesh.consul.hashicorp.com/v2beta1`
+- [`kind`](#kind): string | required | must be set to `GRPCRoute`
- [`metadata`](#metadata): object | required
- - [`name`](#metadata-name): string | required
- - [`namespace`](#metadata-namespace): string | optional
+ - [`name`](#metadata-name): string | required
+ - [`namespace`](#metadata-namespace): string | optional
- [`spec`](#spec): object | required
- - [`parentRefs`](#spec-parentrefs):
- - [`ref`](#spec-parentrefs-ref):
- - [`type`](#spec-parentrefs-ref-type):
-- [`group`]
-- [`groupVersion`]
-- [`kind`]
-- [`name`]
-- [`section`]
-- [`tenancy`]
- - [`namespace`]
- - [`partition`]
- - [`peerName`]
- - [‘port’]
- - [`rules`](#spec-rules):
- - [`backendRefs`]
- - [`backendRef`]
- - [`ref`]
- - [`type`]
- - [`group`]
- - [`groupVersion`]
- - [`kind`]
- - [`name`]
- - [`section`]
- - [`tenancy`]
- - [`namespace`]
- - [`partition`]
- - [`peerName`]
- - [`datacenter`]
-- [`port`]
-- [`weight`]
+ - [`parentRefs`](#spec-parentrefs): map | required
+ - [`port`](#spec-parentrefs-port): string
+ - [`ref`](#spec-parentrefs-ref): string | required
+ - [`name`](#spec-parentrefs-ref-name): string
+ - [`section`](#spec-parentrefs-ref-section): string
+ - [`tenancy`](#spec-parentrefs-ref-tenancy): string
+ - [`namespace`](#spec-parentrefs-ref-tenancy): string
+ - [`partition`](#spec-parentrefs-ref-tenancy): string
+ - [`peerName`](#spec-parentrefs-ref-tenancy): string
+ - [`type`](#spec-parentrefs-ref-type): map
+ - [`group`](#spec-parentrefs-ref-type): string
+ - [`groupVersion`](#spec-parentrefs-ref-type): string
+ - [`kind`](#spec-parentrefs-ref-type): string
+ - [`rules`](#spec-rules): map | required
+ - [`backendRefs`](#spec-rules-backendrefs): map
+ - [`backendRef`](#spec-rules-backendrefs-backendref): map
+ - [`datacenter`](#spec-rules-backendrefs-backendref-datacenter): string
+ - [`port`](#spec-rules-backendrefs-backendref-port): string
+ - [`ref`](#spec-rules-backendrefs-backendref-ref): map
+ - [`name`](#spec-rules-backendrefs-backendref-ref-name): string
+ - [`section`](#spec-rules-backendrefs-backendref-ref-section): string
+ - [`tenancy`](#spec-rules-backendrefs-backendref-ref-tenancy): map
+ - [`namespace`](#spec-rules-backendrefs-backendref-ref-tenancy): string
+ - [`partition`](#spec-rules-backendrefs-backendref-ref-tenancy): string
+ - [`peerName`](#spec-rules-backendrefs-backendref-ref-tenancy): string
+ - [`type`](#spec-rules-backendrefs-backendref-ref-type): map
+ - [`group`](#spec-rules-backendrefs-backendref-ref-type): string
+ - [`groupVersion`](#spec-rules-backendrefs-backendref-ref-type): string
+ - [`kind`](#spec-rules-backendrefs-backendref-ref-type): string
+ - [`filters`](#spec-rules-backendrefs-filters): map
+ - [`requestHeaderModifier`]: map(#spec-rules-backendrefs-filters-requestheadermodifier): map
+ - [`add`](#spec-rules-backendrefs-filters-requestheadermodifier): map
+ - [`set`](#spec-rules-backendrefs-filters-requestheadermodifier): map
+ - [`remove`](#spec-rules-backendrefs-filters-requestheadermodifier): map
+ - [`responseHeaderModifier`]: map(#spec-rules-backendrefs-filters-responseheadermodifier): map
+ - [`add`](#spec-rules-backendrefs-filters-responseheadermodifier): map
+ - [`set`](#spec-rules-backendrefs-filters-responseheadermodifier): map
+ - [`remove`](#spec-rules-backendrefs-filters-responseheadermodifier): map
+ - [`urlRewrite`](#spec-rules-backendrefs-filters-urlrewrite): map
+ - [`pathPrefix`](#spec-rules-backendrefs-filters-urlrewrite): string
+ - [`weight`](#spec-rules-backendrefs-weight): integer
+ - [`filters`](#spec-rules-filters): map
+ - [`requestHeaderModifier`](#spec-rules-filters-requestheadermodifier): map
+ - [`add`](#spec-rules-filters-requestheadermodifier): map
+ - [`set`](#spec-rules-filters-requestheadermodifier): map
+ - [`remove`](#spec-rules-filters-requestheadermodifier): map
+ - [`responseHeaderModifier`](#spec-rules-filters-responseheadermodifier): map
+ - [`add`](#spec-rules-filters-responseheadermodifier): map
+ - [`set`](#spec-rules-filters-responseheadermodifier): map
+ - [`remove`](#spec-rules-filters-responseheadermodifier): map
+ - [`urlRewrite`](#spec-rules-filters-urlrewrite): map
+ - [`pathPrefix`](#spec-rules-filters-urlrewrite): string
+ - [`matches`](#spec-rules-matches): map
+ - [`headers`](#spec-rules-matches-headers): map
+ - [`name`](#spec-rules-matches-headers-name): string
+ - [`type`](#spec-rules-matches-headers-type): string
+ - [`value`](#spec-rules-matches-headers-value): string
+ - [`method`](#spec-rules-matches-method): map
+ - [`method`](#spec-rules-matches-method-method): string
+ - [`service`](#spec-rules-matches-method-service): string
+ - [`type`](#spec-rules-matches-method-type): string
+ - [`retries`](#spec-rules-retries): map
+ - [`number`](#spec-rules-retries-number): map
+ - [`value`](#spec-rules-retries-number): integer
+ - [`onConditions`](#spec-rules-retries-onconditions): map of strings
+ - [`onConnectFailure`](#spec-rules-retries-onconnectfailure): boolean | `false`
+ - [`onStatusCodes`](#spec-rules-retries-onconditions): map of integers
+ - [`timeouts`](#spec-rules-timeouts): map
+ - [`idle`](#spec-rules-timeouts-idle): map
+ - [`nanos`](#spec-rules-timeouts-idle): integer
+ - [`seconds`](#spec-rules-timeouts-idle): integer
+ - [`request`](#spec-rules-timeouts-request): map
+ - [`nanos`](#spec-rules-timeouts-request): integer
+ - [`seconds`](#spec-rules-timeouts-request): integer
## Complete configuration
When every field is defined, an HTTPRoute CRD has the following form:
```yaml
-apiVersion: mesh.consul.hashicorp.com/v2beta1
-kind: HTTPRoute
+apiVersion: mesh.consul.hashicorp.com/v2beta1 # required
+kind: GRPCRoute # required
metadata:
- name:
+ name:
namespace:
-hostnames:
spec:
parentRefs:
- port:
- ref:
- name:
- section:
+ port: ""
+ - ref:
+ name:
+ section:
tenancy:
- namespace:
- partition:
- peerName:
- type:
- group:
- groupVersion:
- kind:
- rules:
- backendRefs:
- backendRef:
- datacenter:
- port:
- ref:
- name:
- tenancy:
- namespace:
- partition:
- peerName:
- type:
- group:
- groupVersion:
- kind:
- filters:
- requestHeaderModifier:
- add:
- name:
- value:
- remove:
- name:
- value:
- set:
- name:
- value:
- responseHeaderModifier:
- add:
- name:
- value:
- remove:
- name:
- value:
- set:
- name:
- value:
- urlRewrite:
- pathPrefix:
- weight:
+ namespace:
+ partition:
+ peerName:
+ type:
+ group:
+ groupVersion:
+ kind:
+ rules:
+ - backendRefs:
+ - backendRef:
+ datacenter:
+ port: ""
+ ref:
+ name:
+ section:
+ tenancy:
+ namespace:
+ partition:
+ peerName:
+ type:
+ group:
+ groupVersion:
+ kind:
filters:
- requestHeaderModifier:
- add:
- name:
- value:
- remove:
- name:
- value:
- set:
- name:
- value:
- responseHeaderModifier:
+ - requestHeaderModifier:
add:
- name:
- value:
- remove:
- name:
- value:
+ name: ""
+ value: ""
+ - responseHeaderModifier:
set:
- name:
- value:
+ name: ""
+ value: ""
urlRewrite:
- pathPrefix:
- matches:
- headers:
- invert:
- name:
- type:
- method:
- path:
- type:
- queryParams:
- name:
- type:
- retries:
- number:
- onConditions:
- onConnectFailure:
- onStatusCodes:
- timeouts:
- idle:
- nanos:
- seconds:
- request:
- nanos:
- seconds:
- status:
- conditions:
- lastTransitionTime:
- message:
- reason:
- status:
- type:
- lastSyncedTime:
-```
+ pathPrefix:
+ weight: 1
+ filters:
+ requestHeaderModifier:
+ remove:
+ name: ""
+ value: ""
+ responseHeaderModifier:
+ add:
+ name: ""
+ value: ""
+ urlRewrite:
+ pathPrefix:
+ matches:
+ headers:
+ name:
+ type:
+ value:
+ method:
+ method:
+ service:
+ type:
+ retries:
+ number:
+ value: 1
+ onConditions: ["cancelled", "unavailable"]
+ onConnectFailure: false
+ onStatusCodes: [400, 404]
+ timeouts:
+ idle:
+ nanos: 15
+ seconds: 1
+ request:
+ nanos: 10
+ seconds: 1
+```
## Specification
+This section provides details about the fields you can configure in the GRPCRoute custom resource definition (CRD).
+
+### `apiVersion`
-The specification block contains the details about each configuration. It
-is a flattened representation of the configuration model block that allows
-for extended descriptions, examples, and other information to help readers
-understand the behavior of the configurations.
+Specifies the version of the Consul API for integrating with Kubernetes. The value must be `mesh.consul.hashicorp.com/v2beta1`.
-### `Elem_a`
+#### Values
+
+- Default: None
+- This field is required.
+- String value that must be set to `mesh.consul.hashicorp.com/v2beta1`.
+
+### `kind`
-Use this space to thoroughly, but succinctly, document the configuration
-item. This format is intended to allow you to create complete documentation,
-however, _stay within the scope of the reference_. If the description
-deviates from the reference material, create a new Concept topic or add the
-information to an existing Concept.
+Specifies the type of CRD to implement. Must be set to `GRPCRoute`.
#### Values
-- Default: default value or none
-- This field is required.
-## Examples
+Specifies the namespace that the service resolver applies to. Refer to [namespaces](/consul/docs/enterprise/namespaces) for more information.
+
+#### Values
+
+- Default: None
+- Data type: String
+
+### `spec`
+
+Map that contains the details about the `GRPCRoute` CRD. The `apiVersion`, `kind`, and `metadata` fields are siblings of the spec field. All other configurations are children.
+
+When using this CRD, the `spec` field must align with GAMMAs resource. Refer to [GRPCRoute in the Kubernetes documentation](https://gateway-api.sigs.k8s.io/references/spec/#gateway.networking.k8s.io/v1alpha2.GRPCRoute).
+
+#### Values
+
+- Default: None
+- This field is required.
+- Data type: Map
+
+### `spec.parentRefs`
+
+Specifies the resources to attach the route to. Usually these are services. You cannot reference the same `parentsRefs` multiple times. Instead, specify each [`spec.parentRefs.ref`](#spec-parentrefs-ref) in the same block.
+
+#### Values
+
+- Default: None
+- This field is required.
+- Data type: Map
+
+### `spec.parentRefs.port`
+
+Specifies the name of the Consul service's port that the configuration applies to.
+
+#### Values
+
+- Default: None
+- Data type: String
+
+### `spec.parentRefs.ref`
+
+Specifies the resource that the configuration applies to.
+
+#### Values
+
+- Default: None
+- Data type: Map
+
+### `spec.parentRefs.ref.name`
+
+Specifies the user-defined name of the resource that the configuration applies to.
+
+#### Values
+
+- Default: None
+- Data type: String
+
+### `spec.parentRefs.ref.section`
+
+Specifies the section of the resource that the configuration applies to.
+
+#### Values
+
+- Default: None
+- Data type: String
+
+### `spec.parentRefs.ref.tenancy`
+
+Specifies the user-defined namespace, partition, or cluster peer of the resource that the configuration applies to.
+
+#### Values
+
+- Default: None
+- Data type: Map containing the following parameters:
+
+ | Parameter | Description | Data type | Default |
+ | :------------ | :------------------------------------------------------------------- | :-------- | :------- |
+ | `namespace` | Identifies the namespace of the resource the configuration applies to. | String | None |
+ | `partition` | Identifies the admin partition of the resource the configuration applies to. | String | None |
+ | `peerName` | Identifies the name of a cluster peer the resource is imported from that the configuration applies to. | String | None |
+
+### `spec.parentRefs.ref.type`
+
+Specifies the type of resource that the configuration applies to. To reference a service in the Consul catalog, configure the resource type as `catalog.v2beta1.Service`.
+
+#### Values
+
+- Default: None
+- Data type: Map containing the following parameters:
+
+ | Parameter | Description | Data type | Default |
+ | :------------ | :------------------------------------------------------------------- | :-------- | :------- |
+ | `group` | Specifies a group for the resource type within the Kubernetes cluster. To reference a service in the Consul catalog, set this parameter to `catalog`. | String | None |
+ | `groupVersion` | Specifies a groupVersion for the resource type within the Kubenretes cluster. To reference a service in the Consul catalog, set this parameter to `v2beta1`. | String (in code, should be int based on desc.) | None |
+ | `kind` | Specifies the kind of the Kubernetes object the resource applies to. To reference a service in the Consul catalog, set this parameter to `Service`. | String | None |
+
+### `spec.rules`
+
+Specifies rules for sidecar proxies to direct a service's HTTP traffic within the service mesh, including filtering, retry, and timeout behavior.
+
+#### Values
+
+- Default: None
+- Data type: Map
+
+### `spec.rules.backendRefs`
+
+Specifies the Kubernetes Service backend to direct HTTP traffic to when a request matches the service described in [`spec.parentRefs`](#spec-parentrefs). The Service backend is the collection of endpoint IPs for the service. Refer to [the Kubernetes Gateway API specification](https://gateway-api.sigs.k8s.io/concepts/gamma/#an-overview-of-the-gateway-api-for-service-mesh) for more information about Service backends.
+
+When a valid Service backend cannot be reached and no additional filters apply, traffic that matches the rule returns a 500 status code.
+
+When different Service backends are specified in [`spec.rules.backendRefs.weight`](#spec-rules-backendrefs-weight) and one is invalid, the relative weights are maintained and traffic is not redirected automatically. For example, when traffic is configured in a 50-50 split between `api` and `admin` and no valid endpoints for `admin` can be reached, the 50% of traffic intended for `admin` returns with a 500 status code.
+
+#### Values
+
+- Default: None
+- Data type: Map
+
+### `spec.rules.backendRefs.backendRef`
+
+Specifies an individual Service backend where matching requests should be sent.
+
+#### Values
+
+- Default: None
+- Data type: Map
+
+### `spec.rules.backendRefs.backendRef.datacenter`
+
+Specifies the name of the Consul datacenter that registered the Service backend that the configuration routes traffic to.
+
+#### Values
+
+- Default: None
+- Data type: String
+
+### `spec.rules.backendRefs.backendRef.port`
+
+Specifies the name of the port for the Consul service that the configuration routes traffic to.
+
+#### Values
+
+- Default: None
+- Data type: String
+
+### `spec.rules.backendRefs.backendRef.ref`
+
+The Consul service that the configuration routes traffic to.
+
+#### Values
+
+- Default: None
+- Data type: Map
+
+### `spec.rules.backendRefs.backendRef.ref.name`
+
+Specifies the user-defined name of the resource that the configuration routes traffic to.
+
+#### Values
+
+- Default: None
+- Data type: String
+
+### `spec.rules.backendRefs.backendRef.ref.section`
+
+Specifies the section the resource that the configuration routes traffic to.
+
+#### Values
+
+- Default: None
+- Data type: String
+
+### `spec.rules.backendRefs.backendRef.ref.tenancy`
+
+Specifies the user-defined namespace, partition, or cluster peer of the resource that the configuration routes to.
+
+#### Values
+
+- Default: None
+- Data type: Map containing the following parameters:
+
+ | Parameter | Description | Data type | Default |
+ | :------------ | :------------------------------------------------------------------- | :-------- | :------- |
+ | `namespace` | Identifies the namespace of the resource the configuration routes traffic to. | String | None |
+ | `partition` | Identifies the admin partition of the resource the configuration routes traffic to. | String | None |
+ | `peerName` | Identifies the name of a cluster peer the resource is imported from that the configuration routes traffic to. | String | None |
+
+### `spec.rules.backendRefs.backendRef.ref.type`
+
+Specifies the type of resource that the configuration routes traffic to. To reference a service in the Consul catalog, configure the resource type as `catalog.v2beta1.Service`.
+
+#### Values
+
+- Default: None
+- Data type: Map containing the following parameters:
+
+ | Parameter | Description | Data type | Default |
+ | `group` | Specifies a group for the resource type within the Kubernetes cluster. To reference a service in the Consul catalog, set this parameter to `catalog`. | String | None |
+ | `groupVersion` | Specifies a groupVersion for the resource type within the Kubenretes cluster. To reference a service in the Consul catalog, set this parameter to `v2beta1`. | String (in code, should be int based on desc.) | None |
+ | `kind` | Specifies the kind of the Kubernetes object for the resource. To reference a service in the Consul catalog, set this parameter to `Service`. | String | None |
+
+### `spec.rules.backendRefs.filters`
+
+Specifies filtering behavior for services configured in the same [`spec.rules.backendRefs`](#spec-rules-backendrefs) block.
+
+#### Values
+
+- Default: None
+- Data type: Map
+
+### `spec.rules.backendRefs.filters.requestHeaderModifier`
+
+Specifies a set of header modification rules applied to requests routed with the GRPCRoute resource.
+
+#### Values
+
+- Default: None
+- Values: Object containing one or more fields that define header modification rules:
+ - `add`: Map of one or more key-value pairs.
+ - `set`: Map of one or more key-value pairs.
+ - `remove`: Map of one or more key-value pairs.
+
+The following table describes how to configure values for request headers:
+
+| Rule | Description | Type |
+| --- | --- | --- |
+| `add` | Defines a set of key-value pairs to add to the header. Use header names as the keys. Header names are not case-sensitive. If header values with the same name already exist, the value is appended and Consul applies both headers. You can [use variable placeholders](#use-variable-placeholders). | map of strings |
+| `set` | Defines a set of key-value pairs to add to the request header or to replace existing header values with. Use header names as the keys. Header names are not case-sensitive. If header values with the same names already exist, Consul replaces the header values. You can [use variable placeholders](#use-variable-placeholders). | map of strings |
+| `remove` | Defines a list of headers to remove. Consul removes only headers containing exact matches. Header names are not case-sensitive. | list of strings |
+
+### `spec.rules.backendRefs.filters.responseHeaderModifier`
+
+Specifies a set of header modification rules applied to responses routed with the GRPCRoute resource.
+
+#### Values
+
+- Default: None
+- Values: Object containing one or more fields that define header modification rules:
+ - `add`: Map of one or more key-value pairs.
+ - `set`: Map of one or more key-value pairs.
+ - `remove`: Map of one or more key-value pairs.
+
+The following table describes how to configure values for request headers:
+
+| Rule | Description | Type |
+| --- | --- | --- |
+| `add` | Defines a set of key-value pairs to add to the header. Use header names as the keys. Header names are not case-sensitive. If header values with the same name already exist, the value is appended and Consul applies both headers. You can [use variable placeholders](#use-variable-placeholders). | map of strings |
+| `set` | Defines a set of key-value pairs to add to the request header or to replace existing header values with. Use header names as the keys. Header names are not case-sensitive. If header values with the same names already exist, Consul replaces the header values. You can [use variable placeholders](#use-variable-placeholders). | map of strings |
+| `remove` | Defines a list of headers to remove. Consul removes only headers containing exact matches. Header names are not case-sensitive. | list of strings |
+
+### `spec.rules.backendRefs.filters.urlRewrite`
+
+Specifies a path to modify the URL with when a request is forwarded.
+
+#### Values
+
+- Default: None
+- Data type: Map containing the following parameter:
+
+ | Parameter | Description | Data type | Default |
+ | :------------ | :------------------------------------------------------------------------------------------------- | --------- | ------- |
+ | `pathPrefix` | Specifies the path that is prepended to the URL. | String | None |
+
+### `spec.rules.backendRefs.weight`
+
+Specifies the proportion of requests routed to the specified service.
+
+This proportion is relative to the sum of all weights in the [`spec.rules.backendRefs`](#spec-rules-backendrefs) block. As a result, weights do not need to add up to 100. When only one backend is specified and the weight is greater then 0, 100% of traffic is forwarded.
+
+When this parameter is not specified, it assumes the default value `1`.
+
+#### Values
-If you have more than one example to show, create an Examples section
-(general block) and introduce the examples per the style guide.
+- Default: `1`
+- Data type: Integer
-### Specific use case
+### `spec.rules.filters`
-Introduce examples clearly and help readers understand the connections
-between the example snippet and the configuration element you are trying to
-explain. Use phrases such as "In the following example, the `elem` performs
-some action on a service named `service-name`".
+Specifies filtering behavior for all requests that match the service defined in [`spec.parentRefs`](#spec-parent-refs).
+#### Values
+
+- Default: None
+- Data type: Map
+
+### `spec.rules.filters.requestHeaderModifier`
+
+Specifies a set of header modification rules applied to requests that match the service defined in [`spec.parentRefs`](#spec-parent-refs).
+
+#### Values
+
+- Default: None
+- Values: Object containing one or more fields that define header modification rules:
+ - `add`: Map of one or more key-value pairs.
+ - `set`: Map of one or more key-value pairs.
+ - `remove`: Map of one or more key-value pairs.
+
+The following table describes how to configure values for request headers:
+
+| Rule | Description | Type |
+| --- | --- | --- |
+| `add` | Defines a set of key-value pairs to add to the header. Use header names as the keys. Header names are not case-sensitive. If header values with the same name already exist, the value is appended and Consul applies both headers. You can [use variable placeholders](#use-variable-placeholders). | map of strings |
+| `set` | Defines a set of key-value pairs to add to the request header or to replace existing header values with. Use header names as the keys. Header names are not case-sensitive. If header values with the same names already exist, Consul replaces the header values. You can [use variable placeholders](#use-variable-placeholders). | map of strings |
+| `remove` | Defines a list of headers to remove. Consul removes only headers containing exact matches. Header names are not case-sensitive. | list of strings |
+
+### `spec.rules.filters.responseHeaderModifier`
+
+Specifies a set of header modification rules applied to responses from services matching [`spec.parentRefs`](#spec-parent-refs).
+
+#### Values
+
+- Default: None
+- Values: Object containing one or more fields that define header modification rules:
+ - `add`: Map of one or more key-value pairs.
+ - `set`: Map of one or more key-value pairs.
+ - `remove`: Map of one or more key-value pairs.
+
+The following table describes how to configure values for request headers:
+
+| Rule | Description | Type |
+| --- | --- | --- |
+| `add` | Defines a set of key-value pairs to add to the header. Use header names as the keys. Header names are not case-sensitive. If header values with the same name already exist, the value is appended and Consul applies both headers. You can [use variable placeholders](#use-variable-placeholders). | map of strings |
+| `set` | Defines a set of key-value pairs to add to the request header or to replace existing header values with. Use header names as the keys. Header names are not case-sensitive. If header values with the same names already exist, Consul replaces the header values. You can [use variable placeholders](#use-variable-placeholders). | map of strings |
+| `remove` | Defines a list of headers to remove. Consul removes only headers containing exact matches. Header names are not case-sensitive. | list of strings |
+
+### `spec.rules.filters.urlRewrite`
+
+Specifies a path to modify the URL with when a request matching [`spec.parentRefs`](#spec-parent-refs) is forwarded.
+
+#### Values
+
+- Default: None
+- Data type: Map containing the following parameter:
+
+ | Parameter | Description | Data type | Default |
+ | :------------ | :------------------------------------------------------------------------------------------------- | --------- | ------- |
+ | `pathPrefix` | Specifies a path to prepend to the URL when a request matching [`spec.parentRefs`](#spec-parent-refs) is forwarded. | String | None |
+
+### `spec.rules.matches`
+
+Specifies rules for matching services described in [`spec.parentRefs`](#spec-parent-refs) according to the request header or method.
+
+#### Values
+
+- Default: None
+- Data type: Map
+
+### `spec.rules.matches.headers`
+
+Specifies criteria for matching HTTP request headers.
+
+When [`spec.rules.matches.headers.value`] is specified multiple times, a request must match all of the specified values for the route to be selected.
+
+#### Values
+
+- Default: None
+- Data type: Map
+
+### `spec.rules.matches.headers.name`
+
+Specifies the name of a HTTP request header to match on.
+
+#### Values
+
+- Default: None
+- Data type: String
+
+### `spec.rules.matches.headers.type`
+
+Specifies a type of match to perform on the HTTP request header. Supported match types include: unspecified, exact, regex, present, prefix, and suffix.
+
+#### Values
+
+- Default: None
+- Data type: String that should match one of the following values:
+
+ - `HEADER_MATCH_TYPE_UNSPECIFIED`
+ - `HEADER_MATCH_TYPE_EXACT`
+ - `HEADER_MATCH_TYPE_REGEX`
+ - `HEADER_MATCH_TYPE_PRESENT`
+ - `HEADER_MATCH_TYPE_PREFIX`
+ - `HEADER_MATCH_TYPE_SUFFIX`
+
+### `spec.rules.matches.headers.value`
+
+Specifies the value of the HTTP request header to match. When this field is specified multiple times, a request must match all of the specified values for the route to be selected.
+
+#### Values
+
+- Default: None
+- Data type: String
+
+### `spec.rules.matches.method`
+
+Specifies criteria for matching a service and a HTTP request method. When configuring this field, either [`spec.rules.matches.method.method`](#spec-rules-matches-method-method) or [`spec.rules.matches.method.service`](#spec-rules-matches-method-service) must be a non-empty string.
+
+#### Values
+
+- Default: None
+- Data type: Map
+
+### `spec.rules.matches.method.method`
+
+Specifies the value of the method to match. When empty or omitted, all methods match.
+
+#### Values
+
+- Default: None
+- Data type: String
+
+### `spec.rules.matches.method.service`
+
+Specifies the value of the service to match. When empty or omitted, all services match.
+
+#### Values
+
+- Default: None
+- Data type: String
+
+### `spec.rules.matches.method.type`
+
+Specifies a type of match to perform on the HTTP request method. Supported match types include: unspecified, exact, and regex.
+
+#### Values
+
+- Default: None
+- Data type: String that should match one of the following values:
+
+ - `GRPC_METHOD_MATCH_TYPE_UNSPECIFIED`
+ - `GRPC_METHOD_MATCH_TYPE_EXACT`
+ - `GRPC_METHOD_MATCH_TYPE_REGEX`
+
+### `spec.rules.retries`
+
+Specifies retry logic for routing HTTP traffic.
+
+#### Values
+
+- Default: None
+- Data type: Map
+
+### `spec.rules.retries.number`
+
+Specifies the number of retries to attempt when a request fails.
+
+#### Values
+
+- Default: None
+- Data type: Map that contains the following parameter:
+
+ | Parameter | Description | Data type | Default |
+ | :-------- | :------------------------------------------- | --------- | ------- |
+ | `value` | Specifies the number of retries to attempt. | Integer | None |
+
+### `spec.rules.retries.onConditions`
+
+Specifies Envoy conditions that cause an automatic retry attempt.
+
+#### Values
+
+- Default: None
+- Data type: Map of strings
+
+### `spec.rules.retries.onConnnectFailure`
+
+Enables an automatic retry attempt when a connection failure error occurs.
+
+#### Values
+
+- Default: `false`
+- Data type: Boolean
+
+### `spec.rules.retries.onStatusCodes`
+
+Specifies the response status codes that are eligible for retry attempts.
+
+#### Values
+
+- Default: None
+- Data type: Map of integers
+
+### `spec.rules.timeouts`
+
+Specifies timeout logic when routing HTTP traffic
+
+#### Values
+
+- Default: None
+- Data type: Map
+
+### `spec.rules.timeouts.idle`
+
+Specifies the total amount of time permitted for the request stream to be idle before a timeout occurs.
+
+#### Values
+
+- Default: None
+- Data type: Map that can contain the following parameters:
+
+ | Parameter | Description | Data type | Default |
+ | :-------- | :--------------------------------------------------------------- | --------- | ------- |
+ | `nanos` | Specifies the number of nanoseconds before triggering a timeout. | Integer | None |
+ | `seconds` | Specifies the number of seconds before triggering a timeout. | Integer | None |
+
+### `spec.rules.timeouts.request`
+
+Specifies the total amount of time spent processing the entire downstream request, including retries, before triggering a timeout.
+
+#### Values
+
+- Default: None
+- Data type: Map that can contain the following parameters:
+
+ | Parameter | Description | Data type | Default |
+ | :-------- | :--------------------------------------------------------------- | --------- | ------- |
+ | `nanos` | Specifies the number of nanoseconds before triggering a timeout. | Integer | None |
+ | `seconds` | Specifies the number of seconds before triggering a timeout. | Integer | None |
+
+## Examples
+
+The following examples demonstrate common GRPCRoute CRD configuration patterns for specific use cases.
+
+### Split HTTP traffic between two ports
+
+The following example splits traffic for the `api` service. HTTP traffic for services registered to the Consul catalog that are available at the `api-workload` port is split so that 50% of the traffic routes to the service at the `api-workload` port and 50% routes to the service at the `admin-workload` port.
```yaml
apiVersion: mesh.consul.hashicorp.com/v2beta1
@@ -235,7 +768,7 @@ spec:
kind: Service
name: api
# Note that right now, we must target the workload port,
- # not the service port. This is likely to change in 1.18+.
+ # not the service port.
port: "api-workload"
rules:
- backendRefs:
@@ -247,7 +780,7 @@ spec:
kind: Service
name: api
# Note that right now, we must target the workload port,
- # not the service port. This is likely to change in 1.18+.
+ # not the service port.
port: "api-workload"
weight: 50
- backendRef:
@@ -258,7 +791,84 @@ spec:
kind: Service
name: api
# Note that right now, we must target the workload port,
- # not the service port. This is likely to change in 1.18+.
+ # not the service port.
port: "admin-workload"
weight: 50
```
+
+### Route traffic by matching header
+
+The following examples routes HTTP traffic for the `api` service according to its header HTTP traffic for services registered to the Consul catalog that are available at the `api-workload` port are routed according to the following criteria:
+
+- Traffic with a header that contains a `x-debug` value of exactly `1` has their response and request headers modified and is routed to the service with the `api` workload identity.
+- Traffic with a header that contains a `x-debug` value of exactly `2` has their response and request headers modified and is routed to the service with the `api-admin` workload identity.
+
+```yaml
+apiVersion: mesh.consul.hashicorp.com/v2beta1
+kind: HTTPRoute
+metadata:
+ name: api-filter
+ namespace: default
+spec:
+ parentRefs:
+ - ref:
+ type:
+ group: catalog
+ groupVersion: v2beta1
+ kind: Service
+ name: api
+ # Note that right now, we must target the workload port,
+ # not the service port.
+ port: "api-workload"
+ rules:
+ - matches:
+ - headers:
+ - type: "HEADER_MATCH_TYPE_EXACT"
+ name: "x-debug"
+ value: "1"
+ filters:
+ - requestHeaderModifier:
+ add:
+ - name: "request-foo"
+ value: "request-bar"
+ - responseHeaderModifier:
+ add:
+ - name: "response-foo"
+ value: "response-bar"
+ backendRefs:
+ - backendRef:
+ ref:
+ type:
+ group: catalog
+ groupVersion: v2beta1
+ kind: Service
+ name: api
+ # Note that right now, we must target the workload port,
+ # not the service port.
+ port: "api-workload"
+ - matches:
+ - headers:
+ - type: "HEADER_MATCH_TYPE_EXACT"
+ name: "x-debug"
+ value: "2"
+ filters:
+ - requestHeaderModifier:
+ add:
+ - name: "request-foo"
+ value: "request-bar"
+ - responseHeaderModifier:
+ add:
+ - name: "response-foo"
+ value: "response-bar"
+ backendRefs:
+ - backendRef:
+ ref:
+ type:
+ group: catalog
+ groupVersion: v2beta1
+ kind: Service
+ name: api-admin
+ # Note that right now, we must target the workload port,
+ # not the service port.
+ port: "admin-workload"
+```
\ No newline at end of file