<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Spinnaker – Runbooks</title>
    <link>https://deploy-preview-629--spinnaker-io.netlify.app/docs/guides/runbooks/</link>
    <description>Recent content in Runbooks on Spinnaker</description>
    <generator>Hugo -- gohugo.io</generator>
    
	  <atom:link href="https://deploy-preview-629--spinnaker-io.netlify.app/docs/guides/runbooks/index.xml" rel="self" type="application/rss+xml" />
    
    
      
        
      
    
    
    <item>
      <title>Docs: API Rate Limiting</title>
      <link>https://deploy-preview-629--spinnaker-io.netlify.app/docs/guides/runbooks/api-rate-limiting/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-629--spinnaker-io.netlify.app/docs/guides/runbooks/api-rate-limiting/</guid>
      <description>
        
        
        &lt;p&gt;If your Spinnaker deployment has API clients interacting with it, enabling and
knowing how to operate the API rate limiter can help keep Spinnaker reliable
through spikes of heavy traffic or rogue clients.&lt;/p&gt;
&lt;h2 id=&#34;intro&#34;&gt;Intro&lt;/h2&gt;
&lt;p&gt;The API Rate Limiter currently supports limiting individual authenticated and
anonymous principals, bucketing requests into windows that are refreshed every
interval as well as global &amp;amp; per-principal learning mode. Both the capacity, as
well as the window size, are configurable globally and per-principal.&lt;/p&gt;
&lt;p&gt;Some metrics are generated by the rate limiter:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;rateLimit.throttling&lt;/code&gt;: Counter. Number of enforced throttled requests.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rateLimit.throttlingLearning&lt;/code&gt;: Counter. Number of un-enforced throttled
requests.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rateLimit.principal.throttled&lt;/code&gt;: Counter. A tagged metric recording the number
of throttled requests per-principal. Tag key is &lt;code&gt;principal&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rateLimit.principal.remaining&lt;/code&gt;: Gauge. A tagged metric recording the number
of remaining requests per-principal. Tag key is &lt;code&gt;principal&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Combined with &lt;code&gt;controller.invocations&lt;/code&gt;, these metrics can give you a good sense
of your on-going rate limiting configuration.&lt;/p&gt;
&lt;p&gt;In the case of failures (Redis unavailable) or configuration errors (principal
included in both enforcing and ignoring lists), a request will gracefully
fallback to learning mode.&lt;/p&gt;
&lt;h2 id=&#34;enabling-in-gateyml&#34;&gt;Enabling in gate.yml&lt;/h2&gt;
&lt;p&gt;The rate limiter requires Redis to be available for Gate.&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;rateLimit&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;enabled&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:#204a87;font-weight:bold&#34;&gt;true&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;learning&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:#204a87;font-weight:bold&#34;&gt;true&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;redis&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;enabled&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:#204a87;font-weight:bold&#34;&gt;true&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;# The rate (in seconds) that the bucket will be replenished&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;rateSeconds&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;10&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;# The number of allowed requests in the window of rateSeconds&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;capacity&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;500&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;# Specific principals can be given different capacities&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;capacityByPrincipal&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;principal&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;anonymous&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;override&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;1000&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;# Similarly, rateSeconds can be overridden per-principal&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;rateSecondsByPrincipal&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;principal&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;anonymous&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;override&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;5&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;# A list of principals that are being enforced. Handy for cases where you want&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;# to incrementally enable the rate limiter&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;enforcing&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:#000&#34;&gt;example@example.com&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;# A list of principals that are in learning mode. This can be useful if you&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;# want to give some principals unlimited power. Reconsider doing this :)&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;ignoring&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:#000&#34;&gt;unmetered-example@example.com&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;integrating-clients&#34;&gt;Integrating clients&lt;/h2&gt;
&lt;p&gt;The rate limiter exposes four HTTP Headers on each request that a client can
ingest to play nicely with the rate limiter:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;X-RateLimit-Capacity&lt;/code&gt;: Int. Total capacity assigned to the principal.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;X-RateLimit-Remaining&lt;/code&gt;: Int. Total number of requests left before reset.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;X-RateLimit-Reset&lt;/code&gt;: Date. When the bucket will be replenished.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;X-RateLimit-Learning&lt;/code&gt;: Bool. Whether or not the rate limiter is enforcing the
principal.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;anonymous-clients&#34;&gt;Anonymous clients&lt;/h3&gt;
&lt;p&gt;If your Spinnaker deployment allows anonymous API access, by default all
requests will be bucketed into the same rate limit window. With a little trust,
you can allow your users to assign themselves their own anonymous rate limit
bucket by sending a &lt;code&gt;X-RateLimit-App&lt;/code&gt; header, where the value is the name of
their application.&lt;/p&gt;
&lt;h2 id=&#34;dynamic-configuration&#34;&gt;Dynamic configuration&lt;/h2&gt;
&lt;p&gt;Re-deploying gate to respond to real-world events is non-ideal. Redis has the
capability to override any configuration defined by the static configuration.
First, a list of key patterns:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;rateLimit*&lt;/code&gt; - All rate limiter-related keys.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rateLimit:*&lt;/code&gt; - Principal rate limiter.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rateLimit:learning&lt;/code&gt; - Global learning flag.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rateLimit:enforcing&lt;/code&gt; - A list of principals being enforced.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rateLimit:ignoring&lt;/code&gt; - A list of principals in learning mode.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rateLimit:capacity:*&lt;/code&gt; - Per-principal capacity.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rateLimit:rateSeconds:*&lt;/code&gt; - Per-principal rateSeconds.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;examples&#34;&gt;Examples&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ redis-cli

