-
Notifications
You must be signed in to change notification settings - Fork 347
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[release/v0.5] Cherry-pick fixes needed for v0.5 (#1749)
* refactor: set defaults in Deployment, else k8s sets them for you, creating infinite reconciliation loop (#1594) * fix: envoy proxy resource apply bug. Signed-off-by: qicz <qiczzhu@gmail.com> * update pointer. Signed-off-by: qicz <qiczzhu@gmail.com> * add comment Signed-off-by: qicz <qiczzhu@gmail.com> * update cm cmp logic. Signed-off-by: qicz <qiczzhu@gmail.com> * fix lint Signed-off-by: qicz <qiczzhu@gmail.com> * add probe field default value. Signed-off-by: qicz <qiczzhu@gmail.com> * fix uts Signed-off-by: qicz <qiczzhu@gmail.com> * align probe Signed-off-by: qicz <qiczzhu@gmail.com> * optimize deploy compare logic Signed-off-by: qicz <qiczzhu@gmail.com> * add compare deploy uts Signed-off-by: qicz <qiczzhu@gmail.com> * rm cm binarydata cmp Signed-off-by: qicz <qiczzhu@gmail.com> * rm deploy cmp logic Signed-off-by: qicz <qiczzhu@gmail.com> * fix ut Signed-off-by: qicz <qiczzhu@gmail.com> * fix lint Signed-off-by: qicz <qiczzhu@gmail.com> --------- Signed-off-by: qicz <qiczzhu@gmail.com> Signed-off-by: qi <qiczzhu@gmail.com> (cherry picked from commit 9ba9103) * DeepCopy resources that require status updates (#1723) * Was seeing constant churn between provider runner publishing resources and gateway-api runner receiving them. * Tried to debug it by printing the o/p of `cmp.Diff` between current and previous values ``` diff --git a/internal/gatewayapi/runner/runner.go b/internal/gatewayapi/runner/runner.go index 050394ba..50d09f6f 100644 --- a/internal/gatewayapi/runner/runner.go +++ b/internal/gatewayapi/runner/runner.go @@ -8,6 +8,7 @@ package runner import ( "context" + "github.com/google/go-cmp/cmp" "k8s.io/apimachinery/pkg/runtime/schema" "sigs.k8s.io/gateway-api/apis/v1beta1" "sigs.k8s.io/yaml" @@ -49,6 +50,7 @@ func (r *Runner) Start(ctx context.Context) error { } func (r *Runner) subscribeAndTranslate(ctx context.Context) { + prev := &gatewayapi.Resources{} message.HandleSubscription(r.ProviderResources.GatewayAPIResources.Subscribe(ctx), func(update message.Update[string, *gatewayapi.Resources]) { val := update.Value @@ -56,6 +58,9 @@ func (r *Runner) subscribeAndTranslate(ctx context.Context) { if update.Delete || val == nil { return } + diff := cmp.Diff(prev, val) + r.Logger.WithValues("output", "diff").Info(diff) + prev = val.DeepCopy() // Translate and publish IRs. t := &gatewayapi.Translator{ ``` Here's the o/p and its empty ``` 2023-07-27T23:55:29.795Z INFO gateway-api runner/runner.go:62 {"runner": "gateway-api", "output": "diff"} ``` * Using a DeepCopy for resources that were updating the `Status` subresource seems to have solved the issue, which implies that watchable doesnt like clients to mutate the value, even though they are meant to be a `DeepCopy` Fixes: #1715 Signed-off-by: Arko Dasgupta <arko@tetrate.io> (cherry picked from commit 5b72451) * observability: add container port for metrics (#1736) container port Signed-off-by: zirain <zirain2009@gmail.com> (cherry picked from commit 4bba03a) * docs: Add user docs for EnvoyPatchPolicy (#1733) * Add user docs for EnvoyPatchPolicy Relates to #24 Signed-off-by: Arko Dasgupta <arko@tetrate.io> * nits Signed-off-by: Arko Dasgupta <arko@tetrate.io> * wrap up Signed-off-by: Arko Dasgupta <arko@tetrate.io> * lint Signed-off-by: Arko Dasgupta <arko@tetrate.io> * address comments && fix config Signed-off-by: Arko Dasgupta <arko@tetrate.io> --------- Signed-off-by: Arko Dasgupta <arko@tetrate.io> (cherry picked from commit 27b0939) * e2e & misc fixes for EnvoyPatchPolicy (#1738) * Add E2E for EnvoyPatchPolicy * Use LocalReplyConfig to return a custom status code `406` when there is no valid route match Signed-off-by: Arko Dasgupta <arko@tetrate.io> (cherry picked from commit a7784c5) --------- Signed-off-by: Arko Dasgupta <arko@tetrate.io> Co-authored-by: qi <qiczzhu@gmail.com> Co-authored-by: zirain <zirain2009@gmail.com>
- Loading branch information
1 parent
c303835
commit a498365
Showing
40 changed files
with
499 additions
and
29 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -142,7 +142,6 @@ spec: | |
- JSONPatch | ||
type: string | ||
required: | ||
- priority | ||
- targetRef | ||
- type | ||
type: object | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,200 @@ | ||
# Envoy Patch Policy | ||
|
||
This guide explains the usage of the [EnvoyPatchPolicy][] API. | ||
__Note:__ This API is meant for users extremely familiar with Envoy [xDS][] semantics. | ||
Also before considering this API for production use cases, please be aware that this API | ||
is unstable and the outcome may change across versions. Use at your own risk. | ||
|
||
## Introduction | ||
|
||
The [EnvoyPatchPolicy][] API allows user to modify the output [xDS][] | ||
configuration generated by Envoy Gateway intended for EnvoyProxy, | ||
using [JSON Patch][] semantics. | ||
|
||
## Motivation | ||
|
||
This API was introduced to allow advanced users to be able to leverage Envoy Proxy functionality | ||
not exposed by Envoy Gateway APIs today. | ||
|
||
## Quickstart | ||
|
||
### Prerequistes | ||
|
||
* Follow the steps from the [Quickstart](quickstart.md) guide to install Envoy Gateway and the example manifest. | ||
Before proceeding, you should be able to query the example backend using HTTP. | ||
|
||
### Enable EnvoyPatchPolicy | ||
|
||
* By default EnvoyPatchPolicy][] is disabled. Lets enable it in the [EnvoyGateway][] startup configuration | ||
|
||
* The default installation of Envoy Gateway installs a default [EnvoyGateway][] configuration and attaches it | ||
using a `ConfigMap`. In the next step, we will update this resource to enable EnvoyPatchPolicy. | ||
|
||
|
||
```shell | ||
cat <<EOF | kubectl apply -f - | ||
apiVersion: v1 | ||
kind: ConfigMap | ||
metadata: | ||
name: envoy-gateway-config | ||
namespace: envoy-gateway-system | ||
data: | ||
envoy-gateway.yaml: | | ||
apiVersion: config.gateway.envoyproxy.io/v1alpha1 | ||
kind: EnvoyGateway | ||
provider: | ||
type: Kubernetes | ||
gateway: | ||
controllerName: gateway.envoyproxy.io/gatewayclass-controller | ||
extensionApis: | ||
enableEnvoyPatchPolicy: true | ||
EOF | ||
``` | ||
|
||
* After updating the `ConfigMap`, you will need to restart the `envoy-gateway` deployment so the configuration kicks in | ||
|
||
```shell | ||
kubectl rollout restart deployment envoy-gateway -n envoy-gateway-system | ||
``` | ||
|
||
## Testing | ||
|
||
### Customize Response | ||
|
||
* Lets use EnvoyProxy's [Local Reply Modification][] feature to return a custom response back to the client when | ||
the status code is `404` | ||
|
||
* Lets apply the configuration | ||
|
||
```shell | ||
cat <<EOF | kubectl apply -f - | ||
apiVersion: gateway.envoyproxy.io/v1alpha1 | ||
kind: EnvoyPatchPolicy | ||
metadata: | ||
name: custom-response-patch-policy | ||
namespace: default | ||
spec: | ||
targetRef: | ||
group: gateway.networking.k8s.io | ||
kind: Gateway | ||
name: eg | ||
namespace: default | ||
type: JSONPatch | ||
jsonPatches: | ||
- type: "type.googleapis.com/envoy.config.listener.v3.Listener" | ||
# The listener name is of the form <GatewayNamespace>/<GatewayName>/<GatewayListenerName> | ||
name: default/eg/http | ||
operation: | ||
op: add | ||
path: "/default_filter_chain/filters/0/typed_config/local_reply_config" | ||
value: | ||
mappers: | ||
- filter: | ||
status_code_filter: | ||
comparison: | ||
op: EQ | ||
value: | ||
default_value: 404 | ||
runtime_key: key_b | ||
status_code: 406 | ||
body: | ||
inline_string: "could not find what you are looking for" | ||
EOF | ||
``` | ||
|
||
* Lets edit the HTTPRoute resource from the Quickstart to only match on paths with value `/get` | ||
|
||
``` | ||
kubectl patch httproute backend --type=json --patch '[{ | ||
"op": "add", | ||
"path": "/spec/rules/0/matches/0/path/value", | ||
"value": "/get", | ||
}]' | ||
``` | ||
|
||
* Lets test it out by specifying a path apart from `/get` | ||
|
||
``` | ||
$ curl --header "Host: www.example.com" http://localhost:8888/find | ||
Handling connection for 8888 | ||
could not find what you are looking for | ||
``` | ||
|
||
## Debugging | ||
|
||
### Runtime | ||
|
||
* The `Status` subresource should have information about the status of the resource. Make sure | ||
`Accepted=True` and `Programmed=True` conditions are set to ensure that the policy has been | ||
applied to Envoy Proxy. | ||
|
||
``` | ||
apiVersion: gateway.envoyproxy.io/v1alpha1 | ||
kind: EnvoyPatchPolicy | ||
metadata: | ||
annotations: | ||
kubectl.kubernetes.io/last-applied-configuration: | | ||
{"apiVersion":"gateway.envoyproxy.io/v1alpha1","kind":"EnvoyPatchPolicy","metadata":{"annotations":{},"name":"custom-response-patch-policy","namespace":"default"},"spec":{"jsonPatches":[{"name":"default/eg/http","operation":{"op":"add","path":"/default_filter_chain/filters/0/typed_config/local_reply_config","value":{"mappers":[{"body":{"inline_string":"could not find what you are looking for"},"filter":{"status_code_filter":{"comparison":{"op":"EQ","value":{"default_value":404}}}}}]}},"type":"type.googleapis.com/envoy.config.listener.v3.Listener"}],"priority":0,"targetRef":{"group":"gateway.networking.k8s.io","kind":"Gateway","name":"eg","namespace":"default"},"type":"JSONPatch"}} | ||
creationTimestamp: "2023-07-31T21:47:53Z" | ||
generation: 1 | ||
name: custom-response-patch-policy | ||
namespace: default | ||
resourceVersion: "10265" | ||
uid: a35bda6e-a0cc-46d7-a63a-cee765174bc3 | ||
spec: | ||
jsonPatches: | ||
- name: default/eg/http | ||
operation: | ||
op: add | ||
path: /default_filter_chain/filters/0/typed_config/local_reply_config | ||
value: | ||
mappers: | ||
- body: | ||
inline_string: could not find what you are looking for | ||
filter: | ||
status_code_filter: | ||
comparison: | ||
op: EQ | ||
value: | ||
default_value: 404 | ||
type: type.googleapis.com/envoy.config.listener.v3.Listener | ||
priority: 0 | ||
targetRef: | ||
group: gateway.networking.k8s.io | ||
kind: Gateway | ||
name: eg | ||
namespace: default | ||
type: JSONPatch | ||
status: | ||
conditions: | ||
- lastTransitionTime: "2023-07-31T21:48:19Z" | ||
message: EnvoyPatchPolicy has been accepted. | ||
observedGeneration: 1 | ||
reason: Accepted | ||
status: "True" | ||
type: Accepted | ||
- lastTransitionTime: "2023-07-31T21:48:19Z" | ||
message: successfully applied patches. | ||
reason: Programmed | ||
status: "True" | ||
type: Programmed | ||
``` | ||
|
||
### Offline | ||
|
||
* You can use [egctl x translate][] to validate the translated xds output. | ||
|
||
## Caveats | ||
|
||
This API will always be an unstable API and the same outcome cannot be garunteed | ||
across versions for these reasons | ||
* The Envoy Proxy API might deprecate and remove API fields | ||
* Envoy Gateway might alter the xDS translation creating a different xDS output | ||
such as changing the `name` field of resources. | ||
|
||
[EnvoyPatchPolicy]: https://gateway.envoyproxy.io/latest/api/extension_types.html#envoypatchpolicy | ||
[EnvoyGateway]: https://gateway.envoyproxy.io/latest/api/config_types.html#envoygateway | ||
[JSON Patch]: https://datatracker.ietf.org/doc/html/rfc6902 | ||
[xDS]: https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/operations/dynamic_configuration | ||
[Local Reply Modification]: https://www.envoyproxy.io/docs/envoy/latest/configuration/http/http_conn_man/local_reply | ||
[egctl x translate]: https://gateway.envoyproxy.io/latest/user/egctl.html#egctl-experimental-translate |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
apiVersion: monitoring.coreos.com/v1 | ||
kind: PodMonitor | ||
metadata: | ||
name: envoy-gateway-proxy-monitoring | ||
namespace: envoy-gateway-system | ||
spec: | ||
selector: | ||
matchLabels: | ||
app.kubernetes.io/name: envoy | ||
app.kubernetes.io/component: proxy | ||
namespaceSelector: | ||
any: true | ||
jobLabel: proxy-stats | ||
podMetricsEndpoints: | ||
- path: /stats/prometheus | ||
interval: 15s | ||
port: metrics |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.