<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Home on Nimbus</title><link>https://k-s-pavan-kumar.github.io/hugo-nimbus/</link><description>Recent content in Home on Nimbus</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sat, 01 Jun 2024 00:00:00 +0000</lastBuildDate><atom:link href="https://k-s-pavan-kumar.github.io/hugo-nimbus/index.xml" rel="self" type="application/rss+xml"/><item><title>Getting Started</title><link>https://k-s-pavan-kumar.github.io/hugo-nimbus/docs/getting-started/</link><pubDate>Fri, 01 Mar 2024 00:00:00 +0000</pubDate><guid>https://k-s-pavan-kumar.github.io/hugo-nimbus/docs/getting-started/</guid><description>&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hugo Extended ≥ 0.146.0&lt;/strong&gt; — check with &lt;code&gt;hugo version&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Node.js&lt;/strong&gt; (any recent LTS) — needed for the Tailwind/PostCSS build step.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="run-the-example-site"&gt;Run the example site&lt;/h2&gt;
&lt;p&gt;The example site lives in &lt;code&gt;exampleSite/&lt;/code&gt; and references the theme one
directory up, so it&amp;rsquo;s built with the &lt;code&gt;--themesDir&lt;/code&gt; flag rather than a copy of
the theme inside it:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/your-org/hugo-theme-nimbus.git
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; hugo-theme-nimbus/exampleSite
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hugo server -D --themesDir ../..
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Open &lt;code&gt;http://localhost:1313&lt;/code&gt; to see it running.&lt;/p&gt;</description></item><item><title>Installation (v1.0)</title><link>https://k-s-pavan-kumar.github.io/hugo-nimbus/docs-v1/installation/</link><pubDate>Wed, 01 Nov 2023 00:00:00 +0000</pubDate><guid>https://k-s-pavan-kumar.github.io/hugo-nimbus/docs-v1/installation/</guid><description>&lt;div class="alert alert-warning"&gt;
 &lt;div class="flex items-start"&gt;
 &lt;div class="flex-shrink-0"&gt;
 &lt;svg class="h-5 w-5 mt-0.5" fill="none" viewBox="0 0 24 24" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L4.082 15.5c-.77.833.192 2.5 1.732 2.5z" /&gt;
 &lt;/svg&gt;
 &lt;/div&gt;
 &lt;div class="ml-3 flex-1"&gt;
 
 &lt;h4 class="text-sm font-semibold mb-1"&gt;This is the v1.0 install method&lt;/h4&gt;
 
 &lt;div class="text-sm"&gt;
 Nimbus v2.0 changed the build tooling from Gulp to native Hugo Pipes +
PostCSS. If you&amp;rsquo;re starting a new site, follow the current
&lt;a href="https://k-s-pavan-kumar.github.io/hugo-nimbus/docs/installation/"&gt;Installation&lt;/a&gt; guide instead.
 &lt;/div&gt;
 &lt;/div&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="1-add-the-theme"&gt;1. Add the theme&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git submodule add https://github.com/your-org/hugo-theme-nimbus.git themes/nimbus
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="2-install-the-v10-gulp-toolchain"&gt;2. Install the v1.0 Gulp toolchain&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install -g gulp-cli
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gulp build
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This workflow is no longer maintained — see the current docs for the
PostCSS-based build.&lt;/p&gt;</description></item><item><title>Installation</title><link>https://k-s-pavan-kumar.github.io/hugo-nimbus/docs/installation/</link><pubDate>Tue, 05 Mar 2024 00:00:00 +0000</pubDate><guid>https://k-s-pavan-kumar.github.io/hugo-nimbus/docs/installation/</guid><description>&lt;h2 id="1-add-the-theme"&gt;1. Add the theme&lt;/h2&gt;
&lt;p&gt;As a Git submodule (recommended for most sites):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git submodule add https://github.com/your-org/hugo-theme-nimbus.git themes/nimbus
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Or as a Hugo Module:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hugo mod init github.com/you/your-site
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hugo mod get github.com/your-org/hugo-theme-nimbus
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="2-point-your-site-config-at-it"&gt;2. Point your site config at it&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;theme&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;nimbus&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="3-copy-the-build-tooling"&gt;3. Copy the build tooling&lt;/h2&gt;
&lt;p&gt;Nimbus&amp;rsquo;s styling is compiled with Tailwind, ahead of time, into a plain
CSS file — Hugo itself never runs Node or PostCSS. Copy these files from
&lt;code&gt;exampleSite/&lt;/code&gt; into your site root:&lt;/p&gt;</description></item><item><title>Shortcodes</title><link>https://k-s-pavan-kumar.github.io/hugo-nimbus/docs/shortcodes/</link><pubDate>Fri, 12 Apr 2024 00:00:00 +0000</pubDate><guid>https://k-s-pavan-kumar.github.io/hugo-nimbus/docs/shortcodes/</guid><description>&lt;h2 id="note-boxes"&gt;Note boxes&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;type&lt;/code&gt; can be &lt;code&gt;info&lt;/code&gt; (default), &lt;code&gt;warning&lt;/code&gt;, &lt;code&gt;success&lt;/code&gt;, or &lt;code&gt;error&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{&amp;lt; note type=&amp;#34;tip&amp;#34; title=&amp;#34;Pro tip&amp;#34; &amp;gt;}}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Your content here.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{&amp;lt; /note &amp;gt;}}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;