# Set a new capacity
127.0.0.1:6379&amp;gt; set rateLimit:capacity:chaosmonkey@example.com 2000

# Add the chaosmonkey@example.com principal to the enforcing list
127.0.0.1:6379&amp;gt; sadd rateLimit:enforcing chaosmonkey@example.com
(integer) 1
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;reference&#34;&gt;Reference&lt;/h2&gt;
&lt;p&gt;Code backing the rate limiter can be found in the 
&lt;a href=&#34;https://github.com/spinnaker/gate/tree/master/gate-web/src/main/groovy/com/netflix/spinnaker/gate/ratelimit&#34; target=&#34;_blank&#34;&gt;gate repository&lt;/a&gt;
.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Caching: Account Name Based Sharding</title>
      <link>https://deploy-preview-629--spinnaker-io.netlify.app/docs/guides/runbooks/caching-account-name-based-sharding/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-629--spinnaker-io.netlify.app/docs/guides/runbooks/caching-account-name-based-sharding/</guid>
      <description>
        
        
        &lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;Account name based sharding is applicable to the caching function of a clouddriver. In case of HA mode, it is applicable to clouddriver-caching pods only.
This feature is added at caching scheduler(both redis &amp;amp; sql backed) level which means it&amp;rsquo;s applicable to any cloud provider.&lt;/p&gt;
&lt;p&gt;This is a configurable feature. When configured, all the caching agents of an account are run by a single caching pod.
The logic of identifying the account whose caching agents are to be run in a particular pod is dependent on the name of the account(hashcode) and the number of available caching pods.
When the pods are scaled up or down, the agents will resettle to the same or a different pod based on the sharding logic.&lt;/p&gt;
&lt;h2 id=&#34;configuration&#34;&gt;Configuration&lt;/h2&gt;
&lt;p&gt;This feature can be enabled by setting &lt;code&gt;cache-sharding.enabled&lt;/code&gt; property to &lt;code&gt;true&lt;/code&gt; which by default is &lt;code&gt;false&lt;/code&gt;.
The below configuration needs to be added to appropriate configuration file (ex: clouddriver-local.yaml):&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;cache-sharding&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;enabled&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:#204a87;font-weight:bold&#34;&gt;true&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;additional-details&#34;&gt;Additional Details&lt;/h2&gt;
&lt;p&gt;The implementation details are available at the following PR links.&lt;/p&gt;
&lt;p&gt;
&lt;a href=&#34;https://github.com/spinnaker/clouddriver/pull/5295&#34; target=&#34;_blank&#34;&gt;feat(cats/sql): account name based sharding logic&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href=&#34;https://github.com/spinnaker/clouddriver/pull/5382&#34; target=&#34;_blank&#34;&gt;feat(cats/redis): account name based sharding logic&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href=&#34;https://github.com/spinnaker/clouddriver/pull/5512&#34; target=&#34;_blank&#34;&gt;refactor(cats/sql): made sharding configuration consistent&lt;/a&gt;
&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Orca: Quality of Service</title>
      <link>https://deploy-preview-629--spinnaker-io.netlify.app/docs/guides/runbooks/orca-quality-of-service/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-629--spinnaker-io.netlify.app/docs/guides/runbooks/orca-quality-of-service/</guid>
      <description>
        
        
        &lt;p&gt;&lt;strong&gt;EXPERIMENTAL&lt;/strong&gt;: This feature is still in an early adoption / experimental phase. While you can use it today (Orca v6.71.0), Netflix is currently running this in learning mode / judiciously enabling in response to on-call events.&lt;/p&gt;
