From 262c3a18c54814ebe0e10523a02414edd9f12035 Mon Sep 17 00:00:00 2001 From: Yuval Kohavi Date: Sat, 8 Mar 2025 13:49:09 -0500 Subject: [PATCH] added diagrams --- DEV.md => devel/architecture/kgateway/DEV.md | 17 ++++++++++------- devel/architecture/kgateway/translation.svg | 2 ++ 2 files changed, 12 insertions(+), 7 deletions(-) rename DEV.md => devel/architecture/kgateway/DEV.md (88%) create mode 100644 devel/architecture/kgateway/translation.svg diff --git a/DEV.md b/devel/architecture/kgateway/DEV.md similarity index 88% rename from DEV.md rename to devel/architecture/kgateway/DEV.md index 5f45151b261..778ec09d956 100644 --- a/DEV.md +++ b/devel/architecture/kgateway/DEV.md @@ -12,7 +12,8 @@ Going down further, to enable these goals we use [KRT](https://github.com/istio/ - The ability to complement controllers of custom Intermediate Representation (henceforth IR). - Automatically track object dependencies and changes and only invoke logic that depends on the object that changed. -# CRD Journey +# CRD Lifecycle + How does a user CRD make it into envoy? We have 3 main translation lifecycles: Routes & Listeners, Clusters and Endpoints. @@ -23,15 +24,13 @@ Envoy Routes & Listeners translate from Gateways, HttpRoutes, and user policies ## Policies (Contributed by Plugins) +To add a policy to KGateway, it needs to be contributed through a **plugin**. Each plugin acts as an independent Kubernetes controller that provides Kgateway with a **KRT collection of IR policies** (this is done by translating the policy CRD to a policy IR). The second important thing a plugin provides is a function that allocates a **translation pass** for the gateway translation phase. This will be used when doing xDS translation. More on that later. + To add a policy to Kgateway we need to 'contribute' it as a plugin. You can think of a plugin as an independent k8s controller that translates a CRD to an krt-collection of policies in IR form Kgateway can understand (it's called `ir.PolicyWrapper`). A plugin lifecycle is the length of the program - it doesn't reset on each translation (we will explain later where we hold translation state). - -The first step is to convert each user policy into an IR form. This is done by creating a collection of these objects from k8s, and transforming the collection to an IR representation. - -When a plugin can contribute a policy to Kgateway, Kgateway uses policy collection to perform policy attachment - this is the process of assigning policies to the object they impact (like HttpRoutes) based on their targetRefs. -It's the plugin responsibility to convert the policy CRD to the IR form. Ideally, the IR should look as close as possible to the envoy configuration, so this translation only happens when the policy CRD changes. +When a plugin can contribute a policy to Kgateway, Kgateway uses policy collection to perform **policy attachment** - this is the process of assigning policies to the object they impact (like HttpRoutes) based on their targetRefs. You can see in the Plugin interface a field called `ContributesPolicies` which is a map of GK -> `PolicyPlugin`. The policy plugin contains a bunch of fields, but for our discussion we'll focus on these two: @@ -63,7 +62,7 @@ type PolicyWrapper struct { The system will make use of the targetRefs to attach the policy IR to Listners and HttpRoutes. You will then get access to the IR during translation (more on that later). -When translating a Policy to a PolicyIR, you'll want to take the translation as far as you can. For example, if your policy will result in an envoy +When translating a Policy to a PolicyIR, you'll want to take the translation **as close as you can** to envoy's config structures. For example, if your policy will result in an envoy PerFilterConfig on a route, the PolicyIR should contain the proto.Any that will be applied there. Doing most of the policy translation at this phase as advantages: - Policy will only re-translate when the policy CRD changes - We can expose errors in translation on the policy CRD status as soon as the policy is written (no need to depend on later translation phases). @@ -98,3 +97,7 @@ This allows us for example translate a route, and in response to that hold state When it translates GW-api route rules to envoy routes, it reads the `AttachedPolicies` and calls the appropriate function in the `ProxyTranslationPass` and passes in the attached policy IR. This let's the policy plugin code the modify the route or listener as needed, based on the policy IR (add filters, add filter route config, etc..). Then policy plugins are invoked with the attached policy IR, and can modify the envoy protbufs as needed + +# Diagram of the translation lifecycle + +![](translation.svg) \ No newline at end of file diff --git a/devel/architecture/kgateway/translation.svg b/devel/architecture/kgateway/translation.svg new file mode 100644 index 00000000000..a2ba2783b58 --- /dev/null +++ b/devel/architecture/kgateway/translation.svg @@ -0,0 +1,2 @@ +eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nO1dWXPaStq+P7+CytR3M3Vgel9y51x1MDAwNWNcdTAwMWPHxmDs2DNTLlx1MDAxOcRiXHUwMDE2XHUwMDExXHUwMDEw2Hjq/PevXHUwMDFi2yCh1lx1MDAwNoqdnEAqqSCE6O15n3frt//3Ry73yZ2P7E+fc5/sp4bV7zbH1uOnP/X1mT2edJ2h+lxiLd5PnOm4sbiz47qjyed//ctcdTAwMWGNXG6rb1x1MDAxNVx1MDAxYc7g5Zt231x1MDAxZdhDd6Lu/bd6n8v9b/Gv+qTb1N/fv7tcdTAwMDO98oPjjPjxl/IheLxuNejiq4ub3lx1MDAxYTS2XHUwMDFirjVs9+3VR0+6NVRcdTAwMTTo8spcXF2BXFyQXHUwMDAyUC8sMZaAUbb8+LHbdDv6XHUwMDE2XHUwMDAy0fJix+62O666SjgoSO9recvL737OgeWViTt2evaB03fGunH/XHUwMDAwXHJBpVxcNe3eavTaY2c6bC7vccfWcDKyxmosVve1uv1+zZ0vnq7GVI3dp7XfuH5r89r1sG+pXHUwMDFmbXeG9mTi+44zslx1MDAxYV13MTxg1Vx1MDAwYt3CUbm5mJr/rto0tlx1MDAwNnZZz81w2u8vL3eHTVuP+Kfbie/Xhs3XX3ub19Wk4dcrf63abtvNxVx1MDAxY1x1MDAwMcpcdTAwMDVcdTAwMTBw1Vx1MDAxNs9cdTAwMDLDcv3qmTNcXCw2yFx1MDAxMKVUzflqTruTQ7XC3MVjW1Z/Yq/mQLetuL76vCvQt8BcXPtpNTGe9XnRPCmW683DfFWK4sV95/m8bp9/Wt731+v/VuM3XHUwMDFkNS33tZtcdTAwMDRcdTAwMTIqKUNcdTAwMWOu5qLfXHUwMDFk9tZcdTAwMDe37zR6qy784Vx1MDAxObQ1tJhbXHUwMDEzQIuvMy9AYThcYlx1MDAxNFx1MDAxOVx1MDAwM1x1MDAxNOqZiiVOMN1cdTAwMDHDXGZcZtdcZlxm392vXGJAhDKh5JAwXHUwMDAxXHUwMDAw8FBcdTAwMDBcdTAwMTAsXHUwMDE4oZhssv6zXFyiq1x1MDAxNadXmur8Ud9yXXtoN3M1u9/KXHUwMDFmOEPX6uq3JfVLj9Y8V656Zld9Wus+61x1MDAxZSHhu3pkXHK6fT1cdTAwMWTC91x1MDAwYnv9bltcdTAwMGbNp77d8oyyXHUwMDFhXHUwMDFkt6soZ/mx64xWnzZe2zAuJyFcdTAwMWFn3G13h1b/cpNcdTAwMGVZU9ep2pOXLrnjqe1cdTAwMWRK+/hccjqwgGhcdTAwMDS4u5U7jpqMnzydsWL5pnjZmFx1MDAxZsgtqFBcdTAwMDJZoJrJhKRAUoFNTGhAOMd4x4RJXHUwMDAwP92eXHRcdTAwMTnEXHUwMDA0UVx1MDAwNUODIICYrV99XHUwMDEzXHUwMDA0XGZcdTAwMDLCJGErPeaHXHUwMDEzYbc6OX6w5pfjfm0+eJidXFxPblx1MDAwNk/piJBcIki5XHUwMDE3XHUwMDFhm1x1MDAxM6G5NVx1MDAxYlx1MDAxMaGEJFx1MDAwNiZU0Fx1MDAwMlJMXHSRks1cdTAwMDCbtMdcdTAwMWQrhoFklpxcdTAwMTUpJFx1MDAxMlx1MDAwM2pkRUV9YWDAXHUwMDFjSFx1MDAwNFx1MDAxNI6yZsW06zXAiuVq7rrrdnIjNeqNrj3JWcNmTs+2PWyqN65rNTp284OJMYZ21okxbZ+y4cajyd70UVSe9stccmiT28v7k+9HVlxubvRDXHUwMDFlYVx1MDAwMVx1MDAwYlghWjCAIEHYSI1cdTAwMDaYc8hcdTAwMTc689trdctcdTAwMGX1PtTPt6dGoWxELok0SVx1MDAwMyUlwqRcdTAwMDFcdTAwMDGUYc7BO9qIe0fD88vD0ZevXHUwMDE3tdLN3VWtNb2f5VNRo+qlslx1MDAwN7KhRnNrXHUwMDEyUSNYR1x0i0FcdMIwXGKSXHUwMDFkXHUwMDE3hqHiOYWFXGJcdTAwMTHFXFww4/JHLNxHXCKRRIJTj28lXHUwMDFiNky9RFx1MDAwM2z4dFjLXeq5VKaV7sfH0l5cZqOs015o47Pht9I3i4zrpVx1MDAwYrv4MJufXHUwMDBlhjeNu0krMb8pvdWHXFzsUVveoIpcdTAwMTn1W3Urk2OJXFzEV+NcdTAwMWNcdTAwMGZdaOs/kdD9h0WbotX6XHUwMDE5YbtiooolykjmT1x1MDAxZu5cdTAwMWYqfXAzbfbFXHUwMDE4vYnv5Oi2wNachzhcIlxmXGKjNchcdTAwMDPO0jfIS8WTQGk0q7n74Yw3PkeXrN05uKtNmuCxSUtN+FxcTcN4nFx1MDAwMFx1MDAwNCT2YmVzxjO3Jlx1MDAwMeMpg8OPXHUwMDFij0G9VFx1MDAwNFx1MDAwNVx1MDAwZlx1MDAwMoWnobhcdTAwMWROcj6cwOQsqOhcdTAwMGZcdTAwMDMksVx0XHUwMDEwXHUwMDFlMlpcdTAwMDOEYkCMXHUwMDE4xZtcdTAwMDDC14rtV22AXHUwMDA0j113VHWmrv2fYS43VCP1OTfWb/Mtx9GXXvScqt36nNOhNTNJXHUwMDAy39VcdTAwMWZIkjG0tE6SXHUwMDFidy5cdTAwMWJcdTAwMTJ1j2vP0K5+pU7xaFTbm12ewP5hclx1MDAxMvXoXHUwMDFlejRcdDfou8jAmpCk8ZAmkVx1MDAwNveohe7vf1x1MDAwZmmAtrdcdTAwMTQpXHUwMDA2RCpcdTAwMWJcdTAwMDV5XHUwMDE3+dJvXHUwMDE0kFx1MDAxZG9iglx1MDAwM0KxJOxcdTAwMWQtxVx1MDAxMby/6X6ZPEwn1eLpbbXUqpXnqSzFTHnT3JokvOkxXHUwMDA1X6BcIlx1MDAwMlCBnFx1MDAxOaDiWVY74lxcm+tYqOBcdTAwMTTEiVx1MDAxMFOmOza7UkPjXG5cYlBMMUFcdTAwMWLpku9GndVpXzGMJpRcXK745NpD3Vx1MDAwNcUqL1f2X3yR6v1cdTAwMDeTZ1xmXHUwMDFkhZJn+u5lQ5/Fi+dBkTWb/dLNPu+C8y9W9/okMX1K7LdBWZA9MVx1MDAwMj7vKTBIXGLEadg9f3eBkUJcdTAwMTKQrUlcdTAwMTNcdTAwMTMgKWFGzVx1MDAxYVx1MDAwNVx1MDAxM3OW7iXMpZL+71x1MDAxYXm8s+5cdTAwMWZvnNFev1IqXG5cZlx1MDAwNbvEJ7NUpKk6iz1cIm0r0jS3Jlx1MDAwMWlK4jc2mYEzsSHmQH9cdTAwMWbKTIFcdTAwMDCanFx1MDAwYlx1MDAwNVMvZdpcdTAwMDdYb6E7hibbUFx1MDAwMlx1MDAxOYdYZFx1MDAxY1ZMv1x1MDAxOFx1MDAwM0T4moKyMrJ+XHUwMDAySzGGPNbJLqZcdTAwMGLZXHUwMDEwXHUwMDFhuz2c7Z2eWO5Fi59cZrq3+Ful7SYmNIiw3yDETFx1MDAxNoSUkiO0yJoz+Fh3XHUwMDA0l1x1MDAxMbzZ9lYhXHUwMDExXHUwMDEyLaBvYjhcdTAwMTJcdTAwMWFAQVx1MDAxMCEsXHUwMDA1Ju9oXHUwMDE2Wue1/FXvyMawan9t3ORPq1x1MDAwZuP9lGYhwVwiI4YztyZcdTAwMDHDQUT8diHmJFx1MDAwNjGIXHUwMDE4XHUwMDE4XHUwMDBmot/HvZpcdTAwMDJcdTAwMTM8RfRQiVx1MDAxNcTVgFx1MDAxYjOsg/GFpUuEYKTJMuNcdTAwMDTT9MszwHlH1rTvVnTOiYc0Rk5fv3Gtcdt+cSv63I2Tkd34/GI1tfTXtS71f1x1MDAxZsyTMZxcdTAwMTRIQ82+29lwa6PXXHUwMDFiulNye3i3X9+r0dZccibHXHUwMDA231FcYrcqXHUwMDAxu56OjiguXHUwMDAwqvPRlWWCxS6CmaXoXHUwMDEwW9OpXHUwMDEwQGdcdTAwMGIzo49cdTAwMTWEXG5cdTAwMTRlSlwiXGb4uzpZe5VcdTAwMWEq1a+6Rbt9iLFg14I0aSo2pUhZYlx1MDAxOTlZza1JwKbKTFxiYkTEYOR3j1amwIRMTqfKXGKkXHUwMDAwIXNiavDq0llcdTAwMDJcdJZqvjZTJbNcXJ9cdTAwMDE67Y5cdTAwMGK/ViQyhm/WeXOb/mVDkGLvivMvcHz+xcm3J9WT7r31ME5MkFx1MDAwNPJ18GvzM4YgofSZlobcPJgqOe/XjlWmkFx1MDAwNXtb8yMhSjhcdTAwMTNgTN1BIDRVXHUwMDAxcp3gwPg75u5U8Py6cVO5nk3PLmu972fFXHUwMDFiXHUwMDA27jz0+Kf5sS9fvnw6eOS1J159XHUwMDFjXHUwMDE0WafrVmfisOP/lbfft8Zj5zFcdTAwMTXtMqrzXGazoV1zL5PQLkJcdTAwMDHkKTM2XHUwMDFhecY82J1cdTAwMTlrxNp+ct6FkFx1MDAwMa7GNlx1MDAxOLDUY05DtU6KJYacboaqqFx1MDAwNYoo8mRcdTAwMTlkXHUwMDEzw9x73TJRed1Q8WK5/VMx2Ivddz22RiN7rC/ri6/xv1x1MDAwZqbjXHUwMDE4dktcdTAwMTDb3Lbb2bB0LX9Trd+enFTbx1x1MDAwZs1W46o+r8OzxCwtUGDPJY0l6Z2POCNBcrA1aTNMXGInQlx1MDAxYb1k4Vx1MDAxYs5cdTAwMTBcdTAwMDBCiSWvXHUwMDFm7YezNjgl+dpj64Tkm+3Bg8NKg1qrkc5FrPjIs5d3K3Y1tyZcdTAwMDG7XG5cdTAwMWPYfsniyHVcdTAwMTdcdTAwMTVNXGaJw1x1MDAxNNxcbpje4IjMYVFcdTAwMTm+25JcdTAwMTJAOMp6tyVnUinPaZQ/k037M0ZGYyjGYLm+S3C0c2mXVbf3jubFh3qRTuG306ty8uAoRFx1MDAwMVx1MDAwM1x1MDAxNWn/LJGSU1x1MDAwNiTnXHUwMDFlTX7HfVlcdTAwMDO9uH18VFxuyDg1XHUwMDA0g/QkiHDyo1x1MDAxY1x1MDAwYvV6R4duuUafrmbfO/w7XHUwMDA1g3Ll6uxrXHUwMDEx139cdTAwMWWLlXrxtzmnmnuZgFOhXCLIXHUwMDAwXHUwMDE2dTWrSCxcImnwXHUwMDE0/075uSnQdpQm8kqEQIBcdFOgXHUwMDA088DVZeRcdTAwMTVKQrWXOWtaXHUwMDA1Su1jKVaoiVZcdTAwMDNcdTAwMTaZL1x1MDAwZbmoXHUwMDA0MC+P32KO3b5rj1x1MDAwZpxhq9tW94xcdTAwMWTXKexccudcdTAwMWbMwjF0Z2DhbDudXHJpR1x1MDAwYrM1QeZcdTAwMTNcdTAwMTKMrbCxQFx1MDAwNaGvdfIg4WqJoKCEIMwgIUSavS4tIFx1MDAxYVx1MDAwMERcdTAwMGKIv4X/uJSUjlEoXHUwMDFkM1x1MDAwNKSEXHUwMDFjXHUwMDE4XHUwMDAzrDI0Y1x1MDAxZlxuTJU+vuF+7834WH6Z3u1ZXHUwMDBmw2a1dN3iNenWxF3KmniCIJDGXHUwMDE2XV5cdTAwMWU53fW2/9vTQuBtLlj+/79/XHUwMDFh7/bso9evvJBx3/BgYvFccu75RqDbfWviXHUwMDFlOINB13W1n0s1PEBcdTAwMWGuNXb31TrqXHUwMDBl2/718lo3M4m3bSE8XHUwMDFiUz0ooIA5g4xwXGZcdTAwMTHAknvCwXpxW6NcdTAwMDXyXHUwMDAza9BcdTAwMWU241x1MDAxYlx1MDAxMS1BfY2AXHUwMDA0XHUwMDAwofRLrSBcdTAwMDGlgtBgI4I40EOxp1x1MDAwNVfHtlx1MDAwMlBTLfR+ti7h7P6985hIyzKv3Vx1MDAwNFqWXHUwMDEwIFx1MDAxMFx1MDAxN6BK74pcdTAwMTSh0lBeLVVU4PeRoFcpXHUwMDEyulx0lFx1MDAxNFxiY3JcdTAwMWJcZtWwIEdK6tCNXG7DRG5t2kKavelYXHUwMDBi4TDJuU5cdTAwMTZaUkM12lx1MDAxZUfoSYNus+k16NdUpVx1MDAxOCVjXVUytD1cdTAwMWJlp342fDxcdTAwMTjtyW+lPdnM191bcc6OglBcctvOS/zZ21BCXHUwMDFhg9ade1wiKzSXk+pD4aUwtPHKpLlCKlx1MDAwZvVOQFxusDLA5HuWf+IlMmVMjO0na9+xXHUwMDBmi1x1MDAxN/v2cz2VXHUwMDFigSvtj2TkRjC3Jlx1MDAwMcFRitdcdTAwMDCj4Fx1MDAxMFxyXHUwMDE4o2d+XHUwMDE39jZC4iQ5v0miy4JcdTAwMTLjfnbEQzcsXHUwMDExXGZcdTAwMTnnm2VaRi1OSjnZit1WLu1y1e/U1u9cdTAwMTZJWZOFXHUwMDFknc+Np3371aRWXHUwMDBmyIBcZrdwXHUwMDE5xPBPuON+015mQ5vP0iHnI3Ygv2G312l9w6PjvVJy2lx1MDAxNHRNzUVcdTAwMDDRRYSOUMwhoIZC4Yj5y1wiQoPjQFxuP2+uYLZcdTAwMTNcdTAwMTJLIfF1a96kXHUwMDAyXHUwMDEzxSbcxJuYhO7rpWpelVpNM/RcIryGmah1S5tPNef2+m5+c8QnX+uPz35cdTAwMTZccnO//1x1MDAxOfXcW1p6bvR6p43v7Wr38PCxnHenXHUwMDA35ucuxFBcdTAwMWE6XHUwMDE2gHr9t1vRcXQ7o+hYrtubyqJcdTAwMDdxQDTloe3Sv01QO0vOx3oroVx1MDAwMECaffosXHUwMDE0VFxuh1xi6cJcdTAwMTdcdTAwMTkz8mJ9blWK8Vx1MDAxN806i6G2dUb+WZLMJrhcdTAwMDKcfYuLavmmXq82W1x1MDAxN8+j5GfcQKxcdTAwMGKUr6nmXHUwMDAwXHUwMDE1JNVESzkkRO5qbfw4QXG+NSdDgDlRhqkx1YagUGOWXHUwMDExXcdYoHe0ZVvfioezq7NcdTAwMTNoXfVcdTAwMGW+fKudXHLRQzUpJ2/B9fGkzIVcdTAwMWFC4MXf5qRs7mVcdTAwMDJShnqLRVx1MDAwMIs8XHUwMDA2i7tQe3K0VVLQslKIkLZPTX5gXHUwMDFh7lxiXHUwMDE2XHUwMDEyXHUwMDAwXHUwMDAx4WYlbLJcXKEmQ/lvXHUwMDEwao+hu18k1Fx1MDAxZS3MokLtOitcdTAwMWNTIZS6Lijk3F/2R+eGXHUwMDE0oLqsT3KSiDBD4F3AglRKJ0eEXHUwMDEyLiEwiFx1MDAwZkpcdTAwMTdcdTAwMGaBevdcdTAwMTBGXHUwMDA0eDZD7KJKS2lysX1cXJ5zpKZJXHUwMDA0N5t88rtMXHUwMDAzR3UhRiSQmyn/m5H3vDR4vDh8mnyvunuWqMjagPFKuri8xEpZ2USEZVx1MDAxYpfnuMBcYoSSaVx1MDAxOCBPXHUwMDAyk37lg2s/7oHhiHp5oNKmkdA1X1x1MDAwNIJCQXf1vMCYZVx1MDAxNtSPNmZy3ng6UlQnKKKYXCJcIqFYZZHl3uLpiFx1MDAxNKBnwLiggVx1MDAwNZ0oyFx1MDAxZi27fY2CTC1vRlx1MDAwNOBMXHUwMDAwQlbbJZaNXCJcdTAwMDW0mCDCXHUwMDE2QVx1MDAwNGlcdTAwMDDZ+1x1MDAwNP3NwEii7ynpva7vQYlcdTAwMTdhXHUwMDExjlx0Rlx1MDAxMu2i/rnN5XM1hbbHiUImp8SYIFx1MDAxNXpcdTAwMWNcZmRCXHUwMDEyKGTWYZFF0Fx1MDAxZm6l7f1UQf9cdTAwMTh1592C/rPjkjh1yOy5eMual/Tg9rIoXHJcdTAwMTmOiVx1MDAwZkHMs1x1MDAwMlmEXHUwMDFigGJjolx1MDAxN1FcdTAwMDCuIacgenhwd4yNXHUwMDBmtbWtPVwiXHUwMDE4S1x1MDAwMVx0MO89XG6v2C1cdTAwMTikkIHN9lx1MDAxZW2mU1x1MDAxZPXPXHUwMDFmYft+fHU/v2y0XHUwMDBlv+AyZ/jDznYytyZcdTAwMDGRXHUwMDA1jz3Mw1hgKHYrsIVfUCmFXHUwMDE0UoNcdTAwMGJxd9ZTKEhSJLRBwJDEgpurK6Hw84CVYlxidTnRTcJ20TltTCmbYKuKbVx1MDAwN9XDSa47zLlcdTAwMWQ71+hPJz56+pAjn2K4ZZ3jXCI7kFxy250+zEpcdTAwMGaD52LRqlSO0Y171LmyXHUwMDFmXHUwMDEys1x1MDAxZFnL2NFcdTAwMDfJXHUwMDE21LTp4zApJlx1MDAxMFx1MDAxYnb97Fwi9dnA29qaXHUwMDAz9VneukqFybFASHjFXHUwMDE4vcFcYiC4WY1GM1x0vizGUn5uXHUwMDAzMLu7YzdfT4etnuVcdTAwMWM9d1x1MDAxM4XU/4x67LF7+1xcYVxcXFxU9tHTbHDa6OGDvPmxqaNcdTAwMDJcdTAwMDJcbmXQZ5Q5XHUwMDE33f+okjFUrOFcdTAwMTChXHUwMDE4XHUwMDFjbm1cIv42QLtPQaNSSqzVLVx1MDAxM6LCj0zEXFxwtY5QxvFcdTAwMDBcdTAwMDF1XHUwMDFk4a0sxGXJlFx1MDAwZvbox9DUOnFcdTAwMWGanVxyXV6d3ZOLUa1cdTAwMGI7vHs3lvfNo+/F5HTJxVo+XHKFWP2eUm9cdKJYXHUwMDAwU0E1XHUwMDExW3FUZn34099cdTAwMDK1ja3pUUJcdIWAxk1cdTAwMWXe1Kf1mLnQ9VxcsiTHOFx1MDAwYpGUL/PHY3g4vKm2raeK83zSOrhISo5cdTAwMGZ1IFx1MDAxZerNa/tuXHUwMDAw2PxLb9S5fbzMjlx1MDAxY6V3x/FW5GjuZVx1MDAwMnLknuo6r6hcdTAwMTPRqDOGy3f1Xkwwa6YgR4FcdJc6XHUwMDBmxVx1MDAwNChcdTAwMTmub0JCuMJcIsy4Jrj2/+BUtVx1MDAxM1x1MDAwMvT4i8TDY1grmLX2MVx1MDAwMe9S7fRcZsyt3vPxzSV6fiw6XHUwMDBmXHUwMDFk+zZ5llx1MDAxYeRsPV+VwoWPXHRCXHRcdTAwMThDWPyc5mirZTe8XqlfUlx1MDAxMPS2T1x1MDAxY+dU+32k0Vx1MDAxY1xyXl1cdTAwMTX4Vlx1MDAxYbdcdTAwMTLpWZ4+/LJcdTAwMWXbT0cnQ5qvXzqo0WbHh/c3X8H19ubooSO7Mn/RXHUwMDFhPVxmvtaO66xU/fbNyYxxdVx1MDAxODkjxo3uf2Q9XHUwMDE4XHUwMDAxg1BkMVCEyJA6vjNJTWDrJ2ddXHUwMDAydaFAajRJvadoXHUwMDA2KlxmXG7BseQy41xuplx1MDAwMlIp8FabuYqzoTPPLUy8XHUwMDBm5tVcdTAwMTjCWudVY8Ozoc5cdTAwMGK7fWX3ru5cdTAwMWZm9e9cYnW7M1x09ocp3LgribFcdTAwMDArXHUwMDA3IFx1MDAwNqzSU59rlVGauY78t8gxXHUwMDE4ZJC/jVxiZIxjk+pcdTAwMWN+kpSQhFKdJfN+tmi/UT8/mfXqe72r0dGAOVJcdTAwMWPgk3dw1EY+d1x1MDAwYlx1MDAxYvdHMXnkc6/alfNGZ3B7QYf2hTubNjuPeZmVhoBcdTAwMTCHnnOwttJcdTAwMTDMs51AQ+BKQVx1MDAxMIviT4D662S/yFx1MDAxZspcdTAwMGIyUv5ghFx1MDAwYlg7xLDQKWDE4Fx1MDAxN9tcdTAwMWQ0YFx1MDAxMkbD5KpcdTAwMDPEjFKhdGtzgChM6kBlrDNcZkj2MWGBXHUwMDAw5nirXHUwMDEyrZX+VHHy59zeaNSfXHUwMDFmOeNcYjVcIl1UeNv0p1x1MDAxOFx1MDAwNlx1MDAwZqQ/RfcjXHUwMDFirVwiWlx1MDAxZUdloOu9o1x1MDAxY0Ksq+oyRqH/ZGbEIC0wKahaI3hRc9mAb2UuYIyVXHUwMDEwoFx1MDAwMkhpKPMgSFx1MDAwMSrgY8H1XHUwMDE2R7orXHUwMDBiZ0C7k1T1XGJNP9fbTlx1MDAxMTRb5TS81Fx1MDAxMZZCKKNjIzd4fK2jzdJcdTAwMWUzzVx1MDAxMFx1MDAwZl2g+rW+NFdcdTAwMGZcdTAwMGLwc2bZ3NEhspw3cVrxLVx1MDAxMYpjsWJRvevec1NYcbREudvRMszXXHUwMDA0TFx1MDAwMIOE60ZcYiRpMHVb0TtcdTAwMTBqkJW6QpmUXFxcdTAwMDRcdTAwMTfo+6RuRyuPUUJQXHUwMDEyWaBcdTAwMThxSVx1MDAxOFwi2lxiX1x1MDAxN4KoQCnQMWNcdTAwMDS4J/i7lIGkQDWQXHUwMDEwVbaY4mKTXGbkXHUwMDA1ZVx1MDAxNVxiKqGkVN22XHUwMDEzglx1MDAwNiE42lpcYkJcdTAwMDH0Olx1MDAxNdRU1IKG2l+SM85921x1MDAwM/9mQjBcdTAwMWa6RPUrsDjfQ1xmRsc6PDIoXHUwMDBmXG7KXHUwMDBlUraDpNokUn9BUFxu/WhBqFx1MDAxYlx1MDAwMSFhmCpxiKCAfJWou2pEXHUwMDAx6sLMklx1MDAxMiYgXHUwMDE0XHUwMDFj8I+ShdFcdTAwMDZvlCyEXHUwMDE4s4LiXHUwMDFjLFx1MDAwMMGUeDdRvFxuQ1DQ3dOHXHUwMDE1SuDNwF7uSURCjYMkXHUwMDFjXHT9sFx1MDAxNVx1MDAxMj2VgVx1MDAwYpxL9Vx1MDAwMMKV9YE8+293wnApXGa/by1cZnXKrz5Q23gmVjC4u/IoY4qU4vFcdTAwMDNShX9cdTAwMTZpXHUwMDE4tkT1K7A430NcdTAwMThGO6j9cogjzDhcdTAwMTBcdTAwMDTrXHUwMDEzcyXxbHh808h+vCwkum5cdTAwMTSAet+q3mpcYoKN+LCyvc73jnsxvaxVrkbCPW1cdTAwMWZcXO2NXHUwMDA3vaDoXHUwMDBiO6dcdTAwMGJIf1x1MDAxZZdf+klEYvztmKG4kzWFP5KdavfQb1x1MDAxM6ZcdTAwMWUnXHUwMDE1f+G+eDU/XHUwMDE4IGSsxUQj3GJISiHxZlx1MDAwMbVl81xm3uK7Sfv26qnTLcGza1wiL/acq/vTilx1MDAwN2C5zcLUP9ZcdE1cdTAwMTClXHUwMDE5XHUwMDFkXHUwMDA1XHUwMDE23f+ogtqQRINSxoHSXHUwMDEzj9nliUXibpImYo0l48y4NY/yUGNLXHUwMDFmuanUyKy32eqlXG7pVj5nT9z3JZ9qZI+PfspEsVx1MDAxOJKLXGJoJ+9YRonYkdIp0isjlJ5BlJ6BqbJOMVgrjlwiKChcYsaViVx1MDAwMoU2WoMlXHUwMDBlaVx1MDAwMVx1MDAxMVxmgTLtlSmmXHUwMDE2Klj5dVZ7d3FcdTAwMDEpZU9Zl1hbljvntEkmuFubXCJQmY3aiWg8P1x1MDAxM1x1MDAwN5w1qyNLXGJCXHUwMDAwkFx1MDAxZlSJ/ycwRcLXqH5cdTAwMDVW5+pxXHUwMDAx6s7MXHUwMDE2SWNcdTAwMDdcdTAwMDCGlKGIsUSYXHUwMDAzzmDwXGaRXHKNkWhcdTAwMDG31lxifW5cdTAwMTUjWFx1MDAxOURcdTAwMTJIjLlcZrTiPayRP15n45M1XHUwMDFh1VxctdqW3fs069qP+0ZNXb+0QrZomJZcdTAwMGX2XHUwMDAyWX/98df/XHUwMDAzZzzy+yJ9Flattened Self-Contained Gateway IRIR With policies and backends attachedxDS TranslationHttpRoute name: route-foo parentRef: httpHttpRouteRule ExtensionRef BackendRefGateway name: httpFaultPolicy name: pol targetRef: route-foo spec: fault: 50%ir.HttpRoute name: route-foo parentRef: httpHttpRouteRule AttachedPolicies *ir.PolicyWrapper *ir.Backendir.Gateway name: httpir.PolicyWrapper name: pol policyIr: filterConfig: proto.AnyPoints toir.GatewayIR name: http routes: - rule: AttachedPolicies *ir.PolicyWrapper *ir.Backendir.PolicyWrapper name: pol policyIr: filterConfig: proto.AnyPoints toCRDs in the clusterRouteRule policyIr: filterConfig: proto.AnyEvnoy RoutePlugin: ApplyForRouteEvnoy Route perFilterConfig: proto.Any \ No newline at end of file