<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Spinnaker – Kubernetes</title>
    <link>/docs/guides/user/kubernetes/</link>
    <description>Recent content in Kubernetes on Spinnaker</description>
    <generator>Hugo -- gohugo.io</generator>
    
	  <atom:link href="/docs/guides/user/kubernetes/index.xml" rel="self" type="application/rss+xml" />
    
    
      
        
      
    
    
    <item>
      <title>Docs: Annotation-Driven UI</title>
      <link>/docs/guides/user/kubernetes/annotations-ui/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/guides/user/kubernetes/annotations-ui/</guid>
      <description>
        
        
        &lt;p&gt;This guide describes how to surface information about your Kubernetes resources
in Deck&amp;rsquo;s details panel using Kubernetes annotations.  These annotations can be
text or HTML and can include templated values that are populated when the annotation
is rendered by the browser.&lt;/p&gt;
&lt;h2 id=&#34;example-usage&#34;&gt;Example Usage&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s a quick example of usage that will add a &amp;ldquo;Pod Info&amp;rdquo; section to the details
panel for a pod:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl annotate pod my-prod-pod-v000 &lt;span style=&#34;color:#4e9a06&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&lt;/span&gt;  pod-info.details.html.spinnaker.io&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&amp;lt;a href=&amp;#39;https://internal-elk.net/{{&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;{{&lt;/span&gt; name &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;}}}}&amp;#39;&amp;gt;Internal Logs Service&amp;lt;/a&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here&amp;rsquo;s how this annotation will render in Spinnaker&amp;rsquo;s UI:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./pod_info_example.png&#34;/&gt;
&lt;/figure&gt;

&lt;p&gt;Dissecting the annotation, here&amp;rsquo;s how the UI is constructed:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The section title, &amp;ldquo;Pod Info&amp;rdquo; comes from the annotation key:
&lt;strong&gt;pod-info&lt;/strong&gt;.details.html.spinnaker.io. Notice that hyphens are replaced
with spaces and the section title is rendered using Title Case.&lt;/li&gt;
&lt;li&gt;The entry is to be rendered as HTML.  This also comes from the annotation&amp;rsquo;s key:
pod-info.details.&lt;strong&gt;html&lt;/strong&gt;.spinnaker.io.  Excluding &amp;ldquo;html&amp;rdquo; here would have rendered
the link as plain text.&lt;/li&gt;
&lt;li&gt;The HTML content is taken from the annotation&amp;rsquo;s value:
&lt;code&gt;&amp;lt;a href=&#39;https://internal-elk.net/{{&amp;quot;{{ name &amp;quot;}}}}&#39;&amp;gt;Internal Logs Service&amp;lt;/a&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;The pod&amp;rsquo;s name will be interpolated into the link. Notice the &lt;code&gt;{{&amp;quot;{{ name &amp;quot;}}}}&lt;/code&gt; template
value in the href attribute.  The full set of available values are listed at the end
of this document.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;rendering-text-annotations&#34;&gt;Rendering Text Annotations&lt;/h2&gt;
&lt;p&gt;To render the annotation as plain text, use an annotation key following this pattern:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;(section-title).details.spinnaker.io/(key-name)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The &lt;code&gt;key-name&lt;/code&gt; portion can be included or omitted.  If included the text will be rendered
as a key/value pair with &lt;code&gt;key-name&lt;/code&gt; in bold and hyphens replaced with spaces.&lt;/p&gt;
&lt;h2 id=&#34;rendering-html&#34;&gt;Rendering HTML&lt;/h2&gt;
&lt;p&gt;To render the annotation as HTML, use an annotation key following this pattern:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;(section-title).details.html.spinnaker.io/(key-name)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;key-name&lt;/code&gt; will not be rendered but is available to allow multiple HTML entries under
a single section title.&lt;/p&gt;
&lt;h3 id=&#34;using-templates&#34;&gt;Using Templates&lt;/h3&gt;
&lt;p&gt;Template values can be included in the content of the annotation and will be replaced when
they are rendered by Deck.  A templated value has the following appearance in an annotation:
&lt;code&gt;{{ &amp;quot;{{ templateKey &amp;quot;}} }}&lt;/code&gt; where &lt;code&gt;templateKey&lt;/code&gt; will vary depending on the available set of keys
for the resource that is annotated.  The complete set of available keys is documented below.&lt;/p&gt;
&lt;h4 id=&#34;instances&#34;&gt;Instances&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;account - the spinnaker account for this resource&lt;/li&gt;
&lt;li&gt;apiVersion - the kubernetes apiVersion of this resource&lt;/li&gt;
&lt;li&gt;cloudProvider - this will always be &lt;code&gt;kubernetes&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;displayName - the name of the resource prepared for UI display&lt;/li&gt;
&lt;li&gt;hasHealthStatus - a boolean indicating whether the instance has health status&lt;/li&gt;
&lt;li&gt;healthState - the instance&amp;rsquo;s health status, if available&lt;/li&gt;
&lt;li&gt;id - the instance&amp;rsquo;s id&lt;/li&gt;
&lt;li&gt;kind - the kubernetes kind of this resource&lt;/li&gt;
&lt;li&gt;manifest - the kubernetes manifest as JSON object&lt;/li&gt;
&lt;li&gt;name - the resource&amp;rsquo;s name&lt;/li&gt;
&lt;li&gt;namespace - the kubernetes namespace in which this resource resides&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;load-balancers&#34;&gt;Load Balancers&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;account - the spinnaker account for this resource&lt;/li&gt;
&lt;li&gt;apiVersion - the kubernetes apiVersion of this resource&lt;/li&gt;
&lt;li&gt;cloudProvider - this will always be &lt;code&gt;kubernetes&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;detail - the spinnaker detail, if any, for this resource&lt;/li&gt;
&lt;li&gt;displayName - the name of the resource prepared for UI display&lt;/li&gt;
&lt;li&gt;kind - the kubernetes kind of this resource&lt;/li&gt;
&lt;li&gt;manifest - the kubernetes manifest as JSON object&lt;/li&gt;
&lt;li&gt;name - the resource&amp;rsquo;s name&lt;/li&gt;
&lt;li&gt;namespace - the kubernetes namespace in which this resource resides&lt;/li&gt;
&lt;li&gt;stack - the spinnaker stack, if any, for this resource&lt;/li&gt;
&lt;li&gt;type - this resource&amp;rsquo;s spinnaker type&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;security-groups&#34;&gt;Security Groups&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;account - the spinnaker account for this resource&lt;/li&gt;
&lt;li&gt;apiVersion - the kubernetes apiVersion of this resource&lt;/li&gt;
&lt;li&gt;application - the spinnaker application name, if any, for this resource&lt;/li&gt;
&lt;li&gt;cloudProvider - this will always be &lt;code&gt;kubernetes&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;detail - the spinnaker detail, if any, for this resource&lt;/li&gt;
&lt;li&gt;displayName - the name of the resource prepared for UI display&lt;/li&gt;
&lt;li&gt;id - the security group&amp;rsquo;s id&lt;/li&gt;
&lt;li&gt;kind - the kubernetes kind of this resource&lt;/li&gt;
&lt;li&gt;manifest - the kubernetes manifest as JSON object&lt;/li&gt;
&lt;li&gt;name - the resource&amp;rsquo;s name&lt;/li&gt;
&lt;li&gt;namespace - the kubernetes namespace in which this resource resides&lt;/li&gt;
&lt;li&gt;stack - the spinnaker stack, if any, for this resource&lt;/li&gt;
&lt;li&gt;type - this resource&amp;rsquo;s spinnaker type&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;server-groups&#34;&gt;Server Groups&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;account - the spinnaker account for this resource&lt;/li&gt;
&lt;li&gt;apiVersion - the kubernetes apiVersion of this resource&lt;/li&gt;
&lt;li&gt;app - the spinnaker application name, if any, for this resource&lt;/li&gt;
&lt;li&gt;category - the spinnaker category, if any, for this resource&lt;/li&gt;
&lt;li&gt;cloudProvider - this will always be &lt;code&gt;kubernetes&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;cluster - the spinnaker cluster for this resource&lt;/li&gt;
&lt;li&gt;createdTime - the time this resource was created, if available&lt;/li&gt;
&lt;li&gt;detail - the spinnaker detail, if any, for this resource&lt;/li&gt;
&lt;li&gt;disabled - a boolean that is true if this server group is disabled&lt;/li&gt;
&lt;li&gt;disabledDate - a number representing the date this server group was disabled&lt;/li&gt;
&lt;li&gt;displayName - the name of the resource prepared for UI display&lt;/li&gt;
&lt;li&gt;kind - the kubernetes kind of this resource&lt;/li&gt;
&lt;li&gt;manifest - the kubernetes manifest as JSON object&lt;/li&gt;
&lt;li&gt;name - the resource&amp;rsquo;s name&lt;/li&gt;
&lt;li&gt;namespace - the kubernetes namespace in which this resource resides&lt;/li&gt;
&lt;li&gt;region - the region this server group is in&lt;/li&gt;
&lt;li&gt;stack - the spinnaker stack, if any, for this resource&lt;/li&gt;
&lt;li&gt;type - this resource&amp;rsquo;s spinnaker type&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;server-group-managers&#34;&gt;Server Group Managers&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;account - the spinnaker account for this resource&lt;/li&gt;
&lt;li&gt;apiVersion - the kubernetes apiVersion of this resource&lt;/li&gt;
&lt;li&gt;cloudProvider - this will always be &lt;code&gt;kubernetes&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;displayName - the name of the resource prepared for UI display&lt;/li&gt;
&lt;li&gt;kind - the kubernetes kind of this resource&lt;/li&gt;
&lt;li&gt;manifest - the kubernetes manifest as JSON object&lt;/li&gt;
&lt;li&gt;name - the resource&amp;rsquo;s name&lt;/li&gt;
&lt;li&gt;namespace - the kubernetes namespace in which this resource resides&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Configure Automated Rollbacks in the Kubernetes Provider</title>
      <link>/docs/guides/user/kubernetes/automated-rollbacks/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/guides/user/kubernetes/automated-rollbacks/</guid>
      <description>
        
        
        &lt;p&gt;There are clear benefits to having your stored manifests (in Git, GCS, etc&amp;hellip;)