&lt;p&gt;Spinnaker ships with an optional Quality of Service (QoS) module that can be used to manage the amount of active executions running at any given time.
By default, this QoS module is disabled, but can be enabled and tuned with a handful of knobs and different strategies.
Before we dive into the configuration settings, we&amp;rsquo;ll go over how QoS works.&lt;/p&gt;
&lt;h2 id=&#34;how-qos-works&#34;&gt;How QoS Works&lt;/h2&gt;
&lt;p&gt;The QoS system is self-contained within Orca&amp;rsquo;s 
&lt;a href=&#34;https://github.com/spinnaker/orca/tree/master/orca-qos&#34; target=&#34;_blank&#34;&gt;orca-qos&lt;/a&gt;
 module and operates only on newly created executions (both pipeline and orchestrations).
That is to say, the QoS system will &lt;em&gt;not&lt;/em&gt; impact running executions: Once an execution has started, it is completely outside of the domain of the QoS module.
The rest of this section assumes that QoS is enabled.&lt;/p&gt;
&lt;p&gt;When an execution is submitted to Orca (either manually via the API or UI, or through an automated trigger), Orca will first emit a synchronous &lt;code&gt;BeforeExecutionPersist&lt;/code&gt; event which the QoS 
&lt;a href=&#34;https://github.com/spinnaker/orca/blob/master/orca-qos/src/main/kotlin/com/netflix/spinnaker/orca/qos/ExecutionBufferActuator.kt&#34; target=&#34;_blank&#34;&gt;ExecutionBufferActuator&lt;/a&gt;
 is listening on.
The behavior of the &lt;code&gt;ExecutionBufferActuator&lt;/code&gt; depends firstly on the result of a

&lt;a href=&#34;https://github.com/spinnaker/orca/blob/master/orca-qos/src/main/kotlin/com/netflix/spinnaker/orca/qos/BufferStateSupplier.kt&#34; target=&#34;_blank&#34;&gt;BufferStateSupplier&lt;/a&gt;
.
The &lt;code&gt;BufferStateSupplier&lt;/code&gt; can perform whatever heuristics necessary to determine whether or not any new execution should go through the QoS process.
If the &lt;code&gt;BufferStateSupplier&lt;/code&gt; returns &lt;code&gt;false&lt;/code&gt;, no other QoS actions occur and the execution is started as normal.&lt;/p&gt;
&lt;p&gt;In the event &lt;code&gt;BufferStateSupplier&lt;/code&gt; returns &lt;code&gt;true&lt;/code&gt;, the execution is passed through a chain of ordered 
&lt;a href=&#34;https://github.com/spinnaker/orca/blob/master/orca-qos/src/main/kotlin/com/netflix/spinnaker/orca/qos/BufferPolicy.kt&#34; target=&#34;_blank&#34;&gt;BufferPolicy&lt;/a&gt;
 functions.
