<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Flux – flagger</title><link>https://deploy-preview-2413--fluxcd.netlify.app/tags/flagger/</link><description>Recent content in flagger on Flux</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Fri, 11 Mar 2022 13:30:00 +0000</lastBuildDate><atom:link href="https://deploy-preview-2413--fluxcd.netlify.app/tags/flagger/index.xml" rel="self" type="application/rss+xml"/><item><title>Blog: Flagger adds Gateway API Support</title><link>https://deploy-preview-2413--fluxcd.netlify.app/blog/2022/03/flagger-adds-gateway-api-support/</link><pubDate>Fri, 11 Mar 2022 13:30:00 +0000</pubDate><guid>https://deploy-preview-2413--fluxcd.netlify.app/blog/2022/03/flagger-adds-gateway-api-support/</guid><description>
&lt;img src="https://deploy-preview-2413--fluxcd.netlify.app/blog/2022/03/flagger-adds-gateway-api-support/featured-flagger-gatewayapi-canary_hu41784555f600d29144a66dede7382f17_40869_640x0_resize_box_3.png" width="640" height="282"/>
&lt;p>The Flagger team is proud to bring you Kubernetes Gateway API support as
part of the
&lt;a href="https://github.com/fluxcd/flagger/releases/tag/v1.19.0" target="_blank">1.19.0 release&lt;/a>.
Read here about why this is a significant development in Flagger and how
you can make use of it.&lt;/p>
&lt;h2 id="what-is-flagger">What is Flagger?&lt;/h2>
&lt;p>Flagger is a progressive delivery tool that automates the release process for applications running on Kubernetes.
It reduces the risk of introducing a new software version in production by gradually shifting traffic to the
new version while measuring metrics and running conformance tests.&lt;/p>
&lt;p>&lt;img src="featured-flagger-gatewayapi-canary.png" alt="Flagger using Gateway API">&lt;/p>
&lt;p>
&lt;a href="https://github.com/fluxcd/flagger" target="_blank">Flagger&lt;/a> was designed to give developers confidence in automating production
releases using delivery techniques such as:&lt;/p>
&lt;ul>
&lt;li>Canary release (progressive traffic shifting)&lt;/li>
&lt;li>A/B Testing (HTTP headers and cookies traffic routing)&lt;/li>
&lt;li>Blue/Green (traffic switching and mirroring)&lt;/li>
&lt;/ul>
&lt;h2 id="what-is-the-gateway-api">What is the Gateway API?&lt;/h2>
&lt;p>The
&lt;a href="https://kubernetes.io/blog/2021/04/22/evolving-kubernetes-networking-with-the-gateway-api/" target="_blank">announcement blog
post&lt;/a>
defines its design principles as&lt;/p>
&lt;blockquote>
&lt;ul>
&lt;li>&lt;strong>Expressiveness&lt;/strong> - In addition to HTTP host/path matching and TLS,
Gateway API can express capabilities like HTTP header
manipulation, traffic weighting &amp;amp; mirroring, TCP/UDP routing, and
other capabilities that were only possible in Ingress through
custom annotations.&lt;/li>
&lt;li>&lt;strong>Role-oriented design&lt;/strong> - The API resource model reflects the
separation of responsibilities that is common in routing and
Kubernetes service networking.&lt;/li>
&lt;li>&lt;strong>Extensibility&lt;/strong> - The resources allow arbitrary configuration
attachment at various layers within the API. This makes granular
customization possible at the most appropriate places.&lt;/li>
&lt;li>&lt;strong>Flexible conformance&lt;/strong> - The Gateway API defines varying
conformance levels - core (mandatory support), extended (portable
if supported), and custom (no portability guarantee), known
together as
&lt;a href="https://gateway-api.sigs.k8s.io/concepts/guidelines/#conformance" target="_blank">flexible
conformance&lt;/a>.
This promotes a highly portable core API (like Ingress) that still
gives flexibility for Gateway controller implementers.&lt;/li>
&lt;/ul>
&lt;/blockquote>
&lt;p>&lt;img src="api-model.png" alt="Gateway API Model">&lt;/p>
&lt;p>Gateway API exposes a more general API than Ingress for proxying and you
can use it for more protocols than just HTTP (although most
implementations support just HTTP for now). It models more
infrastructure components to provide better deployment and management
options. There are three core components to the Gateway API:&lt;/p>
&lt;ul>
&lt;li>&lt;code>GatewayClass&lt;/code>: This lets us define which controller implementation we
want to use.&lt;/li>
&lt;li>&lt;code>Gateway&lt;/code>: A &lt;code>Gateway&lt;/code> resource is attached to a &lt;code>GatewayClass&lt;/code> and
has a 1:1 relationship with the actual load balancing infra. It lets
us define a set of listeners, through which we can specify which
Route resources to evaluate for routing, amongst other things.&lt;/li>
&lt;li>&lt;code>HTTPRoute&lt;/code>: This is a &lt;code>Route&lt;/code> resource that is specific for HTTP
requests. It defines routing rules such as filters, path and
header matches, etc. and which services should the request be
forwarded to.&lt;/li>
&lt;/ul>
&lt;h2 id="how-does-this-work-in-flagger">How does this work in Flagger?&lt;/h2>
&lt;p>Flagger makes use of the fact that &lt;code>HTTPRoute&lt;/code> allows users to define a
weight related to each reference to a service inside a routing rule. These weights are used to determine
which service should receive a request. For example, if we want to send
10% of our traffic to another service, we can define a &lt;code>HTTPRoute&lt;/code> like:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#062873;font-weight:bold">apiVersion&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>gateway.networking.k8s.io/v1alpha2&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb">&lt;/span>&lt;span style="color:#062873;font-weight:bold">kind&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>HTTPRoute&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb">&lt;/span>&lt;span style="color:#062873;font-weight:bold">metadata&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">name&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>foo-route&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb">&lt;/span>&lt;span style="color:#062873;font-weight:bold">spec&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">parentRefs&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>- &lt;span style="color:#062873;font-weight:bold">name&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>example-gateway&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">hostnames&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>- &lt;span style="color:#4070a0">&amp;#34;foo.example.com&amp;#34;&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">rules&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>- &lt;span style="color:#062873;font-weight:bold">matches&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>- &lt;span style="color:#062873;font-weight:bold">path&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">type&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>PathPrefix&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">value&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>/login&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">backendRefs&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>- &lt;span style="color:#062873;font-weight:bold">name&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>foo-primary&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">port&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#40a070">8080&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">weight&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#40a070">90&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>- &lt;span style="color:#062873;font-weight:bold">name&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>foo-canary&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">port&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#40a070">8080&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">weight&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#40a070">10&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This sends 10% of all requests coming to foo.example.com/login to the
new service and the other 90% requests go to the stable service. You can
read more about traffic splitting in Gateway API
&lt;a href="https://gateway-api.sigs.k8s.io/v1alpha2/guides/traffic-splitting/" target="_blank">here&lt;/a>.&lt;/p>
&lt;p>Flagger fully automates the creation of &lt;code>HTTPRoutes&lt;/code> with the appropriate header matches,
path matches, etc and attaches the primary and canary service to the
&lt;code>HTTPRoute&lt;/code>. During the canary analysis, the weights related to both the
services are adjusted accordingly.&lt;/p>
&lt;p>&lt;img src="flagger-canary-steps.png" alt="Flagger canary">&lt;/p>
&lt;p>If you want to get started right away, have a look at
&lt;a href="https://deploy-preview-2413--fluxcd.netlify.app/flagger/tutorials/gatewayapi-progressive-delivery/">our
tutorial&lt;/a>,
which shows you how to use Contour&amp;rsquo;s Gateway API implementation and Flagger to automate canary
deployments. It won&amp;rsquo;t take long to follow, but will convey how powerful
this integration is.&lt;/p>
&lt;h2 id="flagger-works-with-all-implementations">Flagger works with all implementations&lt;/h2>
&lt;p>With added support for Gateway API, Flagger now works with all
&lt;a href="https://gateway-api.sigs.k8s.io/implementations/" target="_blank">implementations&lt;/a>,
which means that as of today these are natively supported: Contour,
Emissary-Ingress, Google Kubernetes Engine, HAProxy Ingress,
HashiCorp Consul, Istio, Kong and Traefik.&lt;/p>
&lt;p>The Flagger team has successfully tested Contour and Istio using
the &lt;code>v1beta2&lt;/code> Gateway API. Starting with Flagger v1.19, the Gateway API
is part of our end-to-end test suite using the Contour implementation.&lt;/p>
&lt;h2 id="how-metrics-work">How metrics work&lt;/h2>
&lt;p>The Gateway API defines a common interface for traffic management, which
saves us from doing anything vendor specific. But the metrics related to
the traffic, still are specific to the Ingress/Service Mesh you&amp;rsquo;re
using. Flagger lets you define a custom resource &lt;code>MetricTemplate&lt;/code>,
which runs queries against your metrics provider and calculates stats
like error rate, latency, etc. For example, if you&amp;rsquo;re using Istio with
Gateway API, the below &lt;code>MetricTemplate&lt;/code> would calculate the error rate
using Prometheus as a provider during a canary analysis:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#062873;font-weight:bold">apiVersion&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>flagger.app/v1beta1&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb">&lt;/span>&lt;span style="color:#062873;font-weight:bold">kind&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>MetricTemplate&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb">&lt;/span>&lt;span style="color:#062873;font-weight:bold">metadata&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">name&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>error-rate&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">namespace&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>istio-system&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb">&lt;/span>&lt;span style="color:#062873;font-weight:bold">spec&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">provider&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">type&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>prometheus&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">address&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>http://prometheus.istio-system:9090&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">query&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>|&lt;span style="color:#4070a0;font-style:italic">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0;font-style:italic"> 100 - sum(
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0;font-style:italic"> rate(
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0;font-style:italic"> istio_requests_total{
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0;font-style:italic"> reporter=&amp;#34;source&amp;#34;,
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0;font-style:italic"> destination_workload_namespace=&amp;#34;{{ namespace }}&amp;#34;,
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0;font-style:italic"> destination_workload=~&amp;#34;{{ target }}&amp;#34;,
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0;font-style:italic"> response_code!~&amp;#34;5.*&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0;font-style:italic"> }[{{ interval }}]
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0;font-style:italic"> )
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0;font-style:italic"> )
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0;font-style:italic"> /
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0;font-style:italic"> sum(
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0;font-style:italic"> rate(
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0;font-style:italic"> istio_requests_total{
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0;font-style:italic"> reporter=&amp;#34;source&amp;#34;,
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0;font-style:italic"> destination_workload_namespace=&amp;#34;{{ namespace }}&amp;#34;,
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0;font-style:italic"> destination_workload=~&amp;#34;{{ target }}&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0;font-style:italic"> }[{{ interval }}]
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0;font-style:italic"> )
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0;font-style:italic"> ) * 100&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Similarly the below MetricTemplate allows Flagger to compute the latency
when using any Envoy based Ingress/Service Mesh:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#062873;font-weight:bold">apiVersion&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>flagger.app/v1beta1&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb">&lt;/span>&lt;span style="color:#062873;font-weight:bold">kind&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>MetricTemplate&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb">&lt;/span>&lt;span style="color:#062873;font-weight:bold">metadata&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">name&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>latency&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">namespace&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>flagger-system&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb">&lt;/span>&lt;span style="color:#062873;font-weight:bold">spec&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">provider&lt;/span>:&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">type&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>prometheus&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">address&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>http://flagger-prometheus:9090&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#bbb"> &lt;/span>&lt;span style="color:#062873;font-weight:bold">query&lt;/span>:&lt;span style="color:#bbb"> &lt;/span>|&lt;span style="color:#4070a0;font-style:italic">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0;font-style:italic"> histogram_quantile(0.99,
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0;font-style:italic"> sum(
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0;font-style:italic"> rate(
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0;font-style:italic"> envoy_cluster_upstream_rq_time_bucket{
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0;font-style:italic"> envoy_cluster_name=~&amp;#34;{{ namespace }}_{{ target }}-canary_[0-9a-zA-Z-]+&amp;#34;,
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0;font-style:italic"> }[{{ interval }}]
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0;font-style:italic"> )
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0;font-style:italic"> ) by (le)
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4070a0;font-style:italic"> ) / 1000&lt;/span>&lt;span style="color:#bbb">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="further-reading">Further Reading&lt;/h2>
&lt;ul>
&lt;li>
&lt;a href="https://gateway-api.sigs.k8s.io/" target="_blank">Kubernetes Gateway API&lt;/a>&lt;/li>
&lt;li>
&lt;a href="https://kubernetes.io/blog/2021/04/22/evolving-kubernetes-networking-with-the-gateway-api/" target="_blank">Evolving Kubernetes networking with the Gateway API | Kubernetes
Blog&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="conclusion">Conclusion&lt;/h2>
&lt;p>The Gateway API is in alpha. As of 2022-03-11 its
&lt;a href="https://github.com/kubernetes-sigs/gateway-api#status" target="_blank">GitHub
README&lt;/a>
says&lt;/p>
&lt;blockquote>
&lt;p>The latest supported version is &lt;code>v1alpha2&lt;/code> as released by the
&lt;a href="https://github.com/kubernetes-sigs/gateway-api/releases/tag/v0.4.0" target="_blank">v0.4.0
release&lt;/a>
of this project. This version of the API is expected to graduate to
beta in the future with relatively minimal changes.&lt;/p>
&lt;/blockquote>
&lt;p>We as the Flux project will update the integration once the API becomes
beta/stable.&lt;/p>
&lt;p>Thanks a lot
&lt;a href="https://github.com/aryan9600" target="_blank">Sanskar Jaiswal&lt;/a> for working on
&lt;a href="https://github.com/fluxcd/flagger/pull/1108" target="_blank">the
implementation&lt;/a>!&lt;/p>
&lt;p>We are excited to bring this feature to you and we love feedback! Please
let us know if you have feedback, questions or how you are going to use
this!&lt;/p></description></item></channel></rss>