&lt;div class="alert alert-info"&gt;
 &lt;div class="flex items-start"&gt;
 &lt;div class="flex-shrink-0"&gt;
 &lt;svg class="h-5 w-5 mt-0.5" fill="none" viewBox="0 0 24 24" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z" /&gt;
 &lt;/svg&gt;
 &lt;/div&gt;
 &lt;div class="ml-3 flex-1"&gt;
 
 &lt;h4 class="text-sm font-semibold mb-1"&gt;Pro tip&lt;/h4&gt;
 
 &lt;div class="text-sm"&gt;
 &lt;code&gt;type&lt;/code&gt; can also be passed positionally, but not combined with &lt;code&gt;title=&lt;/code&gt; in the
same call — Hugo rejects mixing positional and named arguments.
 &lt;/div&gt;
 &lt;/div&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="terminal"&gt;Terminal&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{&amp;lt; terminal command=&amp;#34;bash&amp;#34; user=&amp;#34;dev&amp;#34; host=&amp;#34;prod-01&amp;#34; path=&amp;#34;~/app&amp;#34; &amp;gt;}}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get pods
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{&amp;lt; /terminal &amp;gt;}}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;




&lt;div class="terminal-container bg-gray-900 rounded-lg overflow-hidden shadow-lg my-6"&gt;
 
 &lt;div class="terminal-header bg-gray-800 px-4 py-2 flex items-center space-x-2"&gt;
 &lt;div class="flex space-x-2"&gt;
 &lt;div class="w-3 h-3 bg-red-500 rounded-full"&gt;&lt;/div&gt;
 &lt;div class="w-3 h-3 bg-yellow-500 rounded-full"&gt;&lt;/div&gt;
 &lt;div class="w-3 h-3 bg-green-500 rounded-full"&gt;&lt;/div&gt;
 &lt;/div&gt;
 &lt;div class="flex-1 text-center"&gt;
 &lt;span class="text-gray-400 text-sm font-mono"&gt;bash&lt;/span&gt;
 &lt;/div&gt;
 &lt;/div&gt;
 
 
 &lt;div class="terminal-content p-4 font-mono text-sm"&gt;
 &lt;div class="terminal-prompt text-green-400 mb-2"&gt;
 &lt;span class="text-blue-400"&gt;dev@prod-01&lt;/span&gt;:&lt;span class="text-purple-400"&gt;~/app&lt;/span&gt;$ 
 &lt;/div&gt;
 &lt;div class="terminal-output text-gray-100"&gt;
 kubectl get pods