These &lt;code&gt;BufferPolicy&lt;/code&gt; functions return a result defining whether or not to &lt;code&gt;BUFFER&lt;/code&gt; or &lt;code&gt;ENQUEUE&lt;/code&gt; the execution.
All &lt;code&gt;BufferPolicy&lt;/code&gt; functions must return &lt;code&gt;ENQUEUE&lt;/code&gt;, otherwise the execution will be assigned a status of &lt;code&gt;BUFFERED&lt;/code&gt;, delaying the initialization of the execution.
When an execution is &lt;code&gt;BUFFERED&lt;/code&gt;, it will effectively stay in a waiting state until it is unbuffered, which we&amp;rsquo;ll go over later.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;BufferPolicy&lt;/code&gt; functions are pluggable and can contain arbitrary logic.
For example, one &lt;code&gt;BufferPolicy&lt;/code&gt; that is always enabled is 
&lt;a href=&#34;https://github.com/spinnaker/orca/blob/master/orca-qos/src/main/kotlin/com/netflix/spinnaker/orca/qos/bufferpolicy/EnqueueDeckOrchestrationsBufferPolicy.kt&#34; target=&#34;_blank&#34;&gt;EnqueueDeckOrchestrationBufferPolicy&lt;/a&gt;
, which will always &lt;code&gt;ENQUEUE&lt;/code&gt; an execution it is an Orchestration and from the UI.
This specific policy forces the &lt;code&gt;ENQUEUE&lt;/code&gt; status, even if other policies call for the execution to be buffered; this is done through a &lt;code&gt;force&lt;/code&gt; flag that policies can return.
An example of other pluggable behavior is determining buffering action based on criticality of the execution: At Netflix we have a custom concept of application criticality, so we can buffer low criticality executions to allow capacity for higher criticality executions.&lt;/p&gt;
&lt;p&gt;Once an execution is put into a &lt;code&gt;BUFFERED&lt;/code&gt; state, it will remain in that state until the 
&lt;a href=&#34;https://github.com/spinnaker/orca/blob/master/orca-qos/src/main/kotlin/com/netflix/spinnaker/orca/qos/ExecutionPromoter.kt&#34; target=&#34;_blank&#34;&gt;ExecutionPromoter&lt;/a&gt;
 decides to change it to &lt;code&gt;NOT_STARTED&lt;/code&gt; and enqueue it for processing.
Similar to the &lt;code&gt;ExecutionBufferActuator&lt;/code&gt;, the &lt;code&gt;ExecutionPromoter&lt;/code&gt; uses an ordered chain of 
&lt;a href=&#34;https://github.com/spinnaker/orca/blob/master/orca-qos/src/main/kotlin/com/netflix/spinnaker/orca/qos/PromotionPolicy.kt&#34; target=&#34;_blank&#34;&gt;PromotionPolicy&lt;/a&gt;
 functions to determine what buffered executions to promote.
Every promotion cycle, the list of buffered executions (called candidates) are passed through the policies, each reducing the list of candidates to a final list of executions that will be promoted.
Again, these policies can have arbitrary logic, but by default a naive promotion policy is included that will promote the &lt;em&gt;N&lt;/em&gt; oldest executions.
This promotion process happens (by default) on a 5-second interval on every Orca instance.&lt;/p&gt;
&lt;p&gt;With both &lt;code&gt;BufferPolicy&lt;/code&gt; and &lt;code&gt;PromotionPolicy&lt;/code&gt;, the results of each function returns a result with a human readable &amp;ldquo;reason&amp;rdquo;, which is logged out for each execution that is evaluated so it is easy to trace.&lt;/p&gt;
&lt;div class=&#34;mermaid&#34;&gt;
  
sequenceDiagram
participant ExecutionPersister
participant ExecutionBufferActuator
participant BufferPolicy
participant ExecutionPromoter
participant PromotionPolicy
participant ExecutionLauncher
ExecutionPersister-&gt;&gt;ExecutionBufferActuator: BeforeExecutionPersistEvent
ExecutionBufferActuator-&gt;&gt;BufferPolicy: Execution
loop Buffer Chain
BufferPolicy-&gt;BufferPolicy: Evaluate if BUFFERED or ENQUEUED
end
alt ENQUEUED
BufferPolicy-&gt;&gt;ExecutionLauncher: Start Execution
else BUFFERED
Note over BufferPolicy: Set BUFFERED status
end
note right of ExecutionPromoter: Every n seconds
ExecutionPromoter-&gt;&gt;PromotionPolicy: All BUFFERED executions &#34;candidates&#34;
loop PromoteCycle
PromotionPolicy-&gt;PromotionPolicy: Reduce candidates
end
PromotionPolicy-&gt;&gt;ExecutionPromoter: Final promotion candidates
loop Promote Executions
note over ExecutionPromoter: For each promoted execution
ExecutionPromoter-&gt;&gt;ExecutionPersister: Update Execution status to NOT_STARTED
ExecutionPromoter-&gt;&gt;ExecutionLauncher: Start Execution
end

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: This is the first implementation of the QoS system, we plan to iterate on this concept and make it more advanced over time.
You can read the 
&lt;a href=&#34;https://docs.google.com/document/d/1Kq9PjfhUu2o8Awt0YQyXf7L14X_PUsS81oaW6tjlgVY/edit#&#34; target=&#34;_blank&#34;&gt;original proposal&lt;/a&gt;
 to get an idea of a potential roadmap.&lt;/p&gt;
&lt;h2 id=&#34;configuration&#34;&gt;Configuration&lt;/h2&gt;
&lt;p&gt;These configurations are not guaranteed to be fully inclusive of all knobs.
A definitive list is available via the codebase.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;qos.enabled&lt;/code&gt;: Boolean (default &lt;code&gt;false&lt;/code&gt;). Global flag controlling whether or not the system is enabled. This flag will not disable the &lt;code&gt;ExecutionPromoter&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;qos.learningMode.enabled&lt;/code&gt;: Boolean (default &lt;code&gt;true&lt;/code&gt;). If enabled, executions will always be &lt;code&gt;ENQUEUED&lt;/code&gt;, but log messages &amp;amp; metrics will be emitted saying what the system would have done. This flag has no effect on &lt;code&gt;ExecutionPromoter&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pollers.qos.promoteIntervalMs&lt;/code&gt;: Integer (default &lt;code&gt;5000&lt;/code&gt;). The time (in milliseconds) that the promotion process will be run.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;bufferpolicy-naive&#34;&gt;BufferPolicy: Naive&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;NaiveBufferPolicy&lt;/code&gt; will always buffer executions when enabled.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;qos.bufferPolicy.naive.enabled&lt;/code&gt;: Boolean (default &lt;code&gt;true&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;bufferstatesupplier-activeexecutions&#34;&gt;BufferStateSupplier: ActiveExecutions&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;ActiveExecutionsBufferStateSupplier&lt;/code&gt; will enable/disable the buffering state based on the number of active executions in the system.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;qos.bufferingState.supplier&lt;/code&gt; must be set to &lt;code&gt;activeExecutions&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;qos.bufferingState.activeExecutions.threshold&lt;/code&gt;: Integer (default &lt;code&gt;100&lt;/code&gt;). The high threshold of active executions before QoS will start actuating on executions.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pollers.qos.updateStateIntervalMs&lt;/code&gt;: Integer (default &lt;code&gt;5000&lt;/code&gt;). The time (in milliseconds) that the function will update its internal record for how many executions are running in the system.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;bufferstatesupplier-killswitch&#34;&gt;BufferStateSupplier: KillSwitch&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;KillSwitchBufferStateSupplier&lt;/code&gt; will enable/disable the buffering state based on configuration only.
This is handy if you&amp;rsquo;re evaluating the fundamentals of the QoS system, or you want a break-the-glass operator knob to control QoS.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;qos.bufferingState.supplier&lt;/code&gt; must be set to &lt;code&gt;killSwitch&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;qos.bufferingState.killSwitch.enabled&lt;/code&gt;: Boolean (default &lt;code&gt;false&lt;/code&gt;). If &lt;code&gt;true&lt;/code&gt;, QoS will be enabled.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;promotionpolicy-naive&#34;&gt;PromotionPolicy: Naive&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;NaivePromotionPolicy&lt;/code&gt; will promote &lt;em&gt;N&lt;/em&gt; executions every promotion cycle.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;qos.promotionPolicy.naive.enabled&lt;/code&gt;: Boolean (default &lt;code&gt;true&lt;/code&gt;). Whether or not this policy is enabled.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;qos.promotionPolicy.naive.size&lt;/code&gt;: Integer (default &lt;code&gt;1&lt;/code&gt;). The max number of executions to promote.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;monitoring&#34;&gt;Monitoring&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;qos.executionsBuffered&lt;/code&gt;: Counter. The number of executions that have been buffered.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;qos.executionsEnqueued&lt;/code&gt;: Counter. The number of executions that have been enqueued (e.g. passed through the system and were judged not to be buffered).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;qos.actuator.elapsedTime&lt;/code&gt;: Timer. The amount of time that is spent passing an execution through all enabled &lt;code&gt;BufferPolicy&lt;/code&gt;s.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;qos.promoter.elapsedTime&lt;/code&gt;: Timer. The amount of time that is spent passing an execution through all enabled &lt;code&gt;PromotionPolicy&lt;/code&gt;s. Since the promoter is run on a static interval, this should usually be a relatively high, yet constant, number.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;qos.promoter.executionsPromoted&lt;/code&gt;: Counter. The number of executions that have been promoted.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;additional-notes&#34;&gt;Additional Notes&lt;/h2&gt;
&lt;p&gt;The QoS system is currently shared-nothing state. Each Orca instance will maintain its own state (aside from configuration) about whether or not it should be buffering executions, or when it should be running pollers.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Orca: Zombie Executions</title>
      <link>https://deploy-preview-629--spinnaker-io.netlify.app/docs/guides/runbooks/orca-zombie-executions/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-629--spinnaker-io.netlify.app/docs/guides/runbooks/orca-zombie-executions/</guid>
      <description>
        
        
        &lt;p&gt;Aliases: &lt;code&gt;orphaned execution&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;A zombie Execution is one that has a status in the database of RUNNING but there are no messages in Orca&amp;rsquo;s work queue or unacked set—the pipeline or task is not doing anything.&lt;/p&gt;