match as closely as possible to what&amp;rsquo;s running in your cluster: you have
auditability, versioned changes, and a high confidence in what code you have
running. However, in some cases, pushing changes from someplace like GitHub
through your build system all the way to production can simply take too long, and
an escape hatch is needed when something has gone seriously wrong. Automated
rollback is that escape hatch.&lt;/p&gt;
&lt;p&gt;When using a Deployment object, you can see the history of rollouts in the
&amp;ldquo;Clusters&amp;rdquo; tab:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./revisions.png&#34;
         alt=&#34;Version 4 is active, and version 3 has no pods running.&#34;/&gt;&lt;figcaption&gt;
            &lt;p&gt;Version 4 is active, and version 3 has no pods running.&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Spinnaker exposes &amp;ldquo;Undo Rollout&amp;rdquo; functionality in two places, in the 
&lt;a href=&#34;#ad-hoc-rollbacks&#34;&gt;Clusters
tab&lt;/a&gt;
, and as a 
&lt;a href=&#34;#automated-rollbacks&#34;&gt;pipeline stage&lt;/a&gt;
.&lt;/p&gt;
&lt;h2 id=&#34;ad-hoc-rollbacks&#34;&gt;Ad-hoc rollbacks&lt;/h2&gt;
&lt;p&gt;In cases where you see something is immediately wrong and isolated to a
resource in the &amp;ldquo;Clusters&amp;rdquo; tab, you can select &amp;ldquo;Undo Rollout&amp;rdquo; from the
&amp;ldquo;Actions&amp;rdquo; dropdown:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./dropdown.png&#34;/&gt;
&lt;/figure&gt;

&lt;p&gt;And select the healthy revision to make active again:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./adhoc.png&#34;/&gt;
&lt;/figure&gt;

&lt;p&gt;Notice that the old configuration (version 3) will be rolled forward into a
new version (version 5):&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./v005.png&#34;/&gt;
&lt;/figure&gt;

&lt;h2 id=&#34;automated-rollbacks&#34;&gt;Automated rollbacks&lt;/h2&gt;
&lt;p&gt;You can also configure automated rollbacks inside of Spinnaker pipelines. These
stages are best configured to run when other stages or branches fail,
indicating that something has gone wrong in your rollout.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;rollback-stage.png&#34;/&gt;
&lt;/figure&gt;

&lt;p&gt;One parameter to watch out for is &lt;strong&gt;Revisions Back&lt;/strong&gt;, which counts how many
revisions the current active revision should be rolled back by. If you have the
following state:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;nginx-deployment-2d8178b77 (Revision 5) # active
nginx-deployment-7bdd110f7 (Revision 4)
nginx-deployment-0b13cc8c1 (Revision 1)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;And roll back by &amp;ldquo;1&amp;rdquo; revision, (Revision 4) will be active again. Roll back by
&amp;ldquo;2&amp;rdquo; revisions and (Revision 1) will be active again.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Keep in mind that Kubernetes will implicitly rollforward the old
configuration, creating (Revision 6) in both cases.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;parameterized-rollbacks&#34;&gt;Parameterized rollbacks&lt;/h3&gt;
&lt;p&gt;It&amp;rsquo;s worth mentioning that you can parameterize the target resource to
roll back. It can point to something specified using pipeline parameters, and
upstream deploy stage, or another stage&amp;rsquo;s outputs. See more details in the

&lt;a href=&#34;/docs/guides/user/pipeline/expressions&#34;&gt;pipeline expressions guide&lt;/a&gt;
.&lt;/p&gt;
&lt;h2 id=&#34;pitfalls&#34;&gt;Pitfalls&lt;/h2&gt;
&lt;p&gt;If the artifacts deployed in your manifest (Docker image, ConfigMap, Secret,
&amp;hellip;) are not versioned, rolling back your manifest will likely not roll back
your code or config changes. See more details

&lt;a href=&#34;/docs/guides/user/kubernetes/best-practices#version-your-configmaps-and-secrets&#34;&gt;here&lt;/a&gt;
.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Best Practices for the Kubernetes Provider</title>
      <link>/docs/guides/user/kubernetes/best-practices/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/guides/user/kubernetes/best-practices/</guid>
      <description>
        
        
        &lt;p&gt;The Kubernetes provider enables a wide variety of ways to deploy your
manifests into Kubernetes clusters. This page provides best-practices for doing
so.&lt;/p&gt;
&lt;h2 id=&#34;deploy-docker-images-by-digest&#34;&gt;Deploy Docker images by digest&lt;/h2&gt;
&lt;p&gt;If your registry exposes image changes by

&lt;a href=&#34;https://docs.docker.com/registry/spec/api/#content-digests&#34; target=&#34;_blank&#34;&gt;digest&lt;/a&gt;
, we
recommend deploying images by their digest rather than tag, e.g.
&lt;code&gt;gcr.io/my-image@sha256:95ff090...&lt;/code&gt; rather than &lt;code&gt;gcr.io/my-image:v1&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The digest is a content-addressable way to reference
your image, because it&amp;rsquo;s derived from the hash of the image contents. If your
manifest points to an image by its digest, you know that each time it&amp;rsquo;s
deployed it points to the same contents (binary, dependencies, config,
etc&amp;hellip;). If you rely on the tag, deploying the same
Manifest twice can have different results.&lt;/p&gt;
&lt;p&gt;There are two ways to achieve this in Spinnaker:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Templatize your manifests outside of Spinnaker to point to the digest you want
to deploy. This means using some
templating language (
&lt;a href=&#34;http://jsonnet.org/&#34; target=&#34;_blank&#34;&gt;jsonnet&lt;/a&gt;
,

&lt;a href=&#34;http://jinja.pocoo.org/&#34; target=&#34;_blank&#34;&gt;jinja&lt;/a&gt;
) to express &amp;amp; render your manifests
&lt;em&gt;before&lt;/em&gt; sending them to Spinnaker to deploy.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Rely on Spinnaker&amp;rsquo;s 
&lt;a href=&#34;/docs/guides/user/kubernetes/deploy-manifest/#override-artifacts&#34;&gt;artifact substitution&lt;/a&gt;

and a trigger that supplies your image by digest.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;emit-your-deployed-manifests-to-an-audit-log&#34;&gt;Emit your deployed manifests to an audit log&lt;/h2&gt;
&lt;p&gt;To keep track of what&amp;rsquo;s changing in your cluster, and under what circumstances
it is changing, we highly recommend 
&lt;a href=&#34;https://blog.spinnaker.io/spinnaker-echo-google-cloud-functions-stackdriver-logging-spinnaker-audit-log-81139f084db9&#34; target=&#34;_blank&#34;&gt;configuring Spinnaker to emit events to an
external audit
log&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;Spinnaker already generates events for any events running through its
orchestration engine, all that&amp;rsquo;s needed is an endpoint to send them to.  When
set up, any pipeline that deploys or updates a manifest will have your fully
hydrated manifest recorded.&lt;/p&gt;
&lt;h2 id=&#34;version-your-configmaps-and-secrets&#34;&gt;Version your ConfigMaps and Secrets&lt;/h2&gt;
&lt;p&gt;Anytime Spinnaker deploys a ConfigMap or Secret, it appends a version to
its name. If that exact ConfigMap or secret is already running in the cluster,
it&amp;rsquo;s not redeployed. Downstream stages that reference the ConfigMap or
secret will deploy the version chosen by Spinnaker. &lt;strong&gt;Unless your application
requires hot-reloading of configuration, this is essential for practicing
safe delivery&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s go through two examples:&lt;/p&gt;
&lt;h3 id=&#34;you-want-to-slowly-roll-out-a-configuration-change&#34;&gt;You want to slowly roll out a configuration change&lt;/h3&gt;
&lt;p&gt;Say you are rolling out a new feature, hidden behind a feature-flag. All
that&amp;rsquo;s needed is an update to a ConfigMap referenced by a Deployment.&lt;/p&gt;
&lt;p&gt;If your Deployment has mounted this ConfigMap, pushing a change to it
immediately allows all Pods to read the update, rendering any sort of rollout
useless. This happens even if the Deployment rolls out another
configuration change using the typical Rolling Update policy.&lt;/p&gt;
&lt;p&gt;If instead you push a new ConfigMap, and edit the Deployment to
reflect this change, only the newly deployed Pods will have your feature flag
enabled.&lt;/p&gt;
&lt;h3 id=&#34;you-need-to-roll-back-a-broken-configuration-change&#34;&gt;You need to roll back a broken configuration change&lt;/h3&gt;
&lt;p&gt;With an unversioned ConfigMap, the &amp;ldquo;Rollback&amp;rdquo; feature on Deployments,
StatefulSets, and DaemonSets does not have the desired effect, because a material
change to a ConfigMap referenced by a Pod in these controllers does not show up
in your PodSpec, only the ConfigMap&amp;rsquo;s &lt;code&gt;data&lt;/code&gt; section. In this case, the
only option is to &amp;ldquo;Roll forward&amp;rdquo; by pushing an update to your ConfigMap, and
any (potentially related) changes to controllers depending on your ConfigMap.
However, this approach can have a few problems:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Every Pod reading that ConfigMap is rolled forward to the old
configuration at once, even ones belonging to controllers that aren&amp;rsquo;t
necessarily broken.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If the broken controller was rolled out with a dependent binary change,
rolling forward the config at the same time can exacerbate the problem in the
current broken controller until the rollout completes.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;avoid-using-the-ad-hoc-edit-features-when-possible&#34;&gt;Avoid using the ad-hoc &amp;ldquo;edit&amp;rdquo; features when possible&lt;/h2&gt;
&lt;p&gt;Spinnaker provides quick ways to edit your deployed Manifests in the
infrastructure screen. This is done to provide you a quick fallback when
mitigating a broken rollout, or to increase the number of pods serving traffic.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./edit.png&#34;/&gt;
&lt;/figure&gt;

&lt;p&gt;However, as long as your manifests are stored either in an external store, or
in Spinnaker pipelines, these edits are overwritten the next time you deploy
your manifests. For this reason, any edits that can be made in your stored
manifests should be made there and redeployed.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Deploy Helm Charts</title>
      <link>/docs/guides/user/kubernetes/deploy-helm/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/guides/user/kubernetes/deploy-helm/</guid>
      <description>
        
        
        &lt;p&gt;Spinnaker surfaces a &lt;strong&gt;Bake (Manifest)&lt;/strong&gt; stage to turn templates into manifests