NAME READY STATUS RESTARTS AGE
api-7d8f9c6b5d-x2k9p 1/1 Running 0 3m
 &lt;/div&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="badges"&gt;Badges&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{&amp;lt; badge &amp;#34;kubernetes&amp;#34; &amp;#34;Kubernetes v1.28&amp;#34; &amp;gt;}}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{&amp;lt; badge type=&amp;#34;terraform&amp;#34; label=&amp;#34;Terraform v1.5&amp;#34; url=&amp;#34;https://terraform.io&amp;#34; &amp;gt;}}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;







&lt;span class="inline-flex items-center gap-1 px-2.5 py-1 rounded-full text-xs font-medium bg-blue-50 text-blue-700 dark:bg-blue-900/30 dark:text-blue-300"&gt;Kubernetes v1.28&lt;/span&gt;

 
 
 
 
 
 
 
 
 &lt;span class="inline-flex items-center gap-1 px-2.5 py-1 rounded-full text-xs font-medium bg-sky-50 text-sky-700 dark:bg-sky-900/30 dark:text-sky-300"&gt;Docker&lt;/span&gt;
 
 
 
 
 
 
 
 
 
 &lt;a href="https://terraform.io" target="_blank" rel="noopener" class="inline-flex items-center gap-1 px-2.5 py-1 rounded-full text-xs font-medium bg-purple-50 text-purple-700 dark:bg-purple-900/30 dark:text-purple-300 hover:opacity-80 transition-opacity"&gt;Terraform v1.5&lt;/a&gt;
 
 
 
 
 
 
 
 
 
 &lt;span class="inline-flex items-center gap-1 px-2.5 py-1 rounded-full text-xs font-medium bg-orange-50 text-orange-700 dark:bg-orange-900/30 dark:text-orange-300"&gt;AWS&lt;/span&gt;
 
&lt;/p&gt;</description></item><item><title>API Reference</title><link>https://k-s-pavan-kumar.github.io/hugo-nimbus/docs/api-reference/</link><pubDate>Mon, 20 May 2024 00:00:00 +0000</pubDate><guid>https://k-s-pavan-kumar.github.io/hugo-nimbus/docs/api-reference/</guid><description>&lt;p&gt;This page is rendered entirely from the &lt;code&gt;openapi.yaml&lt;/code&gt; file sitting next to
it in this page bundle — no separate Swagger UI build step, no JS widget to
keep updated, just Hugo parsing the spec at build time.&lt;/p&gt;






 




&lt;div class="openapi-block my-8 border border-gray-200 dark:border-neutral-800 rounded-lg overflow-hidden"&gt;

 
 &lt;div class="px-5 py-4 bg-gray-50 dark:bg-neutral-900 border-b border-gray-200 dark:border-neutral-800"&gt;
 &lt;div class="flex items-center gap-3"&gt;
 &lt;h3 class="font-semibold text-gray-900 dark:text-white"&gt;Deploys API&lt;/h3&gt;
 &lt;span class="text-xs font-mono px-2 py-0.5 rounded-full bg-gray-200 dark:bg-neutral-700 text-gray-600 dark:text-gray-300"&gt;v1.0&lt;/span&gt;
 &lt;/div&gt;
 &lt;p class="text-sm text-gray-600 dark:text-gray-400 mt-1"&gt;Trigger and inspect deployments for a service.&lt;/p&gt;</description></item><item><title>Adopt GitOps for cluster configuration</title><link>https://k-s-pavan-kumar.github.io/hugo-nimbus/adr/0002-gitops-cluster-config/</link><pubDate>Sat, 01 Jun 2024 00:00:00 +0000</pubDate><guid>https://k-s-pavan-kumar.github.io/hugo-nimbus/adr/0002-gitops-cluster-config/</guid><description>&lt;h2 id="context"&gt;Context&lt;/h2&gt;
&lt;p&gt;Cluster configuration changes currently happen via direct &lt;code&gt;kubectl apply&lt;/code&gt;
from engineer laptops. We have no audit trail and drift between clusters is
common.&lt;/p&gt;
&lt;h2 id="decision"&gt;Decision&lt;/h2&gt;
&lt;p&gt;Adopt a GitOps workflow (Argo CD) where the Git repository is the single
source of truth for cluster state, and all changes go through pull request
review.&lt;/p&gt;
&lt;h2 id="consequences"&gt;Consequences&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Every config change is reviewable and revertible via Git history.&lt;/li&gt;
&lt;li&gt;Emergency changes need a documented break-glass procedure, since direct
&lt;code&gt;kubectl apply&lt;/code&gt; will be restricted in production namespaces.&lt;/li&gt;
&lt;li&gt;Requires migrating ~40 existing manifests into the GitOps repo before
enforcement can begin.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Use PostgreSQL as the primary datastore</title><link>https://k-s-pavan-kumar.github.io/hugo-nimbus/adr/0001-postgresql-primary-datastore/</link><pubDate>Sat, 10 Feb 2024 00:00:00 +0000</pubDate><guid>https://k-s-pavan-kumar.github.io/hugo-nimbus/adr/0001-postgresql-primary-datastore/</guid><description>&lt;h2 id="context"&gt;Context&lt;/h2&gt;
&lt;p&gt;We need a primary datastore for the new billing service. The team has
production experience with both PostgreSQL and MongoDB, and the data model
is relational (accounts, invoices, line items with foreign keys).&lt;/p&gt;
&lt;h2 id="decision"&gt;Decision&lt;/h2&gt;
&lt;p&gt;We will use PostgreSQL 16, managed via RDS, as the primary datastore for all
new services unless a specific workload has a strong document-store or
time-series justification.&lt;/p&gt;
&lt;h2 id="consequences"&gt;Consequences&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Schema migrations require a formal review (see &lt;code&gt;docs/migrations&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;We standardize on one connection-pooling strategy (PgBouncer) across
services, simplifying on-call runbooks.&lt;/li&gt;
&lt;li&gt;Document-shaped data (e.g. audit logs) will need a deliberate exception
request rather than defaulting to Postgres JSONB columns.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>About</title><link>https://k-s-pavan-kumar.github.io/hugo-nimbus/about/</link><pubDate>Mon, 01 Jan 2024 00:00:00 +0000</pubDate><guid>https://k-s-pavan-kumar.github.io/hugo-nimbus/about/</guid><description>&lt;p&gt;Nimbus is a Tailwind CSS Hugo theme built for DevOps knowledge hubs —
blog posts, sidebar-navigation docs, Architecture Decision Records, and
native OpenAPI reference docs, all in one theme.&lt;/p&gt;
&lt;p&gt;This site is the theme&amp;rsquo;s &lt;code&gt;exampleSite&lt;/code&gt; — a working demo you can build
locally to see every feature in context, and a template for your own site.&lt;/p&gt;
&lt;h2 id="whats-demonstrated-here"&gt;What&amp;rsquo;s demonstrated here&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://k-s-pavan-kumar.github.io/hugo-nimbus/blog/"&gt;Blog&lt;/a&gt;&lt;/strong&gt; — a standard post feed with tags,
categories, related posts, and social sharing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://k-s-pavan-kumar.github.io/hugo-nimbus/docs/"&gt;Documentation&lt;/a&gt;&lt;/strong&gt; — sidebar-navigation docs with
a version switcher, table of contents, and a full
&lt;a href="https://k-s-pavan-kumar.github.io/hugo-nimbus/docs/shortcodes/"&gt;shortcode reference&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://k-s-pavan-kumar.github.io/hugo-nimbus/adr/"&gt;Architecture Decision Records&lt;/a&gt;&lt;/strong&gt; — a
purpose-built content type for tracking infrastructure decisions.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;See the &lt;a href="https://k-s-pavan-kumar.github.io/hugo-nimbus/docs/installation/"&gt;Installation&lt;/a&gt; guide to use
Nimbus on your own site.&lt;/p&gt;</description></item><item><title>Building an Observability Stack with Prometheus and Grafana</title><link>https://k-s-pavan-kumar.github.io/hugo-nimbus/blog/post-3/</link><pubDate>Wed, 15 Mar 2023 11:00:00 -0700</pubDate><guid>https://k-s-pavan-kumar.github.io/hugo-nimbus/blog/post-3/</guid><description>&lt;p&gt;Most teams don&amp;rsquo;t have a metrics problem — they have a &lt;em&gt;too many
dashboards nobody looks at&lt;/em&gt; problem. This is the minimal setup we use to
go from &amp;ldquo;no visibility&amp;rdquo; to &amp;ldquo;useful alerts and three dashboards people
actually open during an incident.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;







&lt;span class="inline-flex items-center gap-1 px-2.5 py-1 rounded-full text-xs font-medium bg-sky-50 text-sky-700 dark:bg-sky-900/30 dark:text-sky-300"&gt;Prometheus v2.51&lt;/span&gt;

 
 
 
 
 
 
 
 
 &lt;a href="https://grafana.com" target="_blank" rel="noopener" class="inline-flex items-center gap-1 px-2.5 py-1 rounded-full text-xs font-medium bg-purple-50 text-purple-700 dark:bg-purple-900/30 dark:text-purple-300 hover:opacity-80 transition-opacity"&gt;Grafana v10.4&lt;/a&gt;
 
&lt;/p&gt;
&lt;p&gt;&lt;img src="bryce-canyon.jpg" alt="Bryce Canyon National Park"&gt;&lt;/p&gt;</description></item><item><title>Terraform State Management: Lessons from Production</title><link>https://k-s-pavan-kumar.github.io/hugo-nimbus/blog/post-2/</link><pubDate>Wed, 15 Feb 2023 10:00:00 -0700</pubDate><guid>https://k-s-pavan-kumar.github.io/hugo-nimbus/blog/post-2/</guid><description>&lt;p&gt;Local Terraform state works fine for a weekend project. It falls apart the
moment a second engineer runs &lt;code&gt;terraform apply&lt;/code&gt; against the same
infrastructure. Here&amp;rsquo;s the setup we settled on after a state file conflict
took down a staging environment for an afternoon.&lt;/p&gt;







&lt;div class="alert alert-warning"&gt;
 &lt;div class="flex items-start"&gt;
 &lt;div class="flex-shrink-0"&gt;
 &lt;svg class="h-5 w-5 mt-0.5" fill="none" viewBox="0 0 24 24" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L4.082 15.5c-.77.833.192 2.5 1.732 2.5z" /&gt;
 &lt;/svg&gt;
 &lt;/div&gt;
 &lt;div class="ml-3 flex-1"&gt;
 
 &lt;h4 class="text-sm font-semibold mb-1"&gt;State files contain secrets&lt;/h4&gt;
 
 &lt;div class="text-sm"&gt;
 Terraform state can include plaintext values for anything marked &lt;code&gt;sensitive&lt;/code&gt;
in your provider — database passwords, API keys, TLS private keys. Treat
your state backend&amp;rsquo;s access controls with the same care as a secrets
manager, not like a build artifact.
 &lt;/div&gt;
 &lt;/div&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="move-to-a-remote-backend"&gt;Move to a remote backend&lt;/h2&gt;
&lt;p&gt;A local &lt;code&gt;terraform.tfstate&lt;/code&gt; file has no locking and no history. The fix is
a remote backend with state locking built in:&lt;/p&gt;</description></item><item><title>Deploying with Kubernetes: A Practical Guide</title><link>https://k-s-pavan-kumar.github.io/hugo-nimbus/blog/post-1/</link><pubDate>Sun, 15 Jan 2023 09:00:00 -0700</pubDate><guid>https://k-s-pavan-kumar.github.io/hugo-nimbus/blog/post-1/</guid><description>&lt;p&gt;Getting a service running reliably on Kubernetes comes down to a handful of
building blocks: a container image, a Deployment, and a Service to expose it.
This walkthrough covers the essentials.&lt;/p&gt;







&lt;div class="alert alert-info"&gt;
 &lt;div class="flex items-start"&gt;
 &lt;div class="flex-shrink-0"&gt;
 &lt;svg class="h-5 w-5 mt-0.5" fill="none" viewBox="0 0 24 24" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z" /&gt;
 &lt;/svg&gt;
 &lt;/div&gt;
 &lt;div class="ml-3 flex-1"&gt;
 
 &lt;h4 class="text-sm font-semibold mb-1"&gt;Before you start&lt;/h4&gt;
 
 &lt;div class="text-sm"&gt;
 You&amp;rsquo;ll need &lt;code&gt;kubectl&lt;/code&gt; configured against a cluster (Minikube, kind, or a
managed cluster all work fine for this walkthrough).
 &lt;/div&gt;
 &lt;/div&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="1-build-and-tag-the-image"&gt;1. Build and tag the image&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker build -t registry.example.com/api:1.4.0 .
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker push registry.example.com/api:1.4.0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="2-define-the-deployment"&gt;2. Define the Deployment&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;apps/v1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Deployment&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;api&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;replicas&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;matchLabels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;api&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;api&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;containers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;api&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;registry.example.com/api:1.4.0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;containerPort&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;8080&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;readinessProbe&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;httpGet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;/healthz&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;8080&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="3-roll-it-out"&gt;3. Roll it out&lt;/h2&gt;





&lt;div class="terminal-container bg-gray-900 rounded-lg overflow-hidden shadow-lg my-6"&gt;
 
 &lt;div class="terminal-header bg-gray-800 px-4 py-2 flex items-center space-x-2"&gt;
 &lt;div class="flex space-x-2"&gt;
 &lt;div class="w-3 h-3 bg-red-500 rounded-full"&gt;&lt;/div&gt;
 &lt;div class="w-3 h-3 bg-yellow-500 rounded-full"&gt;&lt;/div&gt;
 &lt;div class="w-3 h-3 bg-green-500 rounded-full"&gt;&lt;/div&gt;
 &lt;/div&gt;
 &lt;div class="flex-1 text-center"&gt;
 &lt;span class="text-gray-400 text-sm font-mono"&gt;bash&lt;/span&gt;
 &lt;/div&gt;
 &lt;/div&gt;
 
 
 &lt;div class="terminal-content p-4 font-mono text-sm"&gt;
 &lt;div class="terminal-prompt text-green-400 mb-2"&gt;
 &lt;span class="text-blue-400"&gt;dev@k8s-master&lt;/span&gt;:&lt;span class="text-purple-400"&gt;~/api&lt;/span&gt;$ 
 &lt;/div&gt;
 &lt;div class="terminal-output text-gray-100"&gt;
 kubectl apply -f deployment.yaml
deployment.apps/api created
kubectl rollout status deployment/api
deployment &amp;ldquo;api&amp;rdquo; successfully rolled out
 &lt;/div&gt;
 &lt;/div&gt;
&lt;/div&gt;







&lt;div class="alert alert-warning"&gt;
 &lt;div class="flex items-start"&gt;
 &lt;div class="flex-shrink-0"&gt;
 &lt;svg class="h-5 w-5 mt-0.5" fill="none" viewBox="0 0 24 24" stroke="currentColor"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L4.082 15.5c-.77.833.192 2.5 1.732 2.5z" /&gt;
 &lt;/svg&gt;
 &lt;/div&gt;
 &lt;div class="ml-3 flex-1"&gt;
 
 &lt;h4 class="text-sm font-semibold mb-1"&gt;Watch your readiness probes&lt;/h4&gt;
 
 &lt;div class="text-sm"&gt;
 A missing or too-strict readiness probe is the most common cause of a rollout
that &amp;ldquo;succeeds&amp;rdquo; but serves traffic to pods that aren&amp;rsquo;t actually ready.
 &lt;/div&gt;
 &lt;/div&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="architecture"&gt;Architecture&lt;/h2&gt;

&lt;div class="my-6 rounded-lg border border-gray-200 dark:border-neutral-800 bg-white dark:bg-neutral-900 overflow-x-auto"&gt;
 
 &lt;div class="px-4 py-2 border-b border-gray-200 dark:border-neutral-800 text-sm font-medium text-gray-700 dark:text-gray-300"&gt;
 Request flow
 &lt;/div&gt;
 
 &lt;div class="mermaid p-4"&gt;

graph LR
 A[Client] --&gt; B[Ingress]
 B --&gt; C[Service]
 C --&gt; D[Pod 1]
 C --&gt; E[Pod 2]
 C --&gt; F[Pod 3]

 &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;That&amp;rsquo;s the core loop: build, define, apply, verify. From here you&amp;rsquo;d typically
add a HorizontalPodAutoscaler and wire this into CI so every merge to &lt;code&gt;main&lt;/code&gt;
triggers a new rollout automatically.&lt;/p&gt;</description></item></channel></rss>