&lt;h2 id=&#34;diagnosis&#34;&gt;Diagnosis&lt;/h2&gt;
&lt;p&gt;Logs will be emitted regularly for Executions that are currently running in Orca via the &lt;code&gt;QueueProcessor&lt;/code&gt; class, which will look similar to the following example.
If no logs have been emitted for over 10 minutes for a &lt;code&gt;RUNNING&lt;/code&gt; Execution, it is very likely a zombie.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Received message RunTask(executionType=pipeline, executionId=01CT1ST3MBJ9ECPH5JM5HVJARE, application=myapplication, stageId=01CT1ST4P79Y3MPW6FC4H38N3A, taskId=8, taskType=class com.netflix.spinnaker.orca.clouddriver.tasks.instance.WaitForUpInstancesTask)
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;metrics--alerting&#34;&gt;Metrics &amp;amp; Alerting&lt;/h3&gt;
&lt;p&gt;Orca can be configured to detect and emit metrics for zombie Executions.
This setting is expensive with the &lt;code&gt;RedisExecutionRepository&lt;/code&gt; and is disabled by default.
You can enable this detection by setting &lt;code&gt;queue.zombieCheck.enabled: true&lt;/code&gt; in your Orca configuration.&lt;/p&gt;
&lt;p&gt;When enabled, any discovered zombies will be logged out, as well as emitted via a metric:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Found zombie executionType=pipeline application=myapplication executionName=myexample executionId=01CS076X85RX6MWBTQ0VGBF8VX
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;If you&amp;rsquo;ve enabled the zombie check, set an alert on the metric &lt;code&gt;queue.zombies&lt;/code&gt;, triggering whenever there is a count greater than 0.&lt;/p&gt;
&lt;h2 id=&#34;remediation&#34;&gt;Remediation&lt;/h2&gt;
&lt;h3 id=&#34;rehydrate-the-queue&#34;&gt;Rehydrate the Queue&lt;/h3&gt;
&lt;p&gt;If the Execution is a zombie, there are no messages on the work queue for that Execution.
You can attempt to re-hydrate the queue &amp;mdash; reissue messages onto the work queue based on the last stored state &amp;mdash; using an 
&lt;a href=&#34;https://github.com/spinnaker/orca/blob/master/orca-queue/src/main/kotlin/com/netflix/spinnaker/orca/q/admin/web/QueueAdminController.kt#L33&#34; target=&#34;_blank&#34;&gt;admin API in Orca&lt;/a&gt;
, which must be called directly as it is not exposed through Gate.
This command can take either a single execution or operate on all executions within a time range.
&lt;strong&gt;This command will dry-run by default.&lt;/strong&gt;
To actually rehydrate the queue, pass the query parameter &lt;code&gt;dryRun=false&lt;/code&gt;.&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;$ curl -XPOST &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;  https://localhost:8083/admin/queue/hydrate?executionId&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;01CS076X85RX6MWBTQ0VGBF8VX&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;dryRun&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#204a87&#34;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This command is &lt;strong&gt;best effort&lt;/strong&gt; and may not be able to rehydrate the Execution, especially if the Execution was zombied while running a non-retryable task.&lt;/p&gt;
&lt;p&gt;An example response from the endpoint:&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;dryRun&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 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;executions&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;01CS076X85RX6MWBTQ0VGBF8VX&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;startTime&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;1538679600852&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;actions&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;description&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;Task is running and is retryable&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;message&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;runTask&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;executionType&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;PIPELINE&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;executionId&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;01CS076X85RX6MWBTQ0VGBF8VX&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;application&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;myapplication&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;stageId&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;01CS076X8501MNAD2ZTJ4ST2TM&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;taskId&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;1&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;taskType&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;com.netflix.spinnaker.orca.echo.pipeline.ManualJudgmentStage$WaitForManualJudgmentTask&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;attributes&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;ackTimeoutMs&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;600000&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;context&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;stageId&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;01CS076X8501MNAD2ZTJ4ST2TM&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;stageType&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;manualJudgment&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;stageStartTime&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;1538682406227&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;taskId&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;1&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;taskType&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;waitForJudgment&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;taskStartTime&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;1538682406242&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;description&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;Task is running but is not retryable&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;context&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;stageId&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;01CS076X85ECXHF3FRWZBTQ359&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;stageType&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;createProperty&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;stageStartTime&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;1538681485559&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;taskId&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 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;taskType&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;monitorProperties&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;taskStartTime&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;1538681546116&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;canApply&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;p&gt;For each Execution, a final action summary is provided &lt;code&gt;canApply&lt;/code&gt;.
If any part of an Execution cannot be re-hydrated, the entire Execution will be skipped.&lt;/p&gt;
&lt;h2 id=&#34;cancel-the-execution&#34;&gt;Cancel the Execution&lt;/h2&gt;
&lt;p&gt;If the Execution cannot be rehydrated, it will need to be canceled.
You can cancel the Execution via the UI or force cancellation via an Orca admin API:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;PUT /admin/forceCancelExecution?executionId=01CS076X85RX6MWBTQ0VGBF8VX&amp;amp;executionType=PIPELINE
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;known-causes&#34;&gt;Known Causes&lt;/h2&gt;
&lt;p&gt;Zombie Executions can occur due to a loss of the Redis instance backing the Orca queue, or in prolonged unreliable networks.
If you&amp;rsquo;re using the &lt;code&gt;RedisExecutionRepository&lt;/code&gt;, it&amp;rsquo;s likely that when you lose the Redis backing the queue, you&amp;rsquo;re also losing all running Executions.
However, while using the 
&lt;a href=&#34;https://deploy-preview-629--spinnaker-io.netlify.app/docs/setup/productionize/persistence/orca-sql/&#34;&gt;SQL backend for Orca&lt;/a&gt;
, losing the Redis means you&amp;rsquo;re only losing the in-flight work queue state, not the state of the pipelines.
In such a scenario, once Redis has been restored it will not have any messages to process and existing &lt;code&gt;RUNNING&lt;/code&gt; Executions will sit unprocessed.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: Sharding Spinnaker</title>
      <link>https://deploy-preview-629--spinnaker-io.netlify.app/docs/guides/runbooks/sharding-spinnaker/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-629--spinnaker-io.netlify.app/docs/guides/runbooks/sharding-spinnaker/</guid>
      <description>
        
        
        &lt;h2 id=&#34;intro&#34;&gt;Intro&lt;/h2&gt;
