<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Contour</title><link>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/</link><description>Recent content on Contour</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/feed.xml" rel="self" type="application/rss+xml"/><item><title/><link>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/architecture/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/architecture/</guid><description>&lt;h1 id="contour-architecture"&gt;Contour Architecture&lt;/h1&gt;
&lt;p&gt;The Contour Ingress controller is a collaboration between:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Envoy, which provides the high performance reverse proxy.&lt;/li&gt;
&lt;li&gt;Contour, which acts as a management server for Envoy and provides it with configuration.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These containers are deployed separately, Contour as a Deployment and Envoy as a Kubernetes Daemonset or Deployment, although other configurations are possible.&lt;/p&gt;
&lt;p&gt;In the Envoy Pods, Contour runs as an initcontainer in &lt;code&gt;bootstrap&lt;/code&gt; mode and writes an Envoy bootstrap configuration to a temporary volume.
This volume is passed to the Envoy container and directs Envoy to treat Contour as its 
&lt;a href="https://www.envoyproxy.io/docs/envoy/v1.13.0/api-docs/xds_protocol" target="_blank"&gt;management server&lt;/a&gt;.&lt;/p&gt;</description></item><item><title/><link>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/config/access-logging/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/config/access-logging/</guid><description>&lt;h1 id="access-logging"&gt;Access Logging&lt;/h1&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;Contour allows you to control Envoy&amp;rsquo;s access logging.
By default, HTTP and HTTPS access logs are written to &lt;code&gt;/dev/stdout&lt;/code&gt; by the Envoy containers and look like following:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[2021-04-14T16:36:00.361Z] &amp;#34;GET /foo HTTP/1.1&amp;#34; 200 - 0 463 6 3 &amp;#34;-&amp;#34; &amp;#34;HTTPie/1.0.3&amp;#34; &amp;#34;837aa8dc-344f-4faa-b7d5-c9cce1028519&amp;#34; &amp;#34;localhost:8080&amp;#34; &amp;#34;127.0.0.1:8081&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The detailed description of each field can be found in 
&lt;a href="https://www.envoyproxy.io/docs/envoy/latest/configuration/observability/access_log/usage" target="_blank"&gt;Envoy access logging documentation&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="customizing-access-log-destination-and-formats"&gt;Customizing Access Log Destination and Formats&lt;/h2&gt;
&lt;p&gt;You can change the destination file where the access log is written by using Contour 
&lt;a href="https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/configuration/#serve-flags"&gt;command line parameters&lt;/a&gt; &lt;code&gt;--envoy-http-access-log&lt;/code&gt; and &lt;code&gt;--envoy-https-access-log&lt;/code&gt;.&lt;/p&gt;</description></item><item><title/><link>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/config/annotations/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/config/annotations/</guid><description>&lt;h1 id="annotations-reference"&gt;Annotations Reference&lt;/h1&gt;
&lt;div id="toc" class="navigation"&gt;&lt;/div&gt;
&lt;p&gt;Annotations are used in Ingress Controllers to configure features that are not covered by the Kubernetes Ingress API.&lt;/p&gt;
&lt;p&gt;Some of the features that have been historically configured via annotations are supported as first-class features in Contour&amp;rsquo;s 
&lt;a href="https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/config/fundamentals/"&gt;HTTPProxy API&lt;/a&gt;, which provides a more robust configuration interface over annotations.&lt;/p&gt;
&lt;p&gt;However, Contour still supports a number of annotations on the Ingress resources.&lt;/p&gt;
&lt;h2 id="standard-kubernetes-ingress-annotations"&gt;Standard Kubernetes Ingress annotations&lt;/h2&gt;
&lt;p&gt;The following Kubernetes annotations are supported on &lt;code&gt;Ingress&lt;/code&gt; objects:&lt;/p&gt;</description></item><item><title/><link>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/config/api-reference/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/config/api-reference/</guid><description>&lt;p&gt;Packages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="#projectcontour.io%2fv1"&gt;projectcontour.io/v1&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="#projectcontour.io%2fv1alpha1"&gt;projectcontour.io/v1alpha1&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="projectcontour.io/v1"&gt;projectcontour.io/v1&lt;/h2&gt;
&lt;p&gt;
&lt;p&gt;Package v1 holds the specification for the projectcontour.io Custom Resource Definitions (CRDs).&lt;/p&gt;
&lt;p&gt;In building this CRD, we&amp;rsquo;ve inadvertently overloaded the word &amp;ldquo;Condition&amp;rdquo;, so we&amp;rsquo;ve tried to make
this spec clear as to which types of condition are which.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;MatchConditions&lt;/code&gt; are used by &lt;code&gt;Routes&lt;/code&gt; and &lt;code&gt;Includes&lt;/code&gt; to specify rules to match requests against for either
routing or inclusion.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;DetailedConditions&lt;/code&gt; are used in the &lt;code&gt;Status&lt;/code&gt; of these objects to hold information about the relevant
state of the object and the world around it.&lt;/p&gt;</description></item><item><title/><link>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/config/api/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/config/api/</guid><description>&lt;h1 id="contour-api-reference"&gt;Contour API Reference&lt;/h1&gt;
&lt;p&gt;Packages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="#projectcontour.io%2fv1"&gt;projectcontour.io/v1&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="#projectcontour.io%2fv1alpha1"&gt;projectcontour.io/v1alpha1&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="projectcontour.io/v1"&gt;projectcontour.io/v1&lt;/h2&gt;
&lt;p&gt;
&lt;p&gt;Package v1 holds the specification for the projectcontour.io Custom Resource Definitions (CRDs).&lt;/p&gt;
&lt;p&gt;In building this CRD, we&amp;rsquo;ve inadvertently overloaded the word &amp;ldquo;Condition&amp;rdquo;, so we&amp;rsquo;ve tried to make
this spec clear as to which types of condition are which.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;MatchConditions&lt;/code&gt; are used by &lt;code&gt;Routes&lt;/code&gt; and &lt;code&gt;Includes&lt;/code&gt; to specify rules to match requests against for either
routing or inclusion.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;DetailedConditions&lt;/code&gt; are used in the &lt;code&gt;Status&lt;/code&gt; of these objects to hold information about the relevant
state of the object and the world around it.&lt;/p&gt;</description></item><item><title/><link>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/config/client-authorization/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/config/client-authorization/</guid><description>&lt;h1 id="client-authorization"&gt;Client Authorization&lt;/h1&gt;
&lt;p&gt;Contour supports integrating external servers to authorize client requests.&lt;/p&gt;
&lt;p&gt;Envoy implements external authorization in the 
&lt;a href="https://www.envoyproxy.io/docs/envoy/latest/configuration/http/http_filters/ext_authz_filter" target="_blank"&gt;ext_authz&lt;/a&gt; filter.
This filter intercepts client requests and holds them while it sends a check
request to an external server.
The filter uses the check result to either allow the request to proceed, or to
deny or redirect the request.&lt;/p&gt;
&lt;p&gt;The diagram below shows the sequence of requests involved in the successful
authorization of a HTTP request:&lt;/p&gt;</description></item><item><title/><link>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/config/cookie-rewriting/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/config/cookie-rewriting/</guid><description>&lt;h1 id="cookie-rewriting"&gt;Cookie Rewriting&lt;/h1&gt;
&lt;p&gt;Contour now enables users to customize attributes on HTTP &lt;code&gt;Set-Cookie&lt;/code&gt; response headers.
Application specific cookies and cookies generated by Contour&amp;rsquo;s 
&lt;a href="https://projectcontour.io/docs/v1.19.0/config/request-routing/#session-affinity" target="_blank"&gt;&amp;ldquo;cookie&amp;rdquo; load balancing strategy&lt;/a&gt; can be rewritten either per HTTPProxy &lt;code&gt;Route&lt;/code&gt; or &lt;code&gt;Service&lt;/code&gt;.
Users can choose to rewrite the &lt;code&gt;Path&lt;/code&gt;, &lt;code&gt;Domain&lt;/code&gt;, &lt;code&gt;Secure&lt;/code&gt;, and &lt;code&gt;SameSite&lt;/code&gt; attributes of the &lt;code&gt;Set-Cookie&lt;/code&gt; header currently.
These attributes may be things an application may not be able to accurately set, without prior knowledge of how the application is deployed.
For example, if Contour is in use to rewrite the path or hostname of a request before it reaches an application backend, the application may not be able to accurately set the &lt;code&gt;Path&lt;/code&gt; and &lt;code&gt;Domain&lt;/code&gt; attributes in a &lt;code&gt;Set-Cookie&lt;/code&gt; response header.
This feature can be used to apply security settings to ensure browsers treat generated cookies appropriately.
The &lt;code&gt;SameSite&lt;/code&gt; and &lt;code&gt;Secure&lt;/code&gt; attributes are currently not set by Envoy when it generates the &lt;code&gt;X-Contour-Session-Affinity&lt;/code&gt;, but with this feature, users can customize this cookie further.&lt;/p&gt;</description></item><item><title/><link>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/config/cors/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/config/cors/</guid><description>&lt;h1 id="cors"&gt;CORS&lt;/h1&gt;
&lt;p&gt;A CORS (Cross-origin resource sharing) policy can be set for a HTTPProxy in order to allow cross-domain requests for trusted sources.
If a policy is set, it will be applied to all the routes of the virtual host.&lt;/p&gt;
&lt;p&gt;Contour allows configuring the headers involved in cross-domain requests.
In this example, cross-domain requests will be allowed for any domain (note the &lt;code&gt;*&lt;/code&gt; value).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;apiVersion&lt;/span&gt;:&lt;span style="color:#666"&gt; &lt;/span&gt;projectcontour.io/v1&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;&lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;kind&lt;/span&gt;:&lt;span style="color:#666"&gt; &lt;/span&gt;HTTPProxy&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;&lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;metadata&lt;/span&gt;:&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;name&lt;/span&gt;:&lt;span style="color:#666"&gt; &lt;/span&gt;cors-example&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;&lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;spec&lt;/span&gt;:&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;virtualhost&lt;/span&gt;:&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;fqdn&lt;/span&gt;:&lt;span style="color:#666"&gt; &lt;/span&gt;www.example.com&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;corsPolicy&lt;/span&gt;:&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;allowCredentials&lt;/span&gt;:&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;true&lt;/span&gt;&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;allowOrigin&lt;/span&gt;:&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;- &lt;span style="color:#ed9d13"&gt;&amp;#34;*&amp;#34;&lt;/span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#999;font-style:italic"&gt;# allows any origin&lt;/span&gt;&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;allowMethods&lt;/span&gt;:&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;- GET&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;- POST&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;- OPTIONS&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;allowHeaders&lt;/span&gt;:&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;- authorization&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;- cache-control&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;exposeHeaders&lt;/span&gt;:&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;- Content-Length&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;- Content-Range&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;maxAge&lt;/span&gt;:&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#ed9d13"&gt;&amp;#34;10m&amp;#34;&lt;/span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#999;font-style:italic"&gt;# preflight requests can be cached for 10 minutes.&lt;/span&gt;&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;routes&lt;/span&gt;:&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;- &lt;span style="color:#6ab825;font-weight:bold"&gt;conditions&lt;/span&gt;:&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;- &lt;span style="color:#6ab825;font-weight:bold"&gt;prefix&lt;/span&gt;:&lt;span style="color:#666"&gt; &lt;/span&gt;/&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;services&lt;/span&gt;:&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;- &lt;span style="color:#6ab825;font-weight:bold"&gt;name&lt;/span&gt;:&lt;span style="color:#666"&gt; &lt;/span&gt;cors-example&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;port&lt;/span&gt;:&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#3677a9"&gt;80&lt;/span&gt;&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In the following example, cross-domain requests are restricted to &lt;code&gt;https://client.example.com&lt;/code&gt; only.&lt;/p&gt;</description></item><item><title/><link>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/config/external-service-routing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/config/external-service-routing/</guid><description>&lt;h1 id="external-service-routing"&gt;External Service Routing&lt;/h1&gt;
&lt;p&gt;HTTPProxy supports routing traffic to &lt;code&gt;ExternalName&lt;/code&gt; service types, but this is disabled by default, as it can lead
to inadvertent exposure of the Envoy Admin UI, allowing remote shutdown and restart of Envoy.
Please see 
&lt;a href="https://github.com/projectcontour/contour/security/advisories/GHSA-5ph6-qq5x-7jwc" target="_blank"&gt;this security advisory&lt;/a&gt; for all the details.
It can also be used to expose services in namespaces a user does not have access to, using an ExternalName of &lt;code&gt;service.namespace.svc.cluster.local&lt;/code&gt;.
Please see 
&lt;a href="https://github.com/kubernetes/kubernetes/issues/103675" target="_blank"&gt;this Kubernetes security advisory&lt;/a&gt; for more details.&lt;/p&gt;</description></item><item><title/><link>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/config/fundamentals/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/config/fundamentals/</guid><description>&lt;h1 id="httpproxy-fundamentals"&gt;HTTPProxy Fundamentals&lt;/h1&gt;
&lt;p&gt;The 
&lt;a href="https://kubernetes.io/docs/concepts/services-networking/ingress/" target="_blank"&gt;Ingress&lt;/a&gt; object was added to Kubernetes in version 1.1 to describe properties of a cluster-wide reverse HTTP proxy.
Since that time, the Ingress API has remained relatively unchanged, and the need to express implementation-specific capabilities has inspired an 
&lt;a href="https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/nginx-configuration/annotations.md" target="_blank"&gt;explosion of annotations&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The goal of the HTTPProxy Custom Resource Definition (CRD) is to expand upon the functionality of the Ingress API to allow for a richer user experience as well addressing the limitations of the latter&amp;rsquo;s use in multi tenant environments.&lt;/p&gt;</description></item><item><title/><link>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/config/health-checks/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/config/health-checks/</guid><description>&lt;h1 id="upstream-health-checks"&gt;Upstream Health Checks&lt;/h1&gt;
&lt;h2 id="http-proxy-health-checking"&gt;HTTP Proxy Health Checking&lt;/h2&gt;
&lt;p&gt;Active health checking can be configured on a per route basis.
Contour supports HTTP health checking and can be configured with various settings to tune the behavior.&lt;/p&gt;
&lt;p&gt;During HTTP health checking Envoy will send an HTTP request to the upstream Endpoints.
It expects a 200 response if the host is healthy.
The upstream host can return 503 if it wants to immediately notify Envoy to no longer forward traffic to it.
It is important to note that these are health checks which Envoy implements and are separate from any other system such as those that exist in Kubernetes.&lt;/p&gt;</description></item><item><title/><link>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/config/inclusion-delegation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/config/inclusion-delegation/</guid><description>&lt;h1 id="httpproxy-inclusion"&gt;HTTPProxy Inclusion&lt;/h1&gt;
&lt;p&gt;HTTPProxy permits the splitting of a system&amp;rsquo;s configuration into separate HTTPProxy instances using &lt;strong&gt;inclusion&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Inclusion, as the name implies, allows for one HTTPProxy object to be included in another, optionally with some conditions inherited from the parent.
Contour reads the inclusion tree and merges the included routes into one big object internally before rendering Envoy config.
Importantly, the included HTTPProxy objects do not have to be in the same namespace.&lt;/p&gt;</description></item><item><title/><link>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/config/ingress/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/config/ingress/</guid><description>&lt;h1 id="k8s-ingress-resource-support-in-contour"&gt;k8s Ingress Resource Support in Contour&lt;/h1&gt;
&lt;!-- TODO: uncomment once we finish enabling Ingress conformance in CI --&gt;
&lt;!-- As of Contour version 1.X, Contour is validated to be conformant to the Ingress spec using the upstream [Ingress controller conformance tests][0]. --&gt;
&lt;!-- However, outside of those tests, the Ingress spec can be interpreted differently by various Ingress controller implementations. --&gt;
&lt;p&gt;This document describes Contour&amp;rsquo;s implementation of specific Ingress resource fields and features.
As the Ingress specification has evolved between v1beta1 and v1, any differences between versions are highlighted to ensure clarity for Contour users.&lt;/p&gt;</description></item><item><title/><link>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/config/rate-limiting/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/config/rate-limiting/</guid><description>&lt;h1 id="rate-limiting"&gt;Rate Limiting&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="#overview"&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="#local-rate-limiting"&gt;Local Rate Limiting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="#global-rate-limiting"&gt;Global Rate Limiting&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;Rate limiting is a means of protecting backend services against unwanted traffic.
This can be useful for a variety of different scenarios:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Protecting against denial-of-service (DoS) attacks by malicious actors&lt;/li&gt;
&lt;li&gt;Protecting against DoS incidents due to bugs in client applications/services&lt;/li&gt;
&lt;li&gt;Enforcing usage quotas for different classes of clients, e.g. free vs. paid tiers&lt;/li&gt;
&lt;li&gt;Controlling resource consumption/cost&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Envoy supports two forms of HTTP rate limiting: &lt;strong&gt;local&lt;/strong&gt; and &lt;strong&gt;global&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title/><link>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/config/request-rewriting/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/config/request-rewriting/</guid><description>&lt;h1 id="request-rewriting"&gt;Request Rewriting&lt;/h1&gt;
&lt;h2 id="path-rewriting"&gt;Path Rewriting&lt;/h2&gt;
&lt;p&gt;HTTPProxy supports rewriting the HTTP request URL path prior to delivering the request to the backend service.
Rewriting is performed after a routing decision has been made, and never changes the request destination.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;pathRewritePolicy&lt;/code&gt; field specifies how the path prefix should be rewritten.
The &lt;code&gt;replacePrefix&lt;/code&gt; rewrite policy specifies a replacement string for a HTTP request path prefix match.
When this field is present, the path prefix that the request matched is replaced by the text specified in the &lt;code&gt;replacement&lt;/code&gt; field.
If the HTTP request path is longer than the matched prefix, the remainder of the path is unchanged.&lt;/p&gt;</description></item><item><title/><link>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/config/request-routing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/config/request-routing/</guid><description>&lt;h1 id="request-routing"&gt;Request Routing&lt;/h1&gt;
&lt;p&gt;A HTTPProxy object must have at least one route or include defined.
In this example, any requests to &lt;code&gt;multi-path.bar.com/blog&lt;/code&gt; or &lt;code&gt;multi-path.bar.com/blog/*&lt;/code&gt; will be routed to the Service &lt;code&gt;s2&lt;/code&gt;.
All other requests to the host &lt;code&gt;multi-path.bar.com&lt;/code&gt; will be routed to the Service &lt;code&gt;s1&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#999;font-style:italic"&gt;# httpproxy-multiple-paths.yaml&lt;/span&gt;&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;&lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;apiVersion&lt;/span&gt;:&lt;span style="color:#666"&gt; &lt;/span&gt;projectcontour.io/v1&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;&lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;kind&lt;/span&gt;:&lt;span style="color:#666"&gt; &lt;/span&gt;HTTPProxy&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;&lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;metadata&lt;/span&gt;:&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;name&lt;/span&gt;:&lt;span style="color:#666"&gt; &lt;/span&gt;multiple-paths&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;namespace&lt;/span&gt;:&lt;span style="color:#666"&gt; &lt;/span&gt;default&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;&lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;spec&lt;/span&gt;:&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;virtualhost&lt;/span&gt;:&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;fqdn&lt;/span&gt;:&lt;span style="color:#666"&gt; &lt;/span&gt;multi-path.bar.com&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;routes&lt;/span&gt;:&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;- &lt;span style="color:#6ab825;font-weight:bold"&gt;conditions&lt;/span&gt;:&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;- &lt;span style="color:#6ab825;font-weight:bold"&gt;prefix&lt;/span&gt;:&lt;span style="color:#666"&gt; &lt;/span&gt;/&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#999;font-style:italic"&gt;# matches everything else&lt;/span&gt;&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;services&lt;/span&gt;:&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;- &lt;span style="color:#6ab825;font-weight:bold"&gt;name&lt;/span&gt;:&lt;span style="color:#666"&gt; &lt;/span&gt;s1&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;port&lt;/span&gt;:&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#3677a9"&gt;80&lt;/span&gt;&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;- &lt;span style="color:#6ab825;font-weight:bold"&gt;conditions&lt;/span&gt;:&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;- &lt;span style="color:#6ab825;font-weight:bold"&gt;prefix&lt;/span&gt;:&lt;span style="color:#666"&gt; &lt;/span&gt;/blog&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#999;font-style:italic"&gt;# matches `multi-path.bar.com/blog` or `multi-path.bar.com/blog/*`&lt;/span&gt;&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;services&lt;/span&gt;:&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;- &lt;span style="color:#6ab825;font-weight:bold"&gt;name&lt;/span&gt;:&lt;span style="color:#666"&gt; &lt;/span&gt;s2&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;port&lt;/span&gt;:&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#3677a9"&gt;80&lt;/span&gt;&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In the following example, we match on headers and send to different services, with a default route if those do not match.&lt;/p&gt;</description></item><item><title/><link>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/config/tls-delegation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/config/tls-delegation/</guid><description>&lt;h1 id="tls-certificate-delegation"&gt;TLS Certificate Delegation&lt;/h1&gt;
&lt;p&gt;In order to support wildcard certificates, TLS certificates for a &lt;code&gt;*.somedomain.com&lt;/code&gt;, which are stored in a namespace controlled by the cluster administrator, Contour supports a facility known as TLS Certificate Delegation.
This facility allows the owner of a TLS certificate to delegate, for the purposes of referencing the TLS certificate, permission to Contour to read the Secret object from another namespace.
Delegation works for both HTTPProxy and Ingress resources, however it needs an annotation to work with Ingress v1.&lt;/p&gt;</description></item><item><title/><link>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/config/tls-termination/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/config/tls-termination/</guid><description>&lt;h1 id="tls-termination"&gt;TLS Termination&lt;/h1&gt;
&lt;p&gt;HTTPProxy follows a similar pattern to Ingress for configuring TLS credentials.&lt;/p&gt;
&lt;p&gt;You can secure a HTTPProxy by specifying a Secret that contains TLS private key and certificate information.
If multiple HTTPProxies utilize the same Secret, the certificate must include the necessary Subject Authority Name (SAN) for each fqdn.&lt;/p&gt;
&lt;p&gt;Contour (via Envoy) requires that clients send the Server Name Indication (SNI) TLS extension so that requests can be routed to the correct virtual host.
Virtual hosts are strongly bound to SNI names.
This means that the Host header in HTTP requests must match the SNI name that was sent at the start of the TLS session.&lt;/p&gt;</description></item><item><title/><link>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/config/upstream-tls/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/config/upstream-tls/</guid><description>&lt;h1 id="upstream-tls"&gt;Upstream TLS&lt;/h1&gt;
&lt;p&gt;A HTTPProxy can proxy to an upstream TLS backend by annotating the upstream Kubernetes Service or by specifying the upstream protocol in the HTTPProxy 
&lt;a href="https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/config/api/#projectcontour.io/v1.Service"&gt;services&lt;/a&gt; field.
Applying the &lt;code&gt;projectcontour.io/upstream-protocol.tls&lt;/code&gt; annotation to a Service object tells Contour that TLS should be enabled and which port should be used for the TLS connection.
The same configuration can be specified by setting the protocol name in the &lt;code&gt;spec.routes.services[].protocol&lt;/code&gt; field on the HTTPProxy object.
If both the annotation and the protocol field are specified, the protocol field takes precedence.
By default, the upstream TLS server certificate will not be validated, but validation can be requested by setting the &lt;code&gt;spec.routes.services[].validation&lt;/code&gt; field.
This field has mandatory &lt;code&gt;caSecret&lt;/code&gt; and &lt;code&gt;subjectName&lt;/code&gt; fields, which specify the trusted root certificates with which to validate the server certificate and the expected server name.
The &lt;code&gt;caSecret&lt;/code&gt; can be a namespaced name of the form &lt;code&gt;&amp;lt;namespace&amp;gt;/&amp;lt;secret-name&amp;gt;&lt;/code&gt;. If the CA secret&amp;rsquo;s namespace is not the same namespace as the &lt;code&gt;HTTPProxy&lt;/code&gt; resource, 
&lt;a href="https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/config/tls-delegation/"&gt;TLS Certificate Delegation&lt;/a&gt; must be used to allow the owner of the CA certificate secret to delegate, for the purposes of referencing the CA certificate in a different namespace, permission to Contour to read the Secret object from another namespace.&lt;/p&gt;</description></item><item><title/><link>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/config/virtual-hosts/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/config/virtual-hosts/</guid><description>&lt;h1 id="virtual-hosts"&gt;Virtual Hosts&lt;/h1&gt;
&lt;p&gt;Similar to Ingress, HTTPProxy support name-based virtual hosting.
Name-based virtual hosts use multiple host names with the same IP address.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;foo.bar.com --| |-&amp;gt; foo.bar.com s1:80
 | 178.91.123.132 |
bar.foo.com --| |-&amp;gt; bar.foo.com s2:80
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Unlike Ingress however, HTTPProxy only support a single root domain per HTTPProxy object.
As an example, this Ingress object:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#999;font-style:italic"&gt;# ingress-name.yaml&lt;/span&gt;&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;&lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;apiVersion&lt;/span&gt;:&lt;span style="color:#666"&gt; &lt;/span&gt;networking.k8s.io/v1&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;&lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;kind&lt;/span&gt;:&lt;span style="color:#666"&gt; &lt;/span&gt;Ingress&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;&lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;metadata&lt;/span&gt;:&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;name&lt;/span&gt;:&lt;span style="color:#666"&gt; &lt;/span&gt;name-example&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;&lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;spec&lt;/span&gt;:&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;rules&lt;/span&gt;:&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;- &lt;span style="color:#6ab825;font-weight:bold"&gt;host&lt;/span&gt;:&lt;span style="color:#666"&gt; &lt;/span&gt;foo1.bar.com&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;http&lt;/span&gt;:&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;paths&lt;/span&gt;:&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;- &lt;span style="color:#6ab825;font-weight:bold"&gt;backend&lt;/span&gt;:&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;service&lt;/span&gt;:&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;name&lt;/span&gt;:&lt;span style="color:#666"&gt; &lt;/span&gt;s1&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;port&lt;/span&gt;:&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;number&lt;/span&gt;:&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#3677a9"&gt;80&lt;/span&gt;&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;pathType&lt;/span&gt;:&lt;span style="color:#666"&gt; &lt;/span&gt;Prefix &lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;- &lt;span style="color:#6ab825;font-weight:bold"&gt;host&lt;/span&gt;:&lt;span style="color:#666"&gt; &lt;/span&gt;bar1.bar.com&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;http&lt;/span&gt;:&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;paths&lt;/span&gt;:&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;- &lt;span style="color:#6ab825;font-weight:bold"&gt;backend&lt;/span&gt;:&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;service&lt;/span&gt;:&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;name&lt;/span&gt;:&lt;span style="color:#666"&gt; &lt;/span&gt;s2&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;port&lt;/span&gt;:&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;number&lt;/span&gt;:&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#3677a9"&gt;80&lt;/span&gt;&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;pathType&lt;/span&gt;:&lt;span style="color:#666"&gt; &lt;/span&gt;Prefix&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;must be represented by two different HTTPProxy objects:&lt;/p&gt;</description></item><item><title/><link>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/config/websockets/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/config/websockets/</guid><description>&lt;h1 id="websockets"&gt;Websockets&lt;/h1&gt;
&lt;p&gt;WebSocket support can be enabled on specific routes using the &lt;code&gt;enableWebsockets&lt;/code&gt; field:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#999;font-style:italic"&gt;# httpproxy-websockets.yaml&lt;/span&gt;&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;&lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;apiVersion&lt;/span&gt;:&lt;span style="color:#666"&gt; &lt;/span&gt;projectcontour.io/v1&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;&lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;kind&lt;/span&gt;:&lt;span style="color:#666"&gt; &lt;/span&gt;HTTPProxy&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;&lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;metadata&lt;/span&gt;:&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;name&lt;/span&gt;:&lt;span style="color:#666"&gt; &lt;/span&gt;chat&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;namespace&lt;/span&gt;:&lt;span style="color:#666"&gt; &lt;/span&gt;default&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;&lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;spec&lt;/span&gt;:&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;virtualhost&lt;/span&gt;:&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;fqdn&lt;/span&gt;:&lt;span style="color:#666"&gt; &lt;/span&gt;chat.example.com&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;routes&lt;/span&gt;:&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;- &lt;span style="color:#6ab825;font-weight:bold"&gt;services&lt;/span&gt;:&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;- &lt;span style="color:#6ab825;font-weight:bold"&gt;name&lt;/span&gt;:&lt;span style="color:#666"&gt; &lt;/span&gt;chat-app&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;port&lt;/span&gt;:&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#3677a9"&gt;80&lt;/span&gt;&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;- &lt;span style="color:#6ab825;font-weight:bold"&gt;conditions&lt;/span&gt;:&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;- &lt;span style="color:#6ab825;font-weight:bold"&gt;prefix&lt;/span&gt;:&lt;span style="color:#666"&gt; &lt;/span&gt;/websocket&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;enableWebsockets&lt;/span&gt;:&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;true&lt;/span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#999;font-style:italic"&gt;# Setting this to true enables websocket for all paths that match /websocket&lt;/span&gt;&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;services&lt;/span&gt;:&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;- &lt;span style="color:#6ab825;font-weight:bold"&gt;name&lt;/span&gt;:&lt;span style="color:#666"&gt; &lt;/span&gt;chat-app&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;port&lt;/span&gt;:&lt;span style="color:#666"&gt; &lt;/span&gt;&lt;span style="color:#3677a9"&gt;80&lt;/span&gt;&lt;span style="color:#666"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title/><link>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/configuration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/configuration/</guid><description>&lt;h1 id="contour-configuration-reference"&gt;Contour Configuration Reference&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="#serve-flags"&gt;Serve Flags&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="#configuration-file"&gt;Configuration File&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="#environment-variables"&gt;Environment Variables&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="#bootstrap-config-file"&gt;Bootstrap Config File&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;There are various ways to configure Contour, flags, the configuration file, as well as environment variables.
Contour has a precedence of configuration for contour serve, meaning anything configured in the config file is overridden by environment vars which are overridden by cli flags.&lt;/p&gt;
&lt;h2 id="serve-flags"&gt;Serve Flags&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;contour serve&lt;/code&gt; command is the main command which is used to watch for Kubernetes resource and process them into Envoy configuration which is then streamed to any Envoy via its xDS gRPC connection.
There are a number of flags that can be passed to this command which further configures how Contour operates.
Many of these flags are mirrored in the 
&lt;a href="#configuration-file"&gt;Contour Configuration File&lt;/a&gt;.&lt;/p&gt;</description></item><item><title/><link>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/deploy-options/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/deploy-options/</guid><description>&lt;h1 id="deployment-options"&gt;Deployment Options&lt;/h1&gt;
&lt;p&gt;The 
&lt;a href="https://deploy-preview-7418--projectcontour.netlify.app/getting-started/"&gt;Getting Started&lt;/a&gt; guide shows you a simple way to get started with Contour on your cluster.
This topic explains the details and shows you additional options.
Most of this covers running Contour using a Kubernetes Service of &lt;code&gt;Type: LoadBalancer&lt;/code&gt;.
If you don&amp;rsquo;t have a cluster with that capability see the 
&lt;a href="#running-without-a-kubernetes-loadbalancer"&gt;Running without a Kubernetes LoadBalancer&lt;/a&gt; section.&lt;/p&gt;
&lt;h2 id="installation"&gt;Installation&lt;/h2&gt;
&lt;p&gt;Contour requires a secret containing TLS certificates that are used to secure the gRPC communication between Contour&amp;lt;&amp;gt;Envoy.
This secret can be auto-generated by the Contour &lt;code&gt;certgen&lt;/code&gt; job or provided by an administrator.
Traffic must be forwarded to Envoy, typically via a Service of &lt;code&gt;type: LoadBalancer&lt;/code&gt;.
All other requirements such as RBAC permissions, configuration details, are provided or have good defaults for most installations.&lt;/p&gt;</description></item><item><title/><link>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/github/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/github/</guid><description>&lt;p&gt;This document outlines how we use GitHub.&lt;/p&gt;
&lt;h2 id="milestones"&gt;Milestones&lt;/h2&gt;
&lt;p&gt;Contour attempts to ship on a quarterly basis.
These releases are tracked with a milestone.
The &lt;em&gt;current&lt;/em&gt; release is the milestone with the closest delivery date.&lt;/p&gt;
&lt;p&gt;Issues which are not assigned to the current milestone &lt;em&gt;should not be worked on&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id="priorities"&gt;Priorities&lt;/h2&gt;
&lt;p&gt;This project has three levels of priority:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;p0 - Must fix immediately.
This is reserved for bugs and security issues. A milestone cannot ship with open p0 issues.&lt;/li&gt;
&lt;li&gt;p1 - Should be done.
p1 issues assigned to a milestone &lt;em&gt;should&lt;/em&gt; be completed during that milestone.&lt;/li&gt;
&lt;li&gt;p2 - May be done.
p2 issues assigned to a milestone &lt;em&gt;may&lt;/em&gt; be completed during that milestone if time permits.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Issues without a priority are &lt;em&gt;unprioritised&lt;/em&gt;. Priority will be assigned by a PM or release manager during issue triage.&lt;/p&gt;</description></item><item><title/><link>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/grpc-tls-howto/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/grpc-tls-howto/</guid><description>&lt;h1 id="enabling-tls-between-envoy-and-contour"&gt;Enabling TLS between Envoy and Contour&lt;/h1&gt;
&lt;p&gt;This document describes the steps required to secure communication between Envoy and Contour.
The outcome of this is that we will have two Secrets available in the &lt;code&gt;projectcontour&lt;/code&gt; namespace:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;contourcert:&lt;/strong&gt; contains Contour&amp;rsquo;s keypair which is used for serving TLS secured gRPC, and the CA&amp;rsquo;s public certificate bundle which is used for validating Envoy&amp;rsquo;s client certificate.
Contour&amp;rsquo;s certificate must be a valid certificate for the name &lt;code&gt;contour&lt;/code&gt; in order for this to work.
This is currently hardcoded by Contour.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;envoycert:&lt;/strong&gt; contains Envoy&amp;rsquo;s keypair which used as a client for connecting to Contour, and the CA&amp;rsquo;s public certificate bundle which is used for validating Contour&amp;rsquo;s server certificate.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note that both Secrets contain a copy of the CA certificate bundle under the &lt;code&gt;ca.crt&lt;/code&gt; data key.&lt;/p&gt;</description></item><item><title/><link>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/redeploy-envoy/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/redeploy-envoy/</guid><description>&lt;h1 id="redeploying-envoy"&gt;Redeploying Envoy&lt;/h1&gt;
&lt;p&gt;The Envoy process, the data path component of Contour, at times needs to be re-deployed.
This could be due to an upgrade, a change in configuration, or a node-failure forcing a redeployment.&lt;/p&gt;
&lt;p&gt;When implementing this roll out, the following steps should be taken:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Stop Envoy from accepting new connections&lt;/li&gt;
&lt;li&gt;Start draining existing connections in Envoy by sending a &lt;code&gt;POST&lt;/code&gt; request to &lt;code&gt;/healthcheck/fail&lt;/code&gt; endpoint&lt;/li&gt;
&lt;li&gt;Wait for connections to drain before allowing Kubernetes to &lt;code&gt;SIGTERM&lt;/code&gt; the pod&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;Contour implements an &lt;code&gt;envoy&lt;/code&gt; sub-command named &lt;code&gt;shutdown-manager&lt;/code&gt; whose job is to manage a single Envoy instances lifecycle for Kubernetes.
The &lt;code&gt;shutdown-manager&lt;/code&gt; runs as a new container alongside the Envoy container in the same pod.
It exposes two HTTP endpoints which are used for &lt;code&gt;livenessProbe&lt;/code&gt; as well as to handle the Kubernetes &lt;code&gt;preStop&lt;/code&gt; event hook.&lt;/p&gt;</description></item><item><title/><link>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/start-contributing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/start-contributing/</guid><description>&lt;h1 id="getting-started-with-contributing"&gt;Getting Started with Contributing&lt;/h1&gt;
&lt;p&gt;Thanks for your interest in contributing to Contour. Community contributions are always needed, welcome, and appreciated. This guide shows how you can contribute to Contour in the following areas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Code&lt;/li&gt;
&lt;li&gt;Website&lt;/li&gt;
&lt;li&gt;Documentation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Please familiarize yourself with the 
&lt;a href="https://github.com/projectcontour/contour/blob/main/CODE_OF_CONDUCT.md"&gt;Code of Conduct&lt;/a&gt; and project 
&lt;a href="https://deploy-preview-7418--projectcontour.netlify.app/resources/philosophy/"&gt;Philosophy&lt;/a&gt; before contributing.&lt;/p&gt;
&lt;h1 id="getting-started-with-code"&gt;Getting Started with Code&lt;/h1&gt;
&lt;p&gt;Everything is managed on the 
&lt;a href="https://github.com/projectcontour" target="_blank"&gt;Project Contour GitHub&lt;/a&gt; organization. Create an issue for a new idea or look for issues labeled &lt;strong&gt;good first issue&lt;/strong&gt; to get started.&lt;/p&gt;</description></item><item><title/><link>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/troubleshooting/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/troubleshooting/</guid><description>&lt;h2 id="troubleshooting"&gt;Troubleshooting&lt;/h2&gt;
&lt;p&gt;If you encounter issues, follow the guides below for help. For topics not covered here, you can 
&lt;a href="https://github.com/projectcontour/contour/issues"&gt;file an issue&lt;/a&gt;, or talk to us on the 
&lt;a href="https://kubernetes.slack.com/messages/contour"&gt;#contour channel&lt;/a&gt; on Kubernetes Slack.&lt;/p&gt;
&lt;h3 id="envoy-administration-access"&gt;
&lt;a href="https://deploy-preview-7418--projectcontour.netlify.app/docs/1.33/troubleshooting/envoy-admin-interface/"&gt;Envoy Administration Access&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Review the linked steps to learn how to access the administration interface for your Envoy instance.&lt;/p&gt;
&lt;h3 id="contour-debug-logging"&gt;
&lt;a href="https://deploy-preview-7418--projectcontour.netlify.app/docs/1.33/troubleshooting/contour-debug-log/"&gt;Contour Debug Logging&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Learn how to enable debug logging to diagnose issues between Contour and the Kubernetes API.&lt;/p&gt;
&lt;h3 id="envoy-debug-logging"&gt;
&lt;a href="https://deploy-preview-7418--projectcontour.netlify.app/docs/1.33/troubleshooting/envoy-debug-log/"&gt;Envoy Debug Logging&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Learn how to enable debug logging to diagnose TLS connection issues.&lt;/p&gt;</description></item><item><title/><link>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/troubleshooting/contour-debug-log/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/troubleshooting/contour-debug-log/</guid><description>&lt;h1 id="enabling-contour-debug-logging"&gt;Enabling Contour Debug Logging&lt;/h1&gt;
&lt;p&gt;The &lt;code&gt;contour serve&lt;/code&gt; subcommand has two command-line flags that can be helpful for debugging.
The &lt;code&gt;--debug&lt;/code&gt; flag enables general Contour debug logging, which logs more information about how Contour is processing API resources.
The &lt;code&gt;--kubernetes-debug&lt;/code&gt; flag enables verbose logging in the Kubernetes client API, which can help debug interactions between Contour and the Kubernetes API server.
This flag requires an integer log level argument, where higher number indicates more detailed logging.&lt;/p&gt;</description></item><item><title/><link>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/troubleshooting/contour-graph/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/troubleshooting/contour-graph/</guid><description>&lt;h1 id="visualizing-contours-internal-object-graph"&gt;Visualizing Contour&amp;rsquo;s Internal Object Graph&lt;/h1&gt;
&lt;p&gt;Contour models its configuration using a directed acyclic graph (DAG) of internal objects.
This can be visualized through a debug endpoint that outputs the DAG in 
&lt;a href="https://en.wikipedia.org/wiki/DOT" target="_blank"&gt;DOT&lt;/a&gt; format.
To visualize the graph, you must have 
&lt;a href="https://graphviz.gitlab.io/" target="_blank"&gt;&lt;code&gt;graphviz&lt;/code&gt;&lt;/a&gt; installed on your system.&lt;/p&gt;
&lt;p&gt;To download the graph and save it as a PNG:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#999;font-style:italic"&gt;# Port forward into the contour pod&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ &lt;span style="color:#40ffff"&gt;CONTOUR_POD&lt;/span&gt;=&lt;span style="color:#6ab825;font-weight:bold"&gt;$(&lt;/span&gt;kubectl -n projectcontour get pod -l &lt;span style="color:#40ffff"&gt;app&lt;/span&gt;=contour -o name | head -1&lt;span style="color:#6ab825;font-weight:bold"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#999;font-style:italic"&gt;# Do the port forward to that pod&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl -n projectcontour port-forward &lt;span style="color:#40ffff"&gt;$CONTOUR_POD&lt;/span&gt; &lt;span style="color:#3677a9"&gt;6060&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#999;font-style:italic"&gt;# Download and store the DAG in png format&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ curl localhost:6060/debug/dag | dot -T png &amp;gt; contour-dag.png
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The following is an example of a DAG that maps &lt;code&gt;http://kuard.local:80/&lt;/code&gt; to the
&lt;code&gt;kuard&lt;/code&gt; service in the &lt;code&gt;default&lt;/code&gt; namespace:&lt;/p&gt;</description></item><item><title/><link>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/troubleshooting/contour-xds-resources/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/troubleshooting/contour-xds-resources/</guid><description>&lt;h1 id="interrogate-contours-xds-resources"&gt;Interrogate Contour&amp;rsquo;s xDS Resources&lt;/h1&gt;
&lt;p&gt;Sometimes it&amp;rsquo;s helpful to be able to interrogate Contour to find out exactly what 
&lt;a href="https://www.envoyproxy.io/docs/envoy/latest/api-docs/xds_protocol" target="_blank"&gt;xDS&lt;/a&gt; resource data it is sending to Envoy.
Contour ships with a &lt;code&gt;contour cli&lt;/code&gt; subcommand which can be used for this purpose.&lt;/p&gt;
&lt;p&gt;Because Contour secures its communications with Envoy using Secrets in the cluster, the easiest way is to run &lt;code&gt;contour cli&lt;/code&gt; commands &lt;em&gt;inside&lt;/em&gt; the pod.
Do this is via &lt;code&gt;kubectl exec&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#999;font-style:italic"&gt;# Get one of the pods that matches the examples/daemonset&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ &lt;span style="color:#40ffff"&gt;CONTOUR_POD&lt;/span&gt;=&lt;span style="color:#6ab825;font-weight:bold"&gt;$(&lt;/span&gt;kubectl -n projectcontour get pod -l &lt;span style="color:#40ffff"&gt;app&lt;/span&gt;=contour -o &lt;span style="color:#40ffff"&gt;jsonpath&lt;/span&gt;=&lt;span style="color:#ed9d13"&gt;&amp;#39;{.items[0].metadata.name}&amp;#39;&lt;/span&gt;&lt;span style="color:#6ab825;font-weight:bold"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#999;font-style:italic"&gt;# Do the port forward to that pod&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl -n projectcontour &lt;span style="color:#24909d"&gt;exec&lt;/span&gt; &lt;span style="color:#40ffff"&gt;$CONTOUR_POD&lt;/span&gt; -c contour -- contour cli lds --cafile=/certs/ca.crt --cert-file=/certs/tls.crt --key-file=/certs/tls.key
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Which will stream changes to the LDS api endpoint to your terminal.
Replace &lt;code&gt;contour cli lds&lt;/code&gt; with &lt;code&gt;contour cli rds&lt;/code&gt; for route resources, &lt;code&gt;contour cli cds&lt;/code&gt; for cluster resources, and &lt;code&gt;contour cli eds&lt;/code&gt; for endpoints.&lt;/p&gt;</description></item><item><title/><link>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/troubleshooting/envoy-admin-interface/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/troubleshooting/envoy-admin-interface/</guid><description>&lt;h1 id="accessing-the-envoy-administration-interface"&gt;Accessing the Envoy Administration Interface&lt;/h1&gt;
&lt;p&gt;Getting access to the Envoy 
&lt;a href="https://www.envoyproxy.io/docs/envoy/latest/operations/admin" target="_blank"&gt;administration interface&lt;/a&gt; can be useful for diagnosing issues with routing or cluster health.
However, Contour doesn&amp;rsquo;t expose the entire Envoy Administration interface since that interface contains many options, such as shutting down Envoy or draining traffic.
To prohibit this behavior, Contour only exposes the read-only options from the admin interface which still allows for debugging Envoy, but without the options mentioned previously.&lt;/p&gt;</description></item><item><title/><link>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/troubleshooting/envoy-debug-log/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/troubleshooting/envoy-debug-log/</guid><description>&lt;h1 id="enabling-envoy-debug-logging"&gt;Enabling Envoy Debug Logging&lt;/h1&gt;
&lt;p&gt;The &lt;code&gt;envoy&lt;/code&gt; command has a &lt;code&gt;--log-level&lt;/code&gt; 
&lt;a href="https://www.envoyproxy.io/docs/envoy/latest/operations/cli" target="_blank"&gt;flag&lt;/a&gt; that can be useful for debugging.
By default, it&amp;rsquo;s set to &lt;code&gt;info&lt;/code&gt;.
To change it to &lt;code&gt;debug&lt;/code&gt;, edit the &lt;code&gt;envoy&lt;/code&gt; DaemonSet in the &lt;code&gt;projectcontour&lt;/code&gt; namespace and replace the &lt;code&gt;--log-level info&lt;/code&gt; flag with &lt;code&gt;--log-level debug&lt;/code&gt;.
Setting the Envoy log level to &lt;code&gt;debug&lt;/code&gt; can be particilarly useful for debugging TLS connection failures.&lt;/p&gt;</description></item><item><title/><link>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/troubleshooting/operator/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/troubleshooting/operator/</guid><description>&lt;h1 id="operator-troubleshooting"&gt;Operator Troubleshooting&lt;/h1&gt;
&lt;p&gt;
&lt;a href="https://github.com/projectcontour/contour-operator" target="_blank"&gt;Contour Operator&lt;/a&gt; runs in a Kubernetes cluster and is managed by a

&lt;a href="https://kubernetes.io/docs/concepts/workloads/controllers/deployment/" target="_blank"&gt;Deployment&lt;/a&gt; resource. The following steps can be used to verify and
troubleshoot the operator:&lt;/p&gt;
&lt;p&gt;Verify the operator deployment is available:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl get deploy/contour-operator -n contour-operator
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NAME READY UP-TO-DATE AVAILABLE AGE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;contour-operator 1/1 &lt;span style="color:#3677a9"&gt;1&lt;/span&gt; &lt;span style="color:#3677a9"&gt;1&lt;/span&gt; 39m
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Check the logs of the operator:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl logs deploy/contour-operator -n contour-operator -c contour-operator -f
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2020-12-01T00:10:14.245Z	INFO	controller-runtime.metrics	metrics server is starting to listen	{&lt;span style="color:#ed9d13"&gt;&amp;#34;addr&amp;#34;&lt;/span&gt;: &lt;span style="color:#ed9d13"&gt;&amp;#34;127.0.0.1:8080&amp;#34;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2020-12-01T00:10:14.341Z	INFO	setup	starting contour-operator
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;I1201 00:10:14.343439 &lt;span style="color:#3677a9"&gt;1&lt;/span&gt; leaderelection.go:243] attempting to acquire leader lease contour-operator/0d879e31.projectcontour.io...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2020-12-01T00:10:14.345Z	INFO	controller-runtime.manager	starting metrics server	{&lt;span style="color:#ed9d13"&gt;&amp;#34;path&amp;#34;&lt;/span&gt;: &lt;span style="color:#ed9d13"&gt;&amp;#34;/metrics&amp;#34;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;I1201 00:10:14.442755 &lt;span style="color:#3677a9"&gt;1&lt;/span&gt; leaderelection.go:253] successfully acquired lease contour-operator/0d879e31.projectcontour.io
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2020-12-01T00:10:14.447Z	INFO	controller	Starting EventSource	{&lt;span style="color:#ed9d13"&gt;&amp;#34;reconcilerGroup&amp;#34;&lt;/span&gt;: &lt;span style="color:#ed9d13"&gt;&amp;#34;operator.projectcontour.io&amp;#34;&lt;/span&gt;, &lt;span style="color:#ed9d13"&gt;&amp;#34;reconcilerKind&amp;#34;&lt;/span&gt;: &lt;span style="color:#ed9d13"&gt;&amp;#34;Contour&amp;#34;&lt;/span&gt;, &lt;span style="color:#ed9d13"&gt;&amp;#34;controller&amp;#34;&lt;/span&gt;: &lt;span style="color:#ed9d13"&gt;&amp;#34;contour&amp;#34;&lt;/span&gt;, &lt;span style="color:#ed9d13"&gt;&amp;#34;source&amp;#34;&lt;/span&gt;: &lt;span style="color:#ed9d13"&gt;&amp;#34;kind source: /, Kind=&amp;#34;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2020-12-01T00:10:14.540Z	DEBUG	controller-runtime.manager.events	Normal	{&lt;span style="color:#ed9d13"&gt;&amp;#34;object&amp;#34;&lt;/span&gt;: {&lt;span style="color:#ed9d13"&gt;&amp;#34;kind&amp;#34;&lt;/span&gt;:&lt;span style="color:#ed9d13"&gt;&amp;#34;ConfigMap&amp;#34;&lt;/span&gt;,&lt;span style="color:#ed9d13"&gt;&amp;#34;namespace&amp;#34;&lt;/span&gt;:&lt;span style="color:#ed9d13"&gt;&amp;#34;contour-operator&amp;#34;&lt;/span&gt;,&lt;span style="color:#ed9d13"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;:&lt;span style="color:#ed9d13"&gt;&amp;#34;0d879e31.projectcontour.io&amp;#34;&lt;/span&gt;,&lt;span style="color:#ed9d13"&gt;&amp;#34;uid&amp;#34;&lt;/span&gt;:&lt;span style="color:#ed9d13"&gt;&amp;#34;40ebcf47-a105-4efc-b7e9-993df2070a07&amp;#34;&lt;/span&gt;,&lt;span style="color:#ed9d13"&gt;&amp;#34;apiVersion&amp;#34;&lt;/span&gt;:&lt;span style="color:#ed9d13"&gt;&amp;#34;v1&amp;#34;&lt;/span&gt;,&lt;span style="color:#ed9d13"&gt;&amp;#34;resourceVersion&amp;#34;&lt;/span&gt;:&lt;span style="color:#ed9d13"&gt;&amp;#34;33899&amp;#34;&lt;/span&gt;}, &lt;span style="color:#ed9d13"&gt;&amp;#34;reason&amp;#34;&lt;/span&gt;: &lt;span style="color:#ed9d13"&gt;&amp;#34;LeaderElection&amp;#34;&lt;/span&gt;, &lt;span style="color:#ed9d13"&gt;&amp;#34;message&amp;#34;&lt;/span&gt;: &lt;span style="color:#ed9d13"&gt;&amp;#34;contour-operator-55d6c7b4b5-hkd78_e960056c-f959-45c9-8686-9b85e09e21d8 became leader&amp;#34;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2020-12-01T00:10:14.842Z	INFO	controller	Starting EventSource	{&lt;span style="color:#ed9d13"&gt;&amp;#34;reconcilerGroup&amp;#34;&lt;/span&gt;: &lt;span style="color:#ed9d13"&gt;&amp;#34;operator.projectcontour.io&amp;#34;&lt;/span&gt;, &lt;span style="color:#ed9d13"&gt;&amp;#34;reconcilerKind&amp;#34;&lt;/span&gt;: &lt;span style="color:#ed9d13"&gt;&amp;#34;Contour&amp;#34;&lt;/span&gt;, &lt;span style="color:#ed9d13"&gt;&amp;#34;controller&amp;#34;&lt;/span&gt;: &lt;span style="color:#ed9d13"&gt;&amp;#34;contour&amp;#34;&lt;/span&gt;, &lt;span style="color:#ed9d13"&gt;&amp;#34;source&amp;#34;&lt;/span&gt;: &lt;span style="color:#ed9d13"&gt;&amp;#34;kind source: /, Kind=&amp;#34;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2020-12-01T00:10:15.046Z	INFO	controller	Starting EventSource	{&lt;span style="color:#ed9d13"&gt;&amp;#34;reconcilerGroup&amp;#34;&lt;/span&gt;: &lt;span style="color:#ed9d13"&gt;&amp;#34;operator.projectcontour.io&amp;#34;&lt;/span&gt;, &lt;span style="color:#ed9d13"&gt;&amp;#34;reconcilerKind&amp;#34;&lt;/span&gt;: &lt;span style="color:#ed9d13"&gt;&amp;#34;Contour&amp;#34;&lt;/span&gt;, &lt;span style="color:#ed9d13"&gt;&amp;#34;controller&amp;#34;&lt;/span&gt;: &lt;span style="color:#ed9d13"&gt;&amp;#34;contour&amp;#34;&lt;/span&gt;, &lt;span style="color:#ed9d13"&gt;&amp;#34;source&amp;#34;&lt;/span&gt;: &lt;span style="color:#ed9d13"&gt;&amp;#34;kind source: /, Kind=&amp;#34;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2020-12-01T00:10:15.340Z	INFO	controller	Starting Controller	{&lt;span style="color:#ed9d13"&gt;&amp;#34;reconcilerGroup&amp;#34;&lt;/span&gt;: &lt;span style="color:#ed9d13"&gt;&amp;#34;operator.projectcontour.io&amp;#34;&lt;/span&gt;, &lt;span style="color:#ed9d13"&gt;&amp;#34;reconcilerKind&amp;#34;&lt;/span&gt;: &lt;span style="color:#ed9d13"&gt;&amp;#34;Contour&amp;#34;&lt;/span&gt;, &lt;span style="color:#ed9d13"&gt;&amp;#34;controller&amp;#34;&lt;/span&gt;: &lt;span style="color:#ed9d13"&gt;&amp;#34;contour&amp;#34;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2020-12-01T00:10:15.341Z	INFO	controller	Starting workers	{&lt;span style="color:#ed9d13"&gt;&amp;#34;reconcilerGroup&amp;#34;&lt;/span&gt;: &lt;span style="color:#ed9d13"&gt;&amp;#34;operator.projectcontour.io&amp;#34;&lt;/span&gt;, &lt;span style="color:#ed9d13"&gt;&amp;#34;reconcilerKind&amp;#34;&lt;/span&gt;: &lt;span style="color:#ed9d13"&gt;&amp;#34;Contour&amp;#34;&lt;/span&gt;, &lt;span style="color:#ed9d13"&gt;&amp;#34;controller&amp;#34;&lt;/span&gt;: &lt;span style="color:#ed9d13"&gt;&amp;#34;contour&amp;#34;&lt;/span&gt;, &lt;span style="color:#ed9d13"&gt;&amp;#34;worker count&amp;#34;&lt;/span&gt;: 1}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;When a &lt;code&gt;Contour&lt;/code&gt; is created, the operator should successfully reconcile the object:&lt;/p&gt;</description></item><item><title/><link>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/troubleshooting/profiling-contour/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-7418--projectcontour.netlify.app/docs/1.21/troubleshooting/profiling-contour/</guid><description>&lt;h1 id="accessing-contours-debugpprof-service"&gt;Accessing Contour&amp;rsquo;s /debug/pprof Service&lt;/h1&gt;
&lt;p&gt;Contour exposes the 
&lt;a href="https://golang.org/pkg/net/http/pprof" target="_blank"&gt;net/http/pprof&lt;/a&gt; handlers for &lt;code&gt;go tool pprof&lt;/code&gt; and &lt;code&gt;go tool trace&lt;/code&gt; by default on &lt;code&gt;127.0.0.1:6060&lt;/code&gt;.
This service is useful for profiling Contour.
To access it from your workstation use &lt;code&gt;kubectl port-forward&lt;/code&gt; like so,&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#999;font-style:italic"&gt;# Get one of the pods that matches the Contour deployment&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ &lt;span style="color:#40ffff"&gt;CONTOUR_POD&lt;/span&gt;=&lt;span style="color:#6ab825;font-weight:bold"&gt;$(&lt;/span&gt;kubectl -n projectcontour get pod -l &lt;span style="color:#40ffff"&gt;app&lt;/span&gt;=contour -o name | head -1&lt;span style="color:#6ab825;font-weight:bold"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#999;font-style:italic"&gt;# Do the port forward to that pod&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ kubectl -n projectcontour port-forward &lt;span style="color:#40ffff"&gt;$CONTOUR_POD&lt;/span&gt; &lt;span style="color:#3677a9"&gt;6060&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item></channel></rss>