with the help of a templating engine. 
&lt;a href=&#34;https://helm.sh/&#34; target=&#34;_blank&#34;&gt;Helm&lt;/a&gt;
 relies on the &lt;code&gt;helm template&lt;/code&gt; command.
For more details, see &lt;code&gt;helm template --help&lt;/code&gt;.&lt;/p&gt;


&lt;div class=&#34;alert alert-warning&#34; role=&#34;alert&#34;&gt;

&lt;blockquote&gt;
&lt;p&gt;This stage is intended to help you package and deploy applications that you own, one that are actively developing and redeploying frequently. It is not intended to serve as a one-time installation method for third-party packages. If that is your goal, it&amp;rsquo;s better to call &lt;code&gt;helm install&lt;/code&gt; once when bootstrapping your Kubernetes cluster.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Make sure that you have configured 
&lt;a href=&#34;/docs/setup/other_config/artifacts/&#34;&gt;artifact support&lt;/a&gt;
 in Spinnaker first. All Helm charts are fetched/stored as artifacts in Spinnaker. Read more in the 
&lt;a href=&#34;/docs/reference/artifacts&#34;&gt;reference pages&lt;/a&gt;
.&lt;/p&gt;

&lt;/div&gt;

&lt;h2 id=&#34;configure-the-bake-manifest-stage&#34;&gt;Configure the Bake (Manifest) stage&lt;/h2&gt;
&lt;p&gt;When configuring the &lt;strong&gt;Bake (Manifest)&lt;/strong&gt; stage using a Helm (Helm 2 or Helm 3) render engine, you can specify the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The release name&lt;/strong&gt; (required)&lt;/p&gt;
&lt;p&gt;The Helm release name for this chart. This determines the name of the artifact produced by this stage.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note&lt;/em&gt;: this name overrides any changes you make to the name in the Produces Artifacts section.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The template artifact&lt;/strong&gt; (required)&lt;/p&gt;
&lt;p&gt;The Helm chart that you deploy, stored remotely as a &lt;code&gt;.tar.gz&lt;/code&gt; archive. You can produce this by running &lt;code&gt;helm package /path/to/chart&lt;/code&gt;. For more details, &lt;code&gt;helm package --help&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;configure-api-versions-and-a-kubernetes-version&#34;&gt;Configure API versions and a Kubernetes version&lt;/h3&gt;
&lt;p&gt;To begin, you must set &lt;code&gt;API_VERSIONS_ENABLED&lt;/code&gt; to &lt;code&gt;true&lt;/code&gt;. This is an essential Deck environment variable that enables the functionality necessary to work with API versions and a Kubernetes version in your CD pipeline.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The capabilities apiVersions&lt;/strong&gt; (optional)&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;apiVersions&lt;/code&gt; field in the &lt;code&gt;Capabilities&lt;/code&gt; object represents a set of API versions that are dependent
on the Kubernetes version. You can pass these API versions as an argument to the &lt;code&gt;--api-versions&lt;/code&gt; parameter in the &lt;code&gt;helm template&lt;/code&gt; command.
This enables you to specify which Kubernetes API versions should be used when rendering your Helm templates.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The release kubeVersion&lt;/strong&gt; (optional)&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;kubeVersion&lt;/code&gt; field in the &lt;code&gt;Capabilities&lt;/code&gt; object signifies the Kubernetes version itself. You can pass this Kubernetes version as argument to the &lt;code&gt;--kube-version&lt;/code&gt; parameter in the &lt;code&gt;helm template&lt;/code&gt; command. It specifies the exact Kubernetes version you want to use when rendering your Helm templates.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Not all Helm charts contain apiVersions and kubeVersion definitions in their manifests. Make sure that your manifests contain the following code:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;apiVersions&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;{{&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;.Capabilities.ApiVersions }}&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;kubeVersion&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;{{&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;.Capabilities.KubeVersion }}&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In this example, you have a fully configured &lt;strong&gt;Bake (Manifest)&lt;/strong&gt; stage, including the &lt;strong&gt;ApiVersions&lt;/strong&gt; and &lt;strong&gt;KubeVersion&lt;/strong&gt; fields:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;api-versions.png&#34;/&gt;
   &lt;/figure&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The release namespace&lt;/strong&gt; (optional)&lt;/p&gt;
&lt;p&gt;The Kubernetes namespace to install release into. If parameter is not specified, Spinnaker uses the default namespace.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Not all Helm charts contain namespace definitions in their manifests. Make sure that your manifests contain the following code:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;metadata&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;namespace&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;{{&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;.Release.Namespace }}&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Helm chart file path&lt;/strong&gt; (optional)&lt;/p&gt;
&lt;p&gt;Helm chart file path is only relevant (and visible) when the template artifact is a git/repo artifact.  It specifies the directory path to Chart.yaml in the git repo. If absent, Spinnaker looks for Chart.yaml in the root directory of the git repo.&lt;/p&gt;
&lt;p&gt;Given: A git repo where your &lt;code&gt;Chart.yaml&lt;/code&gt; is in: &lt;code&gt;sub/folder/Chart.yml&lt;/code&gt; &lt;br&gt;
Then: &lt;code&gt;helmChartFilePath: &amp;quot;sub/folder/&amp;quot;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Leading slashes do not work in &lt;code&gt;helmChartFilePath&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Zero or more override artifacts&lt;/strong&gt; (optional)&lt;/p&gt;
&lt;p&gt;The files passed to &lt;code&gt;--values&lt;/code&gt; parameter in the &lt;code&gt;helm template&lt;/code&gt; command. Each is a remotely stored artifact representing a 
&lt;a href=&#34;https://helm.sh/docs/chart_template_guide/values_files/&#34; target=&#34;_blank&#34;&gt;Helm Value  File&lt;/a&gt;
.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Statically specified overrides&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The set of static key/value pairs that are passed as &lt;code&gt;--set&lt;/code&gt; parameters to the &lt;code&gt;helm template&lt;/code&gt; command.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;configuration-example&#34;&gt;Configuration example&lt;/h3&gt;
&lt;p&gt;In this example, you have a fully configured &lt;strong&gt;Bake (Manifest)&lt;/strong&gt; stage:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./bake-manifest-stage.png&#34;/&gt;
&lt;/figure&gt;

&lt;p&gt;Notice that in the &lt;strong&gt;Produces Artifacts&lt;/strong&gt; section, Spinnaker has automatically created an &lt;code&gt;embedded/base64&lt;/code&gt; artifact that is bound when the stage completes, representing the fully baked manifest set to be deployed downstream.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./produces.png&#34;/&gt;
&lt;/figure&gt;

&lt;p&gt;If you are programatically generating stages, here is the JSON representation of the same stage:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;bakeManifest&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;templateRenderer&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;HELM2&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Bake nginx helm template&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;outputName&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;nginx&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;inputArtifacts&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;account&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;gcs&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;template-id&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;account&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;gcs&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;value-id&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;overrides&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;replicas&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;3&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;expectedArtifacts&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;defaultArtifact&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;baked-template&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;matchArtifact&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;kind&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;base64&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;nginx&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;embedded/base64&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;useDefaultArtifact&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;helmfile&#34;&gt;Helmfile&lt;/h3&gt;
&lt;p&gt;In addition to standard Helm deployments, Spinnaker supports 
&lt;a href=&#34;https://helmfile.readthedocs.io/&#34; target=&#34;_blank&#34;&gt;Helmfile&lt;/a&gt;
 as a templating engine. You can find the supported version in 
&lt;a href=&#34;https://github.com/spinnaker/rosco/blob/master/Dockerfile.slim#L7&#34; target=&#34;_blank&#34;&gt;Rosco&amp;amp;rsquo;s Dockerfile&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;Configuring a Helmfile deployment follows the specification for standard helm chart deployments (defined above) with one exception - &lt;code&gt;helmChartFilePath&lt;/code&gt; is substituted for &lt;code&gt;helmfileFilePath&lt;/code&gt; and is specified as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;helmfile file path (optional)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;helmfile&lt;/code&gt; file path is only relevant (and visible) when the template artifact is a git/repo artifact. It specifies the directory path to helmfile.yaml in the git repo. If absent, spinnaker looks for helmfile.yaml in the root directory of the git repo.&lt;/p&gt;
&lt;p&gt;Given: A git repo where your &lt;code&gt;helmfile.yaml&lt;/code&gt; is in: &lt;code&gt;sub/folder/helmfile.yml&lt;/code&gt; &lt;br&gt;
Then: &lt;code&gt;helmfileFilePath: &amp;quot;sub/folder/&amp;quot;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Note: Leading slashes do not work in &lt;code&gt;helmfileFilePath&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;configure-a-downstream-deployment&#34;&gt;Configure a downstream deployment&lt;/h2&gt;
&lt;p&gt;Now that your manifest set has been baked by Helm, configure a downstream stage
(in the same pipeline or in one triggered by this pipeline) your &lt;strong&gt;Deploy (Manifest)&lt;/strong&gt; stage to deploy the artifact produced by the &lt;strong&gt;Bake (Manifest)&lt;/strong&gt; stage:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./expected-artifact.png&#34;/&gt;
&lt;/figure&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: Make sure to select &amp;ldquo;embedded-artifact&amp;rdquo; as the artifact account for
your base64 manifest set. This is required to translate the manifest set into
the format required by the deploy stage.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;When this stage runs, you can see every resource in your Helm chart get deployed at once:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./result.png&#34;/&gt;
&lt;/figure&gt;

&lt;h2 id=&#34;other-templating-engines&#34;&gt;Other Templating Engines&lt;/h2&gt;
&lt;p&gt;In addition to Helm, Spinnaker also supports Kustomize as a templating engine. For more information, see 
&lt;a href=&#34;/docs/guides/user/kubernetes/kustomize-manifests/&#34;&gt;Using Kustomize for Manifests&lt;/a&gt;
.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Deploy Kubernetes Manifests</title>
      <link>/docs/guides/user/kubernetes/deploy-manifest/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/guides/user/kubernetes/deploy-manifest/</guid>
      <description>
        
        
        &lt;p&gt;This guide shows the basics of how to deploy a Kubernetes manifest using the

&lt;a href=&#34;/docs/setup/install/providers/kubernetes&#34;&gt;Kubernetes provider&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;There are two main steps:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
&lt;a href=&#34;#specify-your-manifest&#34;&gt;Specify which manifest to deploy&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;This is required.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
&lt;a href=&#34;#override-artifacts&#34;&gt;Override artifacts in the manifest&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Optionally, you can override some artifacts (as fields) at run time (for
example, which Docker image to use.)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;specify-your-manifest&#34;&gt;Specify your manifest&lt;/h2&gt;
&lt;p&gt;Depending on your needs, there is more than one way to specify the manifest
that you want to deploy:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href=&#34;#specify-your-manifest&#34;&gt;Specify your manifest&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href=&#34;#specify-manifests-statically&#34;&gt;Specify manifests statically&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href=&#34;#specify-manifests-dynamically&#34;&gt;Specify manifests dynamically&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href=&#34;#override-artifacts&#34;&gt;Override artifacts&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In either case, start by selecting the &lt;strong&gt;Deploy (Manifest)&lt;/strong&gt; stage
from the stage selector:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./deploy-manifest.png&#34;/&gt;
&lt;/figure&gt;

&lt;blockquote&gt;
&lt;p&gt;Don&amp;rsquo;t select the regular &lt;strong&gt;Deploy&lt;/strong&gt; stage; it deploys more opinionated &amp;ldquo;Server Groups&amp;rdquo; using other providers.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;specify-manifests-statically&#34;&gt;Specify manifests statically&lt;/h3&gt;
&lt;p&gt;If you know ahead of time what you expect to deploy using a certain manifest
(even if you don&amp;rsquo;t know what version of your Docker image it will run), you can
declare it directly in the pipeline by providing the manifest specification:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./in-pipeline.png&#34;
         alt=&#34;Notice that by selecting Text as the Manifest Source, we get to enter the manifest YAML by hand.&#34;/&gt;&lt;figcaption&gt;
            &lt;p&gt;Notice that by selecting &lt;strong&gt;Text&lt;/strong&gt; as the &lt;strong&gt;Manifest Source&lt;/strong&gt;, we get to enter the manifest YAML by hand.&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;If you are &lt;em&gt;generating&lt;/em&gt; your pipeline definitions rather than entering
them into the UI, the stage definition would look more like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Deploy my manifest&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;   &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// human-readable name
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;deployManifest&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;       &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// tells orchestration engine what to run
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;account&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;nudge&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;             &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// account (k8s cluster) to deploy to
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;cloudProvider&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;kubernetes&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;source&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;manifest&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                  &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// manifest contents go here
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;specify-manifests-dynamically&#34;&gt;Specify manifests dynamically&lt;/h3&gt;
&lt;p&gt;If you are storing your manifests outside of Spinnaker&amp;rsquo;s

&lt;a href=&#34;/docs/setup/install/storage/&#34;&gt;pipeline repository&lt;/a&gt;
,
or want a single deploy stage to deploy a variety of manifests, you
can specify your manifest using an 
&lt;a href=&#34;/docs/reference/artifacts&#34;&gt;Artifact&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;The idea is: artifacts in Spinnaker allow you to reference remote, deployable
resources. When referencing an artifact from a Deploy Manifest stage , that
artifact must be a text file containing the Manifest specification.
This can be stored in GitHub or an object store (like GCS).&lt;/p&gt;
&lt;p&gt;Changes to manifests can trigger pipelines. For more information:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href=&#34;/docs/guides/user/pipeline/triggers/github&#34;&gt;Consuming GitHub Artifacts&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href=&#34;/docs/guides/user/pipeline/triggers/gcs&#34;&gt;Consuming GCS Artifacts&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Assuming you have declared an expected artifact upstream to your Deploy
manifest stage, you can reference it in the Deploy configuration:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./in-artifact.png&#34;
         alt=&#34;Notice that by selecting Artifact as the Manifest Source, we get to pick which upstream artifact to deploy.&#34;/&gt;&lt;figcaption&gt;
            &lt;p&gt;Notice that by selecting &lt;strong&gt;Artifact&lt;/strong&gt; as the &lt;strong&gt;Manifest Source&lt;/strong&gt;, we get to pick which upstream artifact to deploy.&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Make sure that the &lt;strong&gt;Artifact Account&lt;/strong&gt; field matches an account
with permission to download the manifest.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Keep in mind that the artifact bound in the upstream stage can match multiple
incoming artifacts. If instead we had configured it to listen to changes using
a regex matching &lt;code&gt;.*\.yml&lt;/code&gt;, it would bind any YAML file that changes in your
artifact source, and deploy it when it reaches your Deploy stage.&lt;/p&gt;
&lt;h2 id=&#34;override-artifacts&#34;&gt;Override artifacts&lt;/h2&gt;
&lt;p&gt;In general, when we deploy changes to our infrastructure, the majority of
changes come in the form of a new Docker image, or perhaps a feature-flag
change in a ConfigMap. For this reason, we have first-class mechanisms for
easily overriding the version of&amp;hellip;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Docker image&lt;/li&gt;
&lt;li&gt;Kubernetes ConfigMap&lt;/li&gt;
&lt;li&gt;Kubernetes Secret&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When one of these objects exists in the pipeline context from an upstream stage,
Spinnaker 
&lt;a href=&#34;/docs/reference/artifacts/in-kubernetes/#binding-artifacts-in-manifests&#34;&gt;automatically tries to inject it&lt;/a&gt;

into the manifest you&amp;rsquo;re deploying.&lt;/p&gt;
&lt;p&gt;For example, say you trigger your pipeline using a webhook coming
from a Docker registry. At a high level, the event says &amp;ldquo;Image
&lt;code&gt;gcr.io/my-project/my-image&lt;/code&gt; has a new digest &lt;code&gt;sha256:c81e41ef5e...&lt;/code&gt;&amp;rdquo;. In the
pipeline that gets triggered, you&amp;rsquo;ve configured a Deploy Manifest stage with
the following spec:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# ... rest of manifest&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;containers&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;my-container&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;image&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;gcr.io/my-project/my-image&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# rest of manifest ...&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Because the pipeline was triggered by a change to the Docker image, the
orchestration engine send that artifact along with the manifest to
Spinnaker&amp;rsquo;s cloud provider integration service, which, based on the name of the
Docker image, deploys the following:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# ... rest of manifest&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;containers&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;my-container&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;image&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;gcr.io/my-project/my-image@:sha256:c81e41ef5e...&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# rest of manifest ...&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To ensure that the correct artifacts get bound, you can force the
stage to either bind all required artifacts, or fail before deploying. Here&amp;rsquo;s an
example where we specify that the docker image
&lt;code&gt;gcr.io/my-project/my-image&lt;/code&gt; must be bound in the manifest, otherwise the stage
fails:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./required-artifacts.png&#34;
         alt=&#34;Keep in mind that even if you don&amp;amp;rsquo;t specify an artifact as required, it can still be bound in the manifest. This is just to ensure that all artifacts you expect will be bound.&#34;/&gt;&lt;figcaption&gt;
            &lt;p&gt;Keep in mind that even if you don&amp;rsquo;t specify an artifact as required, it can still be bound in the manifest. This is just to ensure that all artifacts you expect will be bound.&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;


      </description>
    </item>
    
    <item>
      <title>Docs: Manage Traffic Using Kubernetes Manifests</title>
      <link>/docs/guides/user/kubernetes/traffic-management/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/guides/user/kubernetes/traffic-management/</guid>
      <description>
        
        
        &lt;p&gt;This guide shows the basics of how to manage traffic during deployments
using the 
&lt;a href=&#34;/docs/setup/install/providers/kubernetes&#34;&gt;Kubernetes provider&lt;/a&gt;
.
This includes automatically attaching a

&lt;a href=&#34;https://kubernetes.io/docs/concepts/services-networking/service/&#34; target=&#34;_blank&#34;&gt;Service&lt;/a&gt;

to a workload during deployment, and defining pipelines to perform blue/green
deployments.&lt;/p&gt;
&lt;h2 id=&#34;attach-a-service-to-a-workload&#34;&gt;Attach a Service to a Workload&lt;/h2&gt;
&lt;p&gt;Kubernetes manages the relationship between

&lt;a href=&#34;https://kubernetes.io/docs/concepts/workloads/pods/pod/&#34; target=&#34;_blank&#34;&gt;Pods&lt;/a&gt;
 and

&lt;a href=&#34;https://kubernetes.io/docs/concepts/services-networking/service/&#34; target=&#34;_blank&#34;&gt;Services&lt;/a&gt;

using 
&lt;a href=&#34;https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/&#34; target=&#34;_blank&#34;&gt;Labels and
Selectors&lt;/a&gt;
.
Spinnaker acknowledges this relationship with the blue load balancer icon
on a workload as shown here:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./lb.png&#34;/&gt;
&lt;/figure&gt;

&lt;p&gt;You can also tell Spinnaker which Service objects a workload should be
associated with for its lifetime using the

&lt;a href=&#34;/docs/reference/providers/kubernetes/#traffic&#34;&gt;&amp;lt;code&amp;gt;traffic.spinnaker.io/load-balancers&amp;lt;/code&amp;gt;&lt;/a&gt;

annotation. To try this out, do the following:&lt;/p&gt;
&lt;p&gt;Deploy the following Service using the &amp;ldquo;Create Load Balancer&amp;rdquo; button:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;kind&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Service&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;v1&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;metadata&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;my-service&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;spec&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;selector&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;app&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;myapp&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;ports&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;protocol&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;TCP&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;port&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;80&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figure&gt;&lt;img src=&#34;./create-lb.png&#34;/&gt;
&lt;/figure&gt;