&lt;p&gt;This document shows you how to shard traffic to different Spinnaker services based upon configured criteria. The general pattern is to define a selector class in your configuration. Endpoints will then be selected based upon the criteria specified in the selectors.&lt;/p&gt;
&lt;p&gt;As an example, Netflix creates read-only shards for Clouddriver to better manage requests.&lt;/p&gt;
&lt;p&gt;Selectors exist at these levels:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Application&lt;/li&gt;
&lt;li&gt;Execution type (i.e, Pipeline vs Orchestration)&lt;/li&gt;
&lt;li&gt;Origin&lt;/li&gt;
&lt;li&gt;Authenticated User&lt;/li&gt;
&lt;li&gt;Deployment account&lt;/li&gt;
&lt;li&gt;Cloud Provider&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You will need to modify your Spinnaker deployment pipelines to ensure the infrastructure for each shard is correctly created, otherwise traffic could be sent to non-existent shards.&lt;/p&gt;
&lt;p&gt;If no selector is specified, the default endpoint will be used.&lt;/p&gt;
&lt;p&gt;Additionally, there is a special dynamicEndpoints configuration in gate.yml to send all requests from Deck to that particular shard.&lt;/p&gt;
&lt;h2 id=&#34;sharding-orca-requests&#34;&gt;Sharding Orca Requests&lt;/h2&gt;
&lt;p&gt;In gate.yml&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;services:
  orca:
    shards:
      baseUrls:
        - baseUrl: https://orca.example.com
        - baseUrl: https://orca-shard1.example.com
          priority: 10
          config:
            selectorClass: com.netflix.spinnaker.kork.web.selector.ByApplicationServiceSelector
            applicationPattern: xxxxyyyapp |demo.*xxxxyyyy
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;clouddriver-read-only-shards&#34;&gt;Clouddriver Read-only Shards&lt;/h2&gt;
&lt;p&gt;gate.yml&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;services:
  clouddriver:
    baseUrl: https://clouddriver-readonly.example.com
    config:
      dynamicEndpoints:
        deck: https://clouddriver-readonly-deck.example.com
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;orca.yml&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;clouddriver:
  readonly:
    baseUrls:
    - baseUrl: https://clouddriver-readonly-orca-1.example.com
      priority: 10
      config:
        selectorClass: com.netflix.spinnaker.orca.clouddriver.config.ByExecutionTypeServiceSelector
        executionTypes:
          - orchestration
    - baseUrl: https://clouddriver-readonly-orca-2.example.com
      priority: 20
      config:
        selectorClass: com.netflix.spinnaker.orca.clouddriver.config.ByApplicationServiceSelector
        applicationPattern: app1|.*app2.*
    - baseUrl: https://clouddriver-readonly-orca-3.example.com
      priority: 30
      config:
        selectorClass: com.netflix.spinnaker.orca.clouddriver.config.ByOriginServiceSelector
        origin: deck
        executionTypes:
          - orchestration
    - baseUrl: https://clouddriver-readonly-orca-4.example.com
      priority: 50
      config:
        selectorClass: com.netflix.spinnaker.orca.clouddriver.config.ByAuthenticatedUserServiceSelector
        users:
          - horseman.*
          - bojack.*
    - baseUrl: https://clouddriver-readonly-orca-5.example.com
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;clouddriver-write-only-shards&#34;&gt;Clouddriver Write-only Shards&lt;/h2&gt;
&lt;p&gt;orca.yml&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;clouddriver:
  writeonly:
    baseUrls:
    - baseUrl: https://clouddriver-write-kubernetes.example.com
      priority: 10
      config:
        selectorClass: com.netflix.spinnaker.kork.web.selector.ByCloudProviderServiceSelector
        cloudProviders: 
          - kubernetes
    - baseUrl: https://clouddriver-write-cloudfoundry.example.com
      priority: 20
      config:
        selectorClass: com.netflix.spinnaker.kork.web.selector.ByCloudProviderServiceSelector
        cloudProviders: 
          - cloudfoundry
    - baseUrl: https://clouddriver-write-heavy-account.example.com
      priority: 30
      config:
        selectorClass: com.netflix.spinnaker.kork.web.selector.ByAccountServiceSelector
        accountPattern: heavyUsageAccount.*|.*app2.*
    - baseUrl: https://clouddriver-write-heavy-users.example.com
      priority: 40
      config:
        selectorClass: com.netflix.spinnaker.orca.clouddriver.config.ByAuthenticatedUserServiceSelector
        users:
          - horseman.*
          - bojack.*
    - baseUrl: https://clouddriver-write.example.com
&lt;/code&gt;&lt;/pre&gt;
      </description>
    </item>
    
  </channel>
</rss>