&lt;p&gt;And then deploy the following Replica Set using the &amp;ldquo;Create Server Group&amp;rdquo;
button:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;apps/v1&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;kind&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;ReplicaSet&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;metadata&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;frontend&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;labels&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;tier&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;frontend&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;annotations&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;traffic.spinnaker.io/load-balancers&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;[&amp;#34;service my-service&amp;#34;]&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# &amp;lt;-- annotation&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;spec&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;replicas&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;selector&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;matchLabels&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;tier&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;frontend&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;template&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;metadata&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;labels&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;tier&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;frontend&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;spec&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;containers&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;frontend&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;image&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;us-docker.pkg.dev/google-samples/containers/gke/gb-frontend:v5&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figure&gt;&lt;img src=&#34;&#34;/&gt;
&lt;/figure&gt;

&lt;p&gt;Notice that the selector &lt;code&gt;app: myapp&lt;/code&gt; appearing on the Service did not have to
be specified on the Replica Set&amp;rsquo;s PodSpec; Spinnaker adds this automatically.&lt;/p&gt;
&lt;h3 id=&#34;caveats&#34;&gt;Caveats&lt;/h3&gt;
&lt;p&gt;There are a few caveats when using this annotation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The list of Services supplied in this annotation does &lt;em&gt;not&lt;/em&gt; need to specify
all Services a workload may be attached to. If your workload&amp;rsquo;s labels already
attach it Service A, and you list Service B in the annotation, both Service A
and B will route requests to this workload.&lt;/p&gt;
&lt;p&gt;You can think of this annotation as only supplying the list of &lt;em&gt;additional&lt;/em&gt;
services to attach to, not as an exhaustive list.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you use this annotation, Spinnaker will edit the workload&amp;rsquo;s labels, either
in the &lt;code&gt;metadata.labels&lt;/code&gt;, or &lt;code&gt;spec.template.metadata.labels&lt;/code&gt; sections. As a
result, if the labels added to or removed from the
&lt;code&gt;spec.template.metadata.labels&lt;/code&gt; conflict with the label requirements in the
object&amp;rsquo;s &lt;code&gt;spec.selector.match[Labels/Expressions]&lt;/code&gt; section, the deployment
will fail.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This annotation tells Spinnaker which service or services to make traffic
changes to. For example, if you specify service &amp;ldquo;A&amp;rdquo; in the annotation of a
manifest and subsequently disable it, only traffic from service &amp;ldquo;A&amp;rdquo; will be
disabled, even if you receive traffic from both services &amp;ldquo;A&amp;rdquo; and &amp;ldquo;B&amp;rdquo;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;route-traffic-during-a-deployment-bluegreen&#34;&gt;Route Traffic During a Deployment (Blue/Green)&lt;/h2&gt;
&lt;p&gt;Spinnaker supports dynamically enabling and disabling traffic to a particular
Kubernetes resource. This can be used in a pipeline to configure Blue/Green
rollouts, as shown below.&lt;/p&gt;
&lt;h3 id=&#34;you-must-use-replica-sets&#34;&gt;You Must Use Replica Sets&lt;/h3&gt;
&lt;p&gt;Spinnaker manages traffic using labels, and has to edit them on running
resources. Given that edits to Deployment objects trigger rollouts, the only
way to carry out Blue/Green deployments without editing the Service object
directly is using Replica Sets, which are safely edited in-place by Spinnaker.
To be clear, these label edits are abstracted into higher-level &amp;ldquo;Enable&amp;rdquo; and
&amp;ldquo;Disable&amp;rdquo; stages to manage traffic, and are described below.&lt;/p&gt;
&lt;p&gt;In turn, when a user submits a change to a Replica Set (either ad-hoc, or using
a pipeline) to update an image, configuration, etc&amp;hellip; Spinnaker makes sure to
deploy a new Replica Set with a unique &lt;code&gt;-vNNN&lt;/code&gt; suffix. This is in contrast with
the edits to labels Spinnaker performs &lt;em&gt;in place&lt;/em&gt; to manage traffic. The
interaction between edits to Replica Sets made by users and those made by
Spinnaker will be made clear in the below sample pipeline walkthrough.&lt;/p&gt;
&lt;h3 id=&#34;sample-bluegreen-pipeline&#34;&gt;Sample Blue/Green Pipeline&lt;/h3&gt;
&lt;p&gt;We will create a pipeline with two stages: Deploy, and Disable. The goal is to
first deploy a new version of your application, have the stage wait until all
Pods&amp;rsquo; health checks pass, and then disable the prior version of your
application. When completed, an execution of this pipeline will look like:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./run.png&#34;/&gt;
&lt;/figure&gt;

&lt;h4 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h4&gt;
&lt;p&gt;You need the following:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Spinnaker with the 
&lt;a href=&#34;/docs/setup/install/providers/kubernetes&#34;&gt;Kubernetes provider&lt;/a&gt;
 configured&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;One service called &lt;code&gt;my-service&lt;/code&gt; running in the cluster and namespace your
pipeline will deploy to. For the purpose of this example we will assume it
has the following specification:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;kind&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Service&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;v1&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;metadata&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;my-service&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;spec&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;selector&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;frontedBy&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;my-service&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# will be applied to backends by Spinnaker&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;ports&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;protocol&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;TCP&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;port&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;80&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;configure-the-deploy-stage&#34;&gt;Configure the Deploy Stage&lt;/h4&gt;
&lt;p&gt;Create a pipeline and add a &amp;ldquo;Deploy (Manifest)&amp;rdquo; stage, and configure the
following (text) manifest to deploy:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;apps/v1&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;kind&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;ReplicaSet&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;metadata&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;annotations&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;strategy.spinnaker.io/max-version-history&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;2&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;traffic.spinnaker.io/load-balancers&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;[&amp;#34;service my-service&amp;#34;]&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;labels&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;app&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;myapp&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;myapp-frontend&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;spec&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;replicas&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;selector&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;matchLabels&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;app&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;myapp&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;template&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;metadata&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;labels&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;app&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;myapp&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;spec&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;containers&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;        &lt;/span&gt;- &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;image&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;us-docker.pkg.dev/google-samples/containers/gke/gb-frontend:v5&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;          &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;frontend&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The stage configuration should look like this:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./deploy-stage.png&#34;/&gt;
&lt;/figure&gt;

&lt;p&gt;There are &lt;em&gt;two&lt;/em&gt; important annotations to pay attention to here:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;traffic.spinnaker.io/load-balancers&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This annotation is explained 
&lt;a href=&#34;#attach-a-service-to-a-workload&#34;&gt;above&lt;/a&gt;
,
and is used here to both indicate to Spinnaker which Service to attach during
deployment time, and which Service to detach during the disable stage.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;strategy.spinnaker.io/max-version-history&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This annotation is explained 
&lt;a href=&#34;/docs/reference/providers/kubernetes/#strategy&#34;&gt;in the reference
section&lt;/a&gt;
, and is used to ensure
that no more than a certain number of versions of this Replica Set are
running for garbage collection purposes.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;configure-the-disable-stage&#34;&gt;Configure the Disable Stage&lt;/h4&gt;
&lt;p&gt;Add a &amp;ldquo;Disable (Manifest)&amp;rdquo; stage after the Deploy stage, and set the following
values:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Namespace&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;default&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Kind&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;replicaSet&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Selector&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Choose a target dynamically&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cluster&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;replicaSet frontend&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Target&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Second Newest&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The stage configuration should look like this:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./disable.png&#34;/&gt;
&lt;/figure&gt;

&lt;p&gt;There are &lt;em&gt;two&lt;/em&gt; important fields here:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Selector&lt;/strong&gt;: &lt;code&gt;Choose a target dynamically&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;With every run of the pipeline a new Replica Set is created, and therefore we
cannot know ahead of time which version of the Replica Set to disable. This
field allows us to pick a Replica Set based on the &lt;strong&gt;Target&lt;/strong&gt; value.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Target&lt;/strong&gt;: &lt;code&gt;Second Newest&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;By picking the &lt;code&gt;Second Newest&lt;/code&gt; target, we select the second newest Replica
Set when this stage starts, or in other words, what was just previously
serving traffic.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;run-the-pipeline&#34;&gt;Run the Pipeline&lt;/h4&gt;
&lt;p&gt;After a few runs of the pipeline, you should see the following in your cluster
screen:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./end-state.png&#34;/&gt;
&lt;/figure&gt;


      </description>
    </item>
    
    <item>
      <title>Docs: Parameterize Kubernetes Manifests</title>
      <link>/docs/guides/user/kubernetes/parameterize-manifests/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/guides/user/kubernetes/parameterize-manifests/</guid>
      <description>
        
        
        &lt;p&gt;Spinnaker can inject context from the currently executing pipeline into your
manifests as they are deployed, whether they are deployed

&lt;a href=&#34;/docs/guides/user/kubernetes/deploy-manifest/#specify-manifests-statically&#34;&gt;statically&lt;/a&gt;

or

&lt;a href=&#34;/docs/guides/user/kubernetes/deploy-manifest/#specify-manifests-dynamically&#34;&gt;dynamically&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;This can be applied to a wide range of use-cases, but we will focus on using a
pipeline parameter to specify the target namespace.&lt;/p&gt;
&lt;h2 id=&#34;configure-your-pipeline-parameters&#34;&gt;Configure your pipeline parameters&lt;/h2&gt;
&lt;p&gt;First, register a pipeline parameter in the &amp;ldquo;configuration&amp;rdquo; tab of the
pipeline editor (only the &lt;strong&gt;Name&lt;/strong&gt; is required):&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./parameter.png&#34;/&gt;
&lt;/figure&gt;

&lt;blockquote&gt;
&lt;p&gt;See more details on how to provide parameters to pipelines programmatically in
the 
&lt;a href=&#34;/docs/guides/user/pipeline/triggers/webhooks&#34;&gt;webhooks&lt;/a&gt;
 page.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Warning: there are several reserved parameter keys (names) that cause unexpected behavior and failures
if overwritten by a pipeline parameter definition.
See the 
&lt;a href=&#34;/docs/guides/user/pipeline/expressions#list-of-reserved-parameter-and-evaluate-variable-key-names&#34;&gt;list of reserved parameter and evaluate variable key names&lt;/a&gt;
.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;configure-your-manifest&#34;&gt;Configure your manifest&lt;/h2&gt;
&lt;p&gt;In this scenario, we&amp;rsquo;re using a parameter to specify the manifest&amp;rsquo;s namespace.
Edit your manifest so the &lt;code&gt;metadata&lt;/code&gt; section contains:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# ... other keys&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;metadata&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;namespace&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;${ parameters.namespace }&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# other keys ...&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Keep in mind this manifest 
&lt;a href=&#34;/docs/guides/user/kubernetes/deploy-manifest&#34;&gt;can be stored in the pipeline, or in an external
store such as GitHub&lt;/a&gt;
.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;When you go to run the pipeline by hand, you will see the following:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./run.png&#34;/&gt;
&lt;/figure&gt;

&lt;h2 id=&#34;parameterizing-non-string-keys&#34;&gt;Parameterizing non-string keys&lt;/h2&gt;
&lt;p&gt;When parameterizing a YAML value that&amp;rsquo;s not a string (such as the replica
count), you will need to explicitly convert the evaluated expression 
&lt;a href=&#34;/docs/reference/pipeline/expressions/#helper-functions&#34;&gt;to the
correct type&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;If you were expecting the replica count to arrive in parameter &lt;code&gt;replicas&lt;/code&gt;, you
would write:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# ... other keys&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;spec&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;replicas&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;${ #toInt( parameters.replicas ) }&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# other keys ...&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;more-advanced-parameterization&#34;&gt;More advanced parameterization&lt;/h2&gt;
&lt;p&gt;Please read the 
&lt;a href=&#34;/docs/guides/user/pipeline/expressions&#34;&gt;pipeline expressions guide&lt;/a&gt;
.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Patch Kubernetes Manifests</title>
      <link>/docs/guides/user/kubernetes/patch-manifest/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/guides/user/kubernetes/patch-manifest/</guid>
      <description>
        
        
        &lt;p&gt;This guide shows the basics of how to update a Kubernetes resource in place using the patch manifest stage for the 
&lt;a href=&#34;/docs/setup/install/providers/kubernetes&#34;&gt;Kubernetes provider&lt;/a&gt;
 provider.&lt;/p&gt;
&lt;p&gt;There are a few steps:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
&lt;a href=&#34;#specify-the-resource-to-patch&#34;&gt;Specify which manifest to patch&lt;/a&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
&lt;a href=&#34;#specify-your-patch-content&#34;&gt;Specify the patch content&lt;/a&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
&lt;a href=&#34;#override-artifacts&#34;&gt;(Optional) Override artifacts in the patch content&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Optionally, you can override some artifacts (as fields) at run time (for
example, which Docker image to use.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
&lt;a href=&#34;#specify-patch-options&#34;&gt;(Optional) Override patch specific options&lt;/a&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;specify-the-resource-to-patch&#34;&gt;Specify the resource to patch&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Start by selecting the &lt;strong&gt;Patch (Manifest)&lt;/strong&gt; stage from the stage selector:&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;&lt;img src=&#34;./patch-manifest.png&#34;/&gt;
&lt;/figure&gt;

&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;To identify the Kubernetes resource to patch, specify the following required fields:&lt;/li&gt;
&lt;/ol&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Account&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The Spinnaker account that manages the Kubernetes cluster&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Namespace&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The Kubernetes namespace that your resource is located in&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Kind&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The Kubernetes Kind of your resource e.g. deployment, service etc&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Name&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The name of your Kubernetes resource&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;specify-your-patch-content&#34;&gt;Specify your patch content&lt;/h2&gt;
&lt;p&gt;The patch content is similar to a manifest in the Deploy (Manifest) stage. However, unlike the deploy manifest, this does not have to be the full resource manifest but only the portion you want to patch.&lt;/p&gt;
&lt;p&gt;Depending on your needs, there is more than one way to specify the patch content:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href=&#34;#specify-patch-content-statically&#34;&gt;Statically: directly in the pipeline&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href=&#34;#specify-patch-content-dynamically&#34;&gt;Dynamically: bound at runtime using an artifact&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;specify-patch-content-statically&#34;&gt;Specify patch content statically&lt;/h3&gt;
&lt;p&gt;You can enter the patch content YAML by hand. For instance, if you want to patch your manifest to add a new label, you will specify the following:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;metadata&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;labels&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;foo&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;bar&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figure&gt;&lt;img src=&#34;./in-pipeline.png&#34;
         alt=&#34;Notice that by selecting Text as the Manifest Source, we get to enter the manifest YAML by hand.&#34;/&gt;&lt;figcaption&gt;
            &lt;p&gt;Notice that by selecting &lt;strong&gt;Text&lt;/strong&gt; as the &lt;strong&gt;Manifest Source&lt;/strong&gt;, we get to enter the manifest YAML by hand.&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h3 id=&#34;specify-patch-content-dynamically&#34;&gt;Specify patch content dynamically&lt;/h3&gt;
&lt;p&gt;Like the 
&lt;a href=&#34;/docs/guides/user/kubernetes/deploy-manifest#specify-manifests-dynamically&#34;&gt;Deploy (Manifest) stage&lt;/a&gt;
, you can also reference an artifact as the source if you are storing your patch content externally. The artifact must be a text file containing the patch content.&lt;/p&gt;
&lt;p&gt;You can also set up the pipeline to trigger based on changes to the patch content:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href=&#34;/docs/guides/user/pipeline/triggers/github/&#34;&gt;Consuming GitHub Artifacts&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href=&#34;/docs/guides/user/pipeline/triggers/gcs/&#34;&gt;Consuming GCS Artifacts&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Assuming you have declared an expected artifact upstream to your Patch (Manifest) stage, you can reference it in the Patch configuration:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./in-artifact.png&#34;
         alt=&#34;Notice that by selecting Artifact as the Manifest Source, we get to pick which upstream artifact to deploy.&#34;/&gt;&lt;figcaption&gt;
            &lt;p&gt;Notice that by selecting &lt;strong&gt;Artifact&lt;/strong&gt; as the &lt;strong&gt;Manifest Source&lt;/strong&gt;, we get to pick which upstream artifact to deploy.&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Make sure that the &lt;strong&gt;Artifact Account&lt;/strong&gt; field matches an account
with permission to download the manifest.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;override-artifacts&#34;&gt;Override artifacts&lt;/h2&gt;
&lt;p&gt;When patching with a &lt;em&gt;strategic&lt;/em&gt; or &lt;em&gt;merge&lt;/em&gt; strategy, the Patch (Manifest) stage also allows you to 
&lt;a href=&#34;/docs/guides/user/kubernetes/deploy-manifest#override-artifacts&#34;&gt;override artifacts&lt;/a&gt;
 like in the deploy manifest stage.&lt;/p&gt;
&lt;p&gt;For instance, say you have a pipeline with a Patch (Manifest) stage with the following patch content:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;spec&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;template&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;spec&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;containers&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;        &lt;/span&gt;- &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;my-container&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;          &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;image&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;gcr.io/my-project/my-image&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If your pipeline was triggered due to a new Docker image tag being pushed to your Docker registry (say my-image:2.0), Spinnaker will override the version of the container image with the new version:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;#...rest of manifest&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;containers&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;my-container&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;image&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;gcr.io/my-project/my-image:2.0&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For more information on how this works, check out the 
&lt;a href=&#34;/docs/reference/artifacts/in-kubernetes#binding-artifacts-in-manifests&#34;&gt;binding artifacts docs&lt;/a&gt;
.&lt;/p&gt;
&lt;h2 id=&#34;specify-patch-options&#34;&gt;Specify Patch Options&lt;/h2&gt;
&lt;p&gt;You can also specify the following options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Record Patch Annotation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Defaults to true. When selected, the patch operation including the patch content will be recorded on the patched resource as the &lt;code&gt;kubernetes.io/change-cause&lt;/code&gt; annotation. If the annotation already exists, the contents are replaced.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Merge Strategy&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;strategic&lt;/em&gt;: This is the default. It is a 
&lt;a href=&#34;https://github.com/kubernetes/community/blob/master/contributors/devel/sig-api-machinery/strategic-merge-patch.md&#34; target=&#34;_blank&#34;&gt;customized version of JSON merge patch&lt;/a&gt;
 specific to Kubernetes that allows Kubernetes objects to be either replaced or merged based on the object struct tags. It is particularly useful when you want to add a new item to a list (e.g. a new annotation, label, or even a new container to a pod spec) instead of replacing the list.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;json&lt;/em&gt;: This will patch the manifest using a standard 
&lt;a href=&#34;https://tools.ietf.org/html/rfc6902&#34; target=&#34;_blank&#34;&gt;RFC 6902 JSON patch&lt;/a&gt;
.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;merge&lt;/em&gt;: This will patch the manifest using 
&lt;a href=&#34;https://tools.ietf.org/html/rfc7386&#34; target=&#34;_blank&#34;&gt;RFC 7386 JSON Merge Patch&lt;/a&gt;
.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Rollout Strategies</title>
      <link>/docs/guides/user/kubernetes/rollout-strategies/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/guides/user/kubernetes/rollout-strategies/</guid>
      <description>
        
        
        &lt;p&gt;This guide describes how to take advantage of the

&lt;a href=&#34;/docs/setup/install/providers/kubernetes&#34;&gt;Kubernetes&lt;/a&gt;
 provider&amp;rsquo;s first-class support for common rollout strategies, including dark, highlander, and blue/green rollouts.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The implementation of these rollout strategies currently leverages Spinnaker&amp;rsquo;s existing traffic management strategy and is valid for ReplicaSets only. See 
&lt;a href=&#34;/docs/guides/user/kubernetes/traffic-management/&#34;&gt;traffic management&lt;/a&gt;
 for more information.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;rollout-strategy-options&#34;&gt;Rollout Strategy Options&lt;/h2&gt;
&lt;p&gt;As of version 1.14, you will notice a Rollout Strategy Options section in the Deploy (Manifest)
stage. When enabled, these configuration options allow you to associate a workload with one or
more services, decide whether the workload should receive traffic, and determine how Spinnaker
should handle any previous versions of the workload in the same cluster and namespace.&lt;/p&gt;
&lt;p&gt;Configuration options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Service namespace&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Select the namespace containing the service(s) you would like to associate with the workload.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Service(s)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Select one or more services you would like to associate with the workload. Spinnaker will
add a &lt;code&gt;traffic.spinnaker.io/load-balancers&lt;/code&gt; annotation listing the selected services as
described 
&lt;a href=&#34;/docs/guides/user/kubernetes/traffic-management/#attach-a-service-to-a-workload&#34;&gt;here&lt;/a&gt;
.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Traffic&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Check this box if you would like the workload to begin receiving traffic from the selected
services as soon as it is ready. If you do not check this box, you can add a subsequent
Enable (Manifest) stage to begin sending traffic to the workload.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Strategy&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Select a strategy if you would like Spinnaker to handle previous versions of the workload
currently deployed to the same cluster and namespace. Select &lt;code&gt;None&lt;/code&gt; if you do not want
Spinnaker to take any action regarding existing workloads.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;dark-rollouts&#34;&gt;Dark Rollouts&lt;/h3&gt;
&lt;p&gt;Use a dark rollout to deploy a new version of your application alongside the existing version(s),
but do not immediately route any traffic to the new version.&lt;/p&gt;
&lt;p&gt;Optionally, add subsequent Enable (Manifest) and Disable (Manifest) stage to begin sending traffic
to the new version and stop sending traffic to the old version(s).&lt;/p&gt;
&lt;p&gt;Example configuration:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./dark.png&#34;/&gt;
&lt;/figure&gt;

&lt;h3 id=&#34;highlander-rollouts&#34;&gt;Highlander Rollouts&lt;/h3&gt;
&lt;p&gt;Use a highlander rollout to deploy a new version of your application alongside the existing
version(s), send client traffic to the new version, and then disable and destroy existing versions
in the cluster.&lt;/p&gt;
&lt;p&gt;Example configuration:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./highlander.png&#34;/&gt;
&lt;/figure&gt;

&lt;h3 id=&#34;redblack-bluegreen-rollouts&#34;&gt;Red/Black (Blue/Green) Rollouts&lt;/h3&gt;
&lt;p&gt;Use a red/black (blue/green) rollout to deploy a new version of your application alongside the existing version(s), send client traffic to the new version, and then disable existing versions in the cluster.&lt;/p&gt;
&lt;p&gt;Optionally, add subsequent Destroy (Manifest) stages to clean up any unwanted workloads in the
cluster.&lt;/p&gt;
&lt;p&gt;Alternately, easily roll back to a previous version by configuring an Enable (Manifest) stage or using an ad-hoc Enable operation from the Clusters tab.&lt;/p&gt;
&lt;p&gt;Example configuration:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./redblack.png&#34;/&gt;
&lt;/figure&gt;

&lt;blockquote&gt;
&lt;p&gt;Blue/Green replaces Red/Black in Spinnaker v1.30+.&lt;/p&gt;
&lt;/blockquote&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Run Job (Manifest) Stage</title>
      <link>/docs/guides/user/kubernetes/run-job-manifest/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/guides/user/kubernetes/run-job-manifest/</guid>
      <description>
        
        
        &lt;p&gt;The &lt;code&gt;Run Job (Manifest)&lt;/code&gt; stage can be used to execute a Kubernetes Job as part of your pipeline. This stage will deploy a &lt;code&gt;Job&lt;/code&gt; manifest and wait until it completes, allowing you to gate your pipeline&amp;rsquo;s continuation on the job&amp;rsquo;s success or failure.&lt;/p&gt;
&lt;p&gt;For example use cases, check out 
&lt;a href=&#34;https://blog.spinnaker.io/extending-spinnaker-with-kubernetes-and-containers-5d16ec810d81&#34; target=&#34;_blank&#34;&gt;this post&lt;/a&gt;
 on the Spinnaker blog!&lt;/p&gt;
&lt;h2 id=&#34;viewing-execution-logs&#34;&gt;Viewing execution logs&lt;/h2&gt;
&lt;p&gt;As with any job runner, logs are the primary form of feedback and it&amp;rsquo;s important that viewing them is a first-class experience within Spinnaker. Since users of Spinnaker are all at various stages of Kubernetes adoption we&amp;rsquo;ve provided 2 ways to view logs within Spinnaker.&lt;/p&gt;
&lt;h3 id=&#34;link-to-external-system&#34;&gt;Link to external system&lt;/h3&gt;
&lt;p&gt;Most Kubernetes deployments will have some utility for forwarding logs from containers and into external systems for log analysis. If you&amp;rsquo;re using one of these platforms, you can configure your &lt;code&gt;Job&lt;/code&gt; with the annotation &lt;code&gt;job.spinnaker.io/logs&lt;/code&gt; and a templated URL to your logging system. This value of this annotation will be used to render a link in the UI.&lt;/p&gt;
&lt;p&gt;To make it easier to pinpoint the specific job, the annotation value can be templated with values from the deployed &lt;code&gt;Job&lt;/code&gt; manifest. To use templates, use &lt;code&gt;{{ &amp;quot;{{ templateKey &amp;quot;}} }}&lt;/code&gt; where &lt;code&gt;templateKey&lt;/code&gt; is the path to the value you wish to use. The deployed manifest will be passed into the template as JSON. This functionality mirrors that of the 
&lt;a href=&#34;/docs/guides/user/kubernetes/annotations-ui/&#34;&gt;Annotation Driven UI&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;For example, if your &lt;code&gt;Job&lt;/code&gt; is deployed with name &lt;code&gt;myjob-12345&lt;/code&gt;, the annotation&amp;hellip;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;job.spinnaker.io/logs: &amp;#39;https://internal-logging/jobs/{{ &amp;#34;{{ manifest.metadata.name &amp;#34;}}}}&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&amp;hellip;will result in the value&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;https://internal-logging/jobs/myjob-12345
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;within-spinnaker&#34;&gt;Within Spinnaker&lt;/h3&gt;
&lt;p&gt;You can still view the logs of your &lt;code&gt;Job&lt;/code&gt; within Spinnaker even if your Kubernetes deployment doesn&amp;rsquo;t forward them to an external system. In the absense of the &lt;code&gt;job.spinnaker.io/logs&lt;/code&gt; annotation, Spinnaker fetches the deployed manifest and displays logs directly in the UI. These logs are only be available for a short period following the job&amp;rsquo;s completion because Kubernetes only stores events about an object for a short amount of time. If you&amp;rsquo;d like to view your logs for longer than this timeframe, it&amp;rsquo;s recommended that you use a tool like 
&lt;a href=&#34;https://www.fluentd.org&#34; target=&#34;_blank&#34;&gt;Fluentd&lt;/a&gt;
 to forward logs to a more persistent platform like Elasticsearch or Datadog.&lt;/p&gt;
&lt;h2 id=&#34;capturing-output&#34;&gt;Capturing output&lt;/h2&gt;
&lt;p&gt;In most cases, jobs are meant to do some work and provide feedback in the form of an output, such as structured JSON. This output can then be used to influence downstream stages via 
&lt;a href=&#34;/docs/guides/user/pipeline/expressions&#34;&gt;SpEL&lt;/a&gt;
. There are 2 ways of doing this with the &lt;code&gt;Run Job (Manifest)&lt;/code&gt; stage: 
&lt;a href=&#34;#logs&#34;&gt;using logs&lt;/a&gt;
 and 
&lt;a href=&#34;#artifacts&#34;&gt;using artifacts&lt;/a&gt;
.&lt;/p&gt;
&lt;h3 id=&#34;logs&#34;&gt;Logs&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Note: Some Jobs output a massive amount of data which can be expensive to process. If your job outputs megabytes or gigabytes of log data it may be best to utilize the artifact based approach outlined in the 
&lt;a href=&#34;#artifacts&#34;&gt;Artifacts&lt;/a&gt;
 section.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The easiest and most accessible way of capturing output from your jobs is to output data to your logs by writing to &lt;code&gt;stdout&lt;/code&gt;. When a job completes, the log data is captured and analyzed for 2 different markers. These markers are as follows:&lt;/p&gt;
&lt;h4 id=&#34;spinnaker_property_&#34;&gt;&lt;code&gt;SPINNAKER_PROPERTY_*&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;SPINNAKER_PROPERTY_*=*&lt;/code&gt; can be used to provide single key/value pairs, similar to Jenkins &lt;code&gt;build.properties&lt;/code&gt; files. Everything after &lt;code&gt;SPINNAKER_PROPERTY_&lt;/code&gt; is captured as a key/value. For example, given the following log output&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Checkout spinnaker/spinnaker source code...
Latest tag is: 1.1.0.
Tag spinnaker/spinnaker with next minor version...
Uploading release...
Release uploaded.

SPINNAKER_PROPERTY_RELEASE=1.1.1
SPINNAKER_PROPERTY_URL=https://github.com/spinnaker/spinnaker/releases/tag/1.1.1
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;the captured output would be in the following format&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;{
    &amp;#34;RELEASE&amp;#34;: &amp;#34;1.1.1&amp;#34;,
    &amp;#34;URL&amp;#34;: &amp;#34;https://github.com/spinnaker/spinnaker/releases/tag/1.1.1&amp;#34;
}
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&#34;spinnaker_config_json&#34;&gt;&lt;code&gt;SPINNAKER_CONFIG_JSON&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;SPINNAKER_CONFIG_JSON&lt;/code&gt; can be used to provide complex or structured data. In this case, anything following &lt;code&gt;SPINNAKER_CONFIG_JSON=&lt;/code&gt; on a single line of &lt;code&gt;stdout&lt;/code&gt; is directly consumed and parsed as JSON. Using the previous example, notice how the output has changed.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Checkout spinnaker/spinnaker source code...
Latest tag is: 1.1.0.
Tag spinnaker/spinnaker with next minor version...
Uploading release...
Release uploaded.

SPINNAKER_CONFIG_JSON={&amp;#34;RELEASE&amp;#34;: &amp;#34;1.1.1&amp;#34;, &amp;#34;URL&amp;#34;: &amp;#34;https://github.com/spinnaker/spinnaker/releases/tag/1.1.1&amp;#34;}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Again, using this solution would result in the following format:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;{
    &amp;#34;RELEASE&amp;#34;: &amp;#34;1.1.1&amp;#34;,
    &amp;#34;URL&amp;#34;: &amp;#34;https://github.com/spinnaker/spinnaker/releases/tag/1.1.1&amp;#34;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;If &lt;code&gt;SPINNAKER_CONFIG_JSON&lt;/code&gt; is found multiple times within the log then each is parsed and added to the resulting output. If multiple keys are the same, for example the key &lt;code&gt;foo&lt;/code&gt; is contained in multiple instances of &lt;code&gt;SPINNAKER_CONFIG_JSON&lt;/code&gt;, then the &lt;em&gt;last one&lt;/em&gt; wins. The results of multiple occurrences &lt;em&gt;are not merged&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;If you source JSON from a file (&lt;code&gt;SPINNAKER_CONFIG_JSON=$(cat file.json)&lt;/code&gt;), be sure that the file content does not introduce newline characters since each &lt;code&gt;SPINNAKER_CONFIG_JSON&lt;/code&gt; is only parsed from one line in the log file.&lt;/p&gt;
&lt;h3 id=&#34;artifacts&#34;&gt;Artifacts&lt;/h3&gt;
&lt;p&gt;
&lt;a href=&#34;/docs/reference/artifacts&#34;&gt;Artifacts&lt;/a&gt;
 are a mechanism within Spinnaker that enables pipelines to reference resources stored in external systems. Artifacts can be anything — Docker images, Kubernetes manifests, and in this case, data produced by the Run Job stage. As mentioned above, if your job is producing so many logs that parsing them for output data would be an expensive operation, utilizing artifacts would be the best solution.&lt;/p&gt;
&lt;p&gt;In order to use artifacts to capture output data, your job needs to push output to one of Spinnaker&amp;rsquo;s 
&lt;a href=&#34;/docs/reference/artifacts/types/&#34;&gt;supported artifact stores&lt;/a&gt;
. This output is captured at the end of the job execution and injected into the pipeline for use in downstream stages via SpEL. Artifacts captured as output must be in JSON format.&lt;/p&gt;
&lt;p&gt;As an example, let&amp;rsquo;s imagine you are running a job which pushes output into an S3 bucket at the end of its execution.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;...
Operation completed successfully.
Publishing output to S3.
Output published to s3://my-bucket/my-job/output.json
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;In order to capture this output, you&amp;rsquo;ll want to configure the &lt;code&gt;Run Job (Manifest)&lt;/code&gt; stage to capture the output from an Artifact.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;artifact-output.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;cleaning-up-old-jobs&#34;&gt;Cleaning up old Jobs&lt;/h2&gt;
&lt;p&gt;Spinnaker doesn&amp;rsquo;t clean up any &lt;code&gt;Jobs&lt;/code&gt; deployed via the &lt;code&gt;Run Job (Manifest)&lt;/code&gt; stage. In order to clean up old &lt;code&gt;Jobs&lt;/code&gt; it&amp;rsquo;s recommended that you implement some type of garbage collection so as not to overrun your Kubernetes deployment with a massive amount of old &lt;code&gt;Jobs&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;As of Kubernetes 1.12, 
&lt;a href=&#34;https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/#clean-up-finished-jobs-automatically&#34; target=&#34;_blank&#34;&gt;automatic &amp;lt;code&amp;gt;Job&amp;lt;/code&amp;gt; cleanup&lt;/a&gt;
 is an alpha feature, available behind the &lt;code&gt;TTLAfterFinished&lt;/code&gt; feature flag. This flag must be enabled on the API server when it&amp;rsquo;s started. To verify if your deployment has this feature enabled, check with your Kubernetes administrator.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Use Kustomize for Manifests</title>
      <link>/docs/guides/user/kubernetes/kustomize-manifests/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/guides/user/kubernetes/kustomize-manifests/</guid>
      <description>
        
        
        &lt;p&gt;Kustomize is a tool that lets you create customized Kubernetes deployments without modifying underlying YAML configuration files. Since the files remain unchanged, others are able to reuse the same files to build their own customizations. Your customizations are stored in a file called &lt;code&gt;kustomization.yaml&lt;/code&gt;. If configuration changes are needed, the underlying YAML files and &lt;code&gt;kustomization.yaml&lt;/code&gt; can be updated independently of each other.&lt;/p&gt;
&lt;p&gt;To learn more about Kustomize and how to define a &lt;code&gt;kustomization.yaml&lt;/code&gt; file, see the following links:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href=&#34;https://github.com/kubernetes-sigs/kustomize&#34; target=&#34;_blank&#34;&gt;Kubernetes SIG for Kustomize&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href=&#34;https://kubernetes-sigs.github.io/kustomize/&#34; target=&#34;_blank&#34;&gt;Documentation for Kustomize&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href=&#34;https://github.com/kubernetes-sigs/kustomize/tree/master/examples/wordpress&#34; target=&#34;_blank&#34;&gt;Example Kustomization&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the context of Spinnaker, Kustomize lets you generate a custom manifest, which can be deployed in
a downstream &lt;code&gt;Deploy (Manifest)&lt;/code&gt; stage. This manifest is tailored to your requirements and built on
existing configurations.&lt;/p&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;Kustomize works by running &lt;code&gt;kustomize build&lt;/code&gt; against a &lt;code&gt;kustomization.yaml&lt;/code&gt; file located in a Git
repository. This file defines all of the other files needed by Kustomize to render a fully hydrated
manifest.&lt;/p&gt;
&lt;h2 id=&#34;configure-the-bake-manifest-stage&#34;&gt;Configure the “Bake (Manifest)” stage&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Note: Kustomize requires a 
&lt;a href=&#34;/docs/reference/artifacts/types/git-repo/&#34;&gt;git/repo&lt;/a&gt;
 artifact type.**&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Select &lt;code&gt;Kustomize&lt;/code&gt; as the Render Engine and define the artifact for your &lt;code&gt;kustomization.yaml&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;You can specify the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Account&lt;/strong&gt; (required)&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;git/repo&lt;/code&gt; account to use.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;URL&lt;/strong&gt; (required)&lt;/p&gt;
&lt;p&gt;The location of the Git repository.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Branch&lt;/strong&gt; (optional)&lt;/p&gt;
&lt;p&gt;The branch of the repository you want to use. &lt;em&gt;[Defaults to &lt;code&gt;master&lt;/code&gt;]&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Subpath&lt;/strong&gt; (optional)&lt;/p&gt;
&lt;p&gt;By clicking &lt;code&gt;Checkout subpath&lt;/code&gt;, you can optionally pass in a
relative subpath within the repository. This provides the option
to checkout only a portion of the repository, thereby reducing the
size of the generated artifact.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Kustomize File&lt;/strong&gt; (required)&lt;/p&gt;
&lt;p&gt;The relative path to the &lt;code&gt;kustomization.yaml&lt;/code&gt; file residing in the
Git repository.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;&lt;img src=&#34;./render-engine-gitrepo.png&#34;/&gt;
&lt;/figure&gt;

&lt;h3 id=&#34;using-spinnaker-116&#34;&gt;Using Spinnaker 1.16&lt;/h3&gt;
&lt;p&gt;Select &lt;code&gt;Kustomize&lt;/code&gt; as the Render Engine and define the artifact for your &lt;code&gt;kustomization.yaml&lt;/code&gt;:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./render-engine-github.png&#34;/&gt;
&lt;/figure&gt;

&lt;h2 id=&#34;configuring-the-produced-artifact&#34;&gt;Configuring the Produced Artifact&lt;/h2&gt;
&lt;p&gt;With the &lt;code&gt;Bake (Manifest) Configuration&lt;/code&gt; completed, configure a Produced Artifact to use the result in a stage downstream.
Add an artifact:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./add-artifact.png&#34;/&gt;
&lt;/figure&gt;

&lt;p&gt;Define the artifact:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;./define-artifact.png&#34;/&gt;
&lt;/figure&gt;

&lt;p&gt;You can now run your pipeline and get a Kustomize rendered manifest!&lt;/p&gt;
&lt;h2 id=&#34;updating-116-bake-manifest-stage-for-117&#34;&gt;Updating 1.16 &amp;ldquo;Bake (Manifest)&amp;rdquo; stage for 1.17&lt;/h2&gt;
&lt;p&gt;As of 1.17, 
&lt;a href=&#34;/docs/reference/artifacts/types/git-repo/&#34;&gt;git/repo&lt;/a&gt;
 is the only supported artifact type when configuring the &lt;code&gt;Bake (Manifest)&lt;/code&gt; stage in the UI with &lt;code&gt;Kustomize&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Pipelines configured to use Kustomize in 1.16 will continue to work in 1.17. However, editing a &lt;code&gt;Bake (Manifest)&lt;/code&gt; stage in 1.17, which was originally created in 1.16, requires you to update the &lt;code&gt;Bake (Manifest) Configuration&lt;/code&gt; to use the &lt;code&gt;git/repo&lt;/code&gt; artifact type.  To do so, use the following instructions:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Click on the &lt;code&gt;Account&lt;/code&gt; dropdown and select a configured &lt;code&gt;git/repo&lt;/code&gt; account.  If none appear, make sure you have 
&lt;a href=&#34;/docs/reference/artifacts/types/git-repo/&#34;&gt;configured a git/repo account&lt;/a&gt;
&lt;br&gt;
&lt;strong&gt;Note:&lt;/strong&gt; You should click and select a &lt;code&gt;git/repo&lt;/code&gt; account even if one already appears in the UI prior to your doing so. This will force the underlying JSON to be updated to use the new artifact.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Update the URL. This should be the location of the git repository.&lt;br&gt;
&lt;strong&gt;example&lt;/strong&gt;: &lt;code&gt;https://github.com/kubernetes-sigs/kustomize&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Provide the Kustomize file path. This should be the relative path to the &lt;code&gt;kustomization.yaml&lt;/code&gt; within the repository.&lt;br&gt;
&lt;strong&gt;example&lt;/strong&gt;: &lt;code&gt;examples/wordpress/mysql/kustomization.yaml&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;&lt;img src=&#34;./render-engine-pre-migration.png&#34;
         alt=&#34;Before updating. The fields highlighed in red should be updated as described above.&#34;/&gt;&lt;figcaption&gt;
            &lt;p&gt;Before updating. The fields highlighed in red should be updated as described above.&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;img src=&#34;./render-engine-post-migration.png&#34;
         alt=&#34;After updating.&#34;/&gt;&lt;figcaption&gt;
            &lt;p&gt;After updating.&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&#34;other-templating-engines&#34;&gt;Other Templating Engines&lt;/h2&gt;
&lt;p&gt;In addition to Kustomize, Spinnaker also supports Helm (and Helmfile) as templating engines. For more information, see 
&lt;a href=&#34;/docs/guides/user/kubernetes/deploy-helm/&#34;&gt;Deploy Helm Charts&lt;/a&gt;
.&lt;/p&gt;

      </description>
    </item>
    
  </channel>
</rss>
