<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://www.ashikmostofa.com/writing</id>
    <title>Ashik Mostofa Tonmoy — Notes from the Field</title>
    <updated>2026-09-19T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://www.ashikmostofa.com/writing"/>
    <subtitle>DevOps &amp; Platform Engineering field notes and hands-on guides.</subtitle>
    <icon>https://www.ashikmostofa.com/img/favicon.png</icon>
    <rights>Copyright © 2026 Ashik Mostofa Tonmoy</rights>
    <entry>
        <title type="html"><![CDATA[Azure workload identity on self-managed RKE2]]></title>
        <id>https://www.ashikmostofa.com/writing/rke2-azure-workload-identity</id>
        <link href="https://www.ashikmostofa.com/writing/rke2-azure-workload-identity"/>
        <updated>2026-09-19T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[AKS gives you workload identity. On plain VMs you build the issuer half yourself: the cluster serves its own JWKS and Entra federates to it.]]></summary>
        <content type="html"><![CDATA[<p>Managed Kubernetes hands you workload identity. AKS runs an OIDC issuer for the cluster, publishes its discovery documents, and Entra already trusts them — a pod gets an Azure token and nobody thinks about it.</p>
<p>On plain VMs, none of that exists. The nodes have no Azure identity to assume, and the workloads still need Key Vault and Blob Storage. The default answer at that point is a service principal secret in a Kubernetes Secret: a static cloud credential, sitting on a node, rotated by nobody.</p>
<p>There is a better answer, and the cluster already does most of it. Every Kubernetes cluster signs service-account tokens with a private key. Those tokens are already OIDC-shaped JWTs. Publish the public half over HTTPS, point Entra at it, and the cluster becomes an identity provider it always was.</p>
<p>This is what that took on a production RKE2 cluster running on bare VMs.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-actually-missing">What is actually missing<a href="https://www.ashikmostofa.com/writing/rke2-azure-workload-identity#what-is-actually-missing" class="hash-link" aria-label="Direct link to What is actually missing" title="Direct link to What is actually missing" translate="no">​</a></h2>

























<table><thead><tr><th>Piece</th><th>AKS</th><th>Self-managed</th></tr></thead><tbody><tr><td>Signing key</td><td>Cluster has one</td><td>Cluster has one — same key</td></tr><tr><td>Public discovery endpoint</td><td>Provided</td><td><strong>You serve it</strong></td></tr><tr><td>Trust registered in Entra</td><td>Provided</td><td><strong>You register it</strong></td></tr></tbody></table>
<p><strong>No new key material is introduced.</strong> You are not standing up Dex or Keycloak. You are exposing the public half of a key RKE2 already uses to sign every service-account token in the cluster.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="serving-discovery-from-the-cluster-itself">Serving discovery from the cluster itself<a href="https://www.ashikmostofa.com/writing/rke2-azure-workload-identity#serving-discovery-from-the-cluster-itself" class="hash-link" aria-label="Direct link to Serving discovery from the cluster itself" title="Direct link to Serving discovery from the cluster itself" translate="no">​</a></h2>
<p>Entra fetches the discovery document and the JWKS over the public internet when it validates a token. It has no VPN and no route into your network — and on this cluster the Kubernetes API is restricted at the provider firewall and reachable only over VPN, so the API server cannot serve them.</p>
<p>The common workaround is a public storage bucket. The alternative — and what this cluster does — is to serve discovery from the cluster itself: an <code>nginx:alpine</code> pod in an <code>oidc-issuer</code> namespace, serving two files out of ConfigMaps. One fewer external dependency, and one fewer place for the JWKS to go stale.</p>
<div class="language-nginx codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-nginx codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">server {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    listen 8080;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    location = /.well-known/openid-configuration {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        default_type application/json;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        alias /etc/oidc/openid-configuration.json;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    location = /openid/v1/jwks {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        default_type application/json;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        alias /etc/oidc/jwks.json;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div>
<p>Two static files and no application code. The discovery document is five fields:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"issuer"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"https://oidc.example.com/"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"jwks_uri"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"https://oidc.example.com/openid/v1/jwks"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"response_types_supported"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"id_token"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"subject_types_supported"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"public"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"id_token_signing_alg_values_supported"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"RS256"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p><strong>The trailing slash on <code>issuer</code> is load-bearing.</strong> It must match, character for character, the <code>service-account-issuer</code> on the API server and the <code>issuer</code> on every federated credential. Mismatch it and Entra returns an error about no matching federated identity record, which reads like a subject problem and is not.</p>
<p>This cluster runs no ingress controller — NGINX Gateway Fabric owns ports 80 and 443 — so the endpoint is exposed with an <code>HTTPRoute</code>, not an Ingress:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> gateway.networking.k8s.io/v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> HTTPRoute</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> oidc</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">issuer</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> oidc</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">issuer</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">parentRefs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ngf</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">gateway</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nginx</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">gateway</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">hostnames</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> oidc.example.com</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">rules</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">matches</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">path</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> PathPrefix</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">value</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">backendRefs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> oidc</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">issuer</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">80</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="building-the-jwks-from-rke2s-own-key">Building the JWKS from RKE2's own key<a href="https://www.ashikmostofa.com/writing/rke2-azure-workload-identity#building-the-jwks-from-rke2s-own-key" class="hash-link" aria-label="Direct link to Building the JWKS from RKE2's own key" title="Direct link to Building the JWKS from RKE2's own key" translate="no">​</a></h2>
<p>RKE2 keeps the service-account signing key at <code>/var/lib/rancher/rke2/server/tls/service.current.key</code>. Extract the public half, and build a JWKS with <code>azwi</code>:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Public key only — the private key never leaves the node</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">openssl rsa -in service.current.key -pubout -out sa.pub</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">azwi jwks --public-keys sa.pub --output-file jwks.json</span><br></div></code></pre></div></div>
<p>In the automation, the private key is slurped from the master, written to a <code>0600</code> temp file purely so <code>openssl</code> can read it, and <strong>deleted in the next task</strong>. It has no reason to exist on an operator's laptop for longer than one command.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tls-the-cert-manager-flag-that-is-not-optional">TLS: the cert-manager flag that is not optional<a href="https://www.ashikmostofa.com/writing/rke2-azure-workload-identity#tls-the-cert-manager-flag-that-is-not-optional" class="hash-link" aria-label="Direct link to TLS: the cert-manager flag that is not optional" title="Direct link to TLS: the cert-manager flag that is not optional" translate="no">​</a></h2>
<p>Entra requires HTTPS for the issuer, with a publicly valid certificate. A self-signed cert fails validation.</p>
<p>cert-manager solves that with Let's Encrypt — but because there is no ingress controller, the HTTP-01 challenge has to be solved through the Gateway:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> cert</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">manager.io/v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ClusterIssuer</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> letsencrypt</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">prod</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">acme</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">server</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//acme</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">v02.api.letsencrypt.org/directory</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">email</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> platform@example.com</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">privateKeySecretRef</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> letsencrypt</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">prod</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">solvers</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">http01</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">gatewayHTTPRoute</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">parentRefs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ngf</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">gateway</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nginx</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">gateway</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Gateway</span><br></div></code></pre></div></div>
<p><strong>The non-obvious part:</strong> Gateway API support in cert-manager needs the <code>--enable-gateway-api</code> controller flag on the deployment. Setting the <code>ExperimentalGatewayAPISupport</code> feature gate alone is <em>not</em> enough — the ACME challenge fails with <code>gateway api is not enabled</code>, which sounds like a cluster-level problem and is a missing argument.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">kubectl -n cert-manager get deploy cert-manager \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  -o jsonpath='{.spec.template.spec.containers[0].args}'</span><br></div></code></pre></div></div>
<p>That must contain <code>--enable-gateway-api</code>, and the startup log must list <code>gateway-shim</code> under enabled controllers — not <code>skipping disabled controller controller="gateway-shim"</code>. After adding the flag, delete the stuck <code>Certificate</code>, <code>Order</code> and <code>Challenge</code> so cert-manager re-issues; it will not retry a wedged order on its own.</p>
<p>One more guard, before any of this runs. The automation resolves the OIDC hostname against a public resolver and asserts it points at the master:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Verify OIDC domain resolves to this master before touching cert/ingress</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">ansible.builtin.assert</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">that</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> rke2_wi_resolved_ip == ansible_host</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">fail_msg</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> rke2_oidc_domain </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> resolves to </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> rke2_wi_resolved_ip </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      expected </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> ansible_host </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">. Fix DNS before continuing.</span><br></div></code></pre></div></div>
<p>Let's Encrypt rate-limits failed authorizations. A DNS record that has not propagated burns attempts you may want later the same day, and the failure surfaces minutes after the mistake rather than at the point of it.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-dual-issuer-and-the-outage-it-prevents">The dual issuer, and the outage it prevents<a href="https://www.ashikmostofa.com/writing/rke2-azure-workload-identity#the-dual-issuer-and-the-outage-it-prevents" class="hash-link" aria-label="Direct link to The dual issuer, and the outage it prevents" title="Direct link to The dual issuer, and the outage it prevents" translate="no">​</a></h2>
<p>This is the step that decides whether enabling federation is a maintenance window or a blip.</p>
<p><code>service-account-issuer</code> can be passed more than once. The <strong>first</strong> value mints new tokens; <strong>all</strong> values are accepted when validating:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># /etc/rancher/rke2/config.yaml</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kube-apiserver-arg</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"service-account-issuer=https://oidc.example.com/"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"service-account-issuer=https://kubernetes.default.svc.cluster.local"</span><br></div></code></pre></div></div>
<p>The external issuer is primary, so new projected tokens carry the <code>iss</code> Entra expects. RKE2's default issuer stays accepted, so every pod that started before the switch keeps authenticating.</p>
<p>Drop that second line and the API server 401s every existing service-account token the moment it restarts. Controllers crash-loop with <code>the server has asked for the client to provide credentials</code>, and it presents as a cluster-wide outage — because it is one.</p>
<p>Changing this line restarts <code>rke2-server</code> on the master: roughly a one to two minute API blip. Running pods and ingress traffic are unaffected.</p>
<p>Confirm the change took:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">kubectl create token default --duration=10m \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  | cut -d. -f2 | base64 -d 2&gt;/dev/null | jq '{iss, aud, sub}'</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-azure-side-once">The Azure side, once<a href="https://www.ashikmostofa.com/writing/rke2-azure-workload-identity#the-azure-side-once" class="hash-link" aria-label="Direct link to The Azure side, once" title="Direct link to The Azure side, once" translate="no">​</a></h2>
<p>The <code>azure-workload-identity</code> webhook mutates any pod labelled <code>azure.workload.identity/use: "true"</code>, injecting the projected token volume and the <code>AZURE_*</code> environment variables. Install it with the tenant ID and the pod spec stays clean.</p>
<p>Then, per workload identity:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">az identity federated-credential create \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --name eso-keyvault \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --identity-name "$MANAGED_IDENTITY" \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --resource-group "$RG" \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --issuer "https://oidc.example.com/" \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --subject "system:serviceaccount:external-secrets:external-secrets" \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --audiences "api://AzureADTokenExchange"</span><br></div></code></pre></div></div>
<p>Adding a second workload is four steps and no secrets: App Registration or managed identity, a federated credential whose subject is <code>system:serviceaccount:&lt;ns&gt;:&lt;sa&gt;</code>, the Azure role assignment, then annotate the service account with <code>azure.workload.identity/client-id</code> and label the pod.</p>
<p><strong>Do not wildcard the subject.</strong> One credential per service account. Otherwise any service account created in that namespace inherits access to your production Key Vault.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="external-secrets-operator-with-no-bootstrap-secret">External Secrets Operator, with no bootstrap secret<a href="https://www.ashikmostofa.com/writing/rke2-azure-workload-identity#external-secrets-operator-with-no-bootstrap-secret" class="hash-link" aria-label="Direct link to External Secrets Operator, with no bootstrap secret" title="Direct link to External Secrets Operator, with no bootstrap secret" translate="no">​</a></h2>
<p>Key Vault was the first consumer. ESO speaks workload identity natively, so the operator whose job is eliminating secrets no longer needs one of its own to start:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> external</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">secrets.io/v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ClusterSecretStore</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> azure</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">keyvault</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">app</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">dev</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">provider</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">azurekv</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">authType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> WorkloadIdentity</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">vaultUrl</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"https://&lt;vault&gt;.vault.azure.net"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">serviceAccountRef</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> external</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">secrets</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> external</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">secrets</span><br></div></code></pre></div></div>
<p>The same credential reaches <strong>any</strong> Azure resource behind Entra — Blob Storage, Service Bus, Cosmos. <code>DefaultAzureCredential</code> picks up the injected environment with no code change. Federation is configured once per workload, not once per Azure service.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="when-it-does-not-work">When it does not work<a href="https://www.ashikmostofa.com/writing/rke2-azure-workload-identity#when-it-does-not-work" class="hash-link" aria-label="Direct link to When it does not work" title="Direct link to When it does not work" translate="no">​</a></h2>
<p><strong><code>InvalidProviderConfig</code>, or a 400 from <code>login.microsoftonline.com</code>.</strong> Check, in order: the federated credential's subject is exactly <code>system:serviceaccount:&lt;ns&gt;:&lt;sa&gt;</code>; the issuer matches including the trailing slash; discovery returns 200 over <em>valid</em> HTTPS from outside your network:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">curl -s https://oidc.example.com/.well-known/openid-configuration | jq .</span><br></div></code></pre></div></div>
<p><strong>The service account is missing its annotations.</strong> The webhook injects nothing without <code>azure.workload.identity/client-id</code> and <code>tenant-id</code> on the SA. Roll the deployment after adding them — the mutation happens at pod creation, so existing pods keep the old spec.</p>
<p><strong>Signing keys rotated and the JWKS went stale.</strong> This one bites months later. Re-publishing the JWKS belongs in the same automation that rotates the key, not in a runbook.</p>
<p>Verify end to end with a real <code>ExternalSecret</code> against a known Key Vault entry and check <code>status.conditions</code> reports <code>Ready=True</code> / <code>SecretSynced</code>. A <code>ClusterSecretStore</code> can report healthy while no secret has actually been fetched.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-this-does-not-solve">What this does not solve<a href="https://www.ashikmostofa.com/writing/rke2-azure-workload-identity#what-this-does-not-solve" class="hash-link" aria-label="Direct link to What this does not solve" title="Direct link to What this does not solve" translate="no">​</a></h2>
<p>One static credential survives: the container registry.</p>
<p>Pulling images from a private registry is containerd's job, and containerd takes a static username and password. There is no federated path — the AKS-style keyless mechanism needs the nodes to be Azure VMs with IMDS, and these are not.</p>
<p>Worth stating plainly rather than implying the cluster is credential-free. It is not. It has exactly one static credential, in one place, with one narrow purpose, instead of a service principal secret in every namespace that needs a config value.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-it-is-worth-the-day">Why it is worth the day<a href="https://www.ashikmostofa.com/writing/rke2-azure-workload-identity#why-it-is-worth-the-day" class="hash-link" aria-label="Direct link to Why it is worth the day" title="Direct link to Why it is worth the day" translate="no">​</a></h2>
<p>No static cloud credential exists for any workload on these nodes. Not in a Secret, not in a config file, not in a CI variable. A compromised pod yields a token scoped to one service account, valid for an hour, useless anywhere else.</p>
<p>That property is what makes a self-managed cluster on bare VMs defensible to a security review that expects managed Kubernetes. The infrastructure is more exposed; the credential posture is better.</p>
<p>Managed Kubernetes gives you this for free, and free is the right price when it is available. When it is not — data residency, sovereignty, a provider with no managed offering — this is about a day of work, and it is the difference between "we handle secrets properly" and a service principal password in a YAML file somewhere.</p>]]></content>
        <author>
            <name>Ashik Mostofa Tonmoy</name>
            <email>tonmoy.ashik@gmail.com</email>
            <uri>https://ashikmostofa.com</uri>
        </author>
        <category label="kubernetes" term="kubernetes"/>
        <category label="rke2" term="rke2"/>
        <category label="azure" term="azure"/>
        <category label="security" term="security"/>
        <category label="oidc" term="oidc"/>
        <category label="devsecops" term="devsecops"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[The step that breaks CI/CD when you move to OIDC]]></title>
        <id>https://www.ashikmostofa.com/writing/cicd-oidc-federation</id>
        <link href="https://www.ashikmostofa.com/writing/cicd-oidc-federation"/>
        <updated>2026-09-18T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Deleting long-lived cloud keys from CI is the easy part. The subject claim is where the migration fails, and the error message points somewhere else.]]></summary>
        <content type="html"><![CDATA[<p>Long-lived cloud credentials in CI are the most reliably exploited secret in any organisation. They are copied into a settings page once, they never expire, and nothing tells you when one leaks. Federated identity — OIDC — removes them: the pipeline presents a short-lived token that the cloud verifies against your CI provider, and no static key exists to steal.</p>
<p>The migration is genuinely worth doing. It also fails, almost always, at exactly one step.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-actually-happening">What is actually happening<a href="https://www.ashikmostofa.com/writing/cicd-oidc-federation#what-is-actually-happening" class="hash-link" aria-label="Direct link to What is actually happening" title="Direct link to What is actually happening" translate="no">​</a></h2>
<p>Four parties, in order:</p>
<ol>
<li class=""><strong>Your CI job</strong> asks its provider for an identity token.</li>
<li class=""><strong>The CI provider</strong> issues a signed JWT describing the job: which repository, which branch, which environment.</li>
<li class=""><strong>Your cloud</strong> verifies that signature against the provider's public keys, then checks the claims inside against a trust policy you configured.</li>
<li class="">If the claims match, the cloud issues short-lived credentials.</li>
</ol>
<p>Step 4 is where people expect trouble. Step 3 is where trouble actually is.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-step-that-breaks-it">The step that breaks it<a href="https://www.ashikmostofa.com/writing/cicd-oidc-federation#the-step-that-breaks-it" class="hash-link" aria-label="Direct link to The step that breaks it" title="Direct link to The step that breaks it" translate="no">​</a></h2>
<p>The trust policy matches on the token's <strong>subject claim</strong> (<code>sub</code>). That claim is a structured string, and its exact shape depends on what triggered the workflow.</p>
<p>For GitHub Actions, the same repository produces different subjects depending on context:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">repo:my-org/my-repo:ref:refs/heads/main          # push to main</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">repo:my-org/my-repo:pull_request                 # pull request</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">repo:my-org/my-repo:environment:production       # job with an environment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">repo:my-org/my-repo:ref:refs/tags/v1.2.3         # tag push</span><br></div></code></pre></div></div>
<p>Configure the trust policy for <code>ref:refs/heads/main</code>, and everything works. Then someone opens a pull request, and the deploy job fails — because that job's token now says <code>pull_request</code>, which matches nothing in your policy.</p>
<p>The failure arrives as a permission error. That is misleading: permissions are fine, the role was never assumed. You will spend an hour widening IAM policies that were correct from the start.</p>
<p><strong>Print the claim before you debug anything else.</strong></p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">permissions</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">id-token</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> write     </span><span class="token comment" style="color:#999988;font-style:italic"># without this, no token is issued at all</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">contents</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> read</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">steps</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Show the actual subject claim</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">run</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">|</span><span class="token scalar string" style="color:#e3116c"></span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">      TOKEN=$(curl -sS \</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">        -H "Authorization: bearer $ACTIONS_ID_TOKEN_REQUEST_TOKEN" \</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">        "$ACTIONS_ID_TOKEN_REQUEST_URL&amp;audience=api://AzureADTokenExchange" \</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">        | jq -r '.value')</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">      echo "$TOKEN" | cut -d. -f2 | base64 -d 2&gt;/dev/null | jq '{sub, aud, repository, ref}'</span><br></div></code></pre></div></div>
<p>That prints what your cloud will see. Match the trust policy to <em>that</em> string, not to the one in the documentation example.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="configuring-the-trust-side">Configuring the trust side<a href="https://www.ashikmostofa.com/writing/cicd-oidc-federation#configuring-the-trust-side" class="hash-link" aria-label="Direct link to Configuring the trust side" title="Direct link to Configuring the trust side" translate="no">​</a></h2>
<p>AWS, with a condition per context you intend to allow:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"Effect"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Allow"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"Principal"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"Federated"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"arn:aws:iam::123456789012:oidc-provider/token.actions.githubusercontent.com"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"Action"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"sts:AssumeRoleWithWebIdentity"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"Condition"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"StringEquals"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"token.actions.githubusercontent.com:aud"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"sts.amazonaws.com"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"StringLike"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"token.actions.githubusercontent.com:sub"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"repo:my-org/my-repo:environment:production"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>Azure, as a federated credential on an app registration:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">az ad app federated-credential create \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --id "$APP_OBJECT_ID" \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --parameters '{</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    "name": "github-prod",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    "issuer": "https://token.actions.githubusercontent.com",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    "subject": "repo:my-org/my-repo:environment:production",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    "audiences": ["api://AzureADTokenExchange"]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }'</span><br></div></code></pre></div></div>
<p>One credential per subject. A pull-request workflow and a production deploy are two different identities, and that is the feature, not an inconvenience — it is what stops a PR from a fork reaching production.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="three-more-things-that-will-catch-you">Three more things that will catch you<a href="https://www.ashikmostofa.com/writing/cicd-oidc-federation#three-more-things-that-will-catch-you" class="hash-link" aria-label="Direct link to Three more things that will catch you" title="Direct link to Three more things that will catch you" translate="no">​</a></h2>
<p><strong><code>permissions: id-token: write</code> is required, and its absence is silent.</strong> Without it the runner cannot request a token at all. Worse, setting any <code>permissions:</code> block replaces the defaults rather than extending them, so adding <code>id-token: write</code> on its own can quietly remove the <code>contents: read</code> your checkout needed.</p>
<p><strong>Wildcards in <code>sub</code> are a security decision, not a convenience.</strong> <code>repo:my-org/my-repo:*</code> will make your pipeline pass. It also means any branch, in that repo, from anyone who can push one, can assume a production role. If you need several contexts, write several credentials.</p>
<p><strong>Forked pull requests do not get a token.</strong> By design — a fork could otherwise mint credentials against your cloud. Any workflow that needs cloud access on PRs has to run under <code>pull_request_target</code>, with all the care that carries, or not run on forks at all.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="do-it-in-this-order">Do it in this order<a href="https://www.ashikmostofa.com/writing/cicd-oidc-federation#do-it-in-this-order" class="hash-link" aria-label="Direct link to Do it in this order" title="Direct link to Do it in this order" translate="no">​</a></h2>
<ol>
<li class="">Add the federated credential for <strong>one</strong> workflow, in a non-production account.</li>
<li class="">Run it and print the subject claim. Fix the mismatch.</li>
<li class="">Add credentials for the remaining contexts, one per context.</li>
<li class="">Run both auth paths in parallel — OIDC and the old key — for one release cycle.</li>
<li class=""><strong>Delete the static key.</strong> If you skip this, you have added a system and removed no risk.</li>
</ol>
<p>Step 5 is the one that gets postponed indefinitely. The migration only pays for itself when the old credential no longer exists.</p>]]></content>
        <author>
            <name>Ashik Mostofa Tonmoy</name>
            <email>tonmoy.ashik@gmail.com</email>
            <uri>https://ashikmostofa.com</uri>
        </author>
        <category label="cicd" term="cicd"/>
        <category label="security" term="security"/>
        <category label="devsecops" term="devsecops"/>
        <category label="github-actions" term="github-actions"/>
        <category label="azure" term="azure"/>
        <category label="aws" term="aws"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Automated Security Scanning & DevSecOps]]></title>
        <id>https://www.ashikmostofa.com/writing/devsecops-security-guide</id>
        <link href="https://www.ashikmostofa.com/writing/devsecops-security-guide"/>
        <updated>2026-09-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[A practical DevSecOps guide: where SAST, DAST, SCA and container scanning belong in a CI/CD pipeline, which tools to use, and how to read the output.]]></summary>
        <content type="html"><![CDATA[<blockquote>
<p><em>A comprehensive learning resource for DevOps professionals, security teams, and developers new to automated security scanning</em></p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-table-of-contents">📋 Table of Contents<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#-table-of-contents" class="hash-link" aria-label="Direct link to 📋 Table of Contents" title="Direct link to 📋 Table of Contents" translate="no">​</a></h2>
<ol>
<li class=""><a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#introduction-to-devsecops" class="">Introduction to DevSecOps</a></li>
<li class=""><a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#your-current-pipeline-analysis" class="">Your Current Pipeline Analysis</a></li>
<li class=""><a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#core-security-scanning-types" class="">Core Security Scanning Types</a></li>
<li class=""><a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#devsecops-tools-deep-dive" class="">DevSecOps Tools Deep Dive</a></li>
<li class=""><a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#-security-trends--best-practices" class="">Security Trends &amp; Best Practices</a></li>
<li class=""><a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#implementation-guidelines" class="">Implementation Guidelines</a></li>
<li class=""><a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#pipeline-enhancement-recommendations" class="">Pipeline Enhancement Recommendations</a></li>
<li class=""><a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#metrics--monitoring" class="">Metrics &amp; Monitoring</a></li>
<li class=""><a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#troubleshooting--common-issues" class="">Troubleshooting &amp; Common Issues</a></li>
<li class=""><a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#future-proofing-your-security" class="">Future-Proofing Your Security</a></li>
</ol>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction-to-devsecops">🔐 Introduction to DevSecOps<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#introduction-to-devsecops" class="hash-link" aria-label="Direct link to 🔐 Introduction to DevSecOps" title="Direct link to 🔐 Introduction to DevSecOps" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-devsecops">What is DevSecOps?<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#what-is-devsecops" class="hash-link" aria-label="Direct link to What is DevSecOps?" title="Direct link to What is DevSecOps?" translate="no">​</a></h3>
<p><strong>DevSecOps</strong> (Development, Security, Operations) is a cultural and technical approach that integrates security practices throughout the software development lifecycle (SDLC). Unlike traditional approaches where security is an afterthought, DevSecOps embeds security from the very beginning.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-key-principles">🎯 Key Principles<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#-key-principles" class="hash-link" aria-label="Direct link to 🎯 Key Principles" title="Direct link to 🎯 Key Principles" translate="no">​</a></h3>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-benefits-of-devsecops">🚀 Benefits of DevSecOps<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#-benefits-of-devsecops" class="hash-link" aria-label="Direct link to 🚀 Benefits of DevSecOps" title="Direct link to 🚀 Benefits of DevSecOps" translate="no">​</a></h3>



































<table><thead><tr><th>Benefit</th><th>Traditional Security</th><th>DevSecOps</th></tr></thead><tbody><tr><td><strong>Vulnerability Detection</strong></td><td>End of development cycle</td><td>Throughout development</td></tr><tr><td><strong>Fix Cost</strong></td><td>100x more expensive</td><td>10x less expensive</td></tr><tr><td><strong>Time to Market</strong></td><td>Delayed by security reviews</td><td>Accelerated with embedded security</td></tr><tr><td><strong>Team Collaboration</strong></td><td>Siloed security team</td><td>Cross-functional integration</td></tr><tr><td><strong>Compliance</strong></td><td>Manual audits</td><td>Automated compliance checks</td></tr></tbody></table>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="your-current-pipeline-analysis">🔍 Your Current Pipeline Analysis<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#your-current-pipeline-analysis" class="hash-link" aria-label="Direct link to 🔍 Your Current Pipeline Analysis" title="Direct link to 🔍 Your Current Pipeline Analysis" translate="no">​</a></h2>
<p>Based on your GitHub Actions workflow, here's an analysis of your current security implementation:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="current-security-tools-in-your-pipeline">Current Security Tools in Your Pipeline<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#current-security-tools-in-your-pipeline" class="hash-link" aria-label="Direct link to Current Security Tools in Your Pipeline" title="Direct link to Current Security Tools in Your Pipeline" translate="no">​</a></h3>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="security-coverage-assessment">Security Coverage Assessment<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#security-coverage-assessment" class="hash-link" aria-label="Direct link to Security Coverage Assessment" title="Direct link to Security Coverage Assessment" translate="no">​</a></h3>





















































<table><thead><tr><th>Security Area</th><th>Current Tool</th><th>Coverage Level</th><th>Enhancement Needed</th></tr></thead><tbody><tr><td><strong>Secret Detection</strong></td><td>Gitleaks</td><td>✅ Good</td><td>Add pre-commit hooks</td></tr><tr><td><strong>Dependency Scanning</strong></td><td>OWASP Dependency Check + Track</td><td>✅ Excellent</td><td>Consider license compliance</td></tr><tr><td><strong>Code Quality &amp; Security</strong></td><td>SonarQube</td><td>✅ Good</td><td>Add custom security rules</td></tr><tr><td><strong>Container Security</strong></td><td>Trivy</td><td>✅ Good</td><td>Add runtime protection</td></tr><tr><td><strong>Infrastructure Security</strong></td><td>❌ Missing</td><td>⚠️ Gap</td><td>Add IaC scanning</td></tr><tr><td><strong>API Security</strong></td><td>❌ Missing</td><td>⚠️ Gap</td><td>Add DAST tools</td></tr><tr><td><strong>Runtime Security</strong></td><td>❌ Missing</td><td>⚠️ Gap</td><td>Add monitoring tools</td></tr></tbody></table>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="core-security-scanning-types">🛡️ Core Security Scanning Types<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#core-security-scanning-types" class="hash-link" aria-label="Direct link to 🛡️ Core Security Scanning Types" title="Direct link to 🛡️ Core Security Scanning Types" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="sast-vs-dast-vs-sca-vs-iast-comparison">SAST vs DAST vs SCA vs IAST Comparison<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#sast-vs-dast-vs-sca-vs-iast-comparison" class="hash-link" aria-label="Direct link to SAST vs DAST vs SCA vs IAST Comparison" title="Direct link to SAST vs DAST vs SCA vs IAST Comparison" translate="no">​</a></h3>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-static-application-security-testing-sast">1. Static Application Security Testing (SAST)<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#1-static-application-security-testing-sast" class="hash-link" aria-label="Direct link to 1. Static Application Security Testing (SAST)" title="Direct link to 1. Static Application Security Testing (SAST)" translate="no">​</a></h3>
<p><strong>When to Use:</strong> Early in development, during code commits and builds</p>
<p><strong>Tools in Your Pipeline:</strong> SonarQube</p>
<p><strong>What it Does:</strong></p>
<ul>
<li class="">Analyzes source code without executing it</li>
<li class="">Identifies vulnerabilities like SQL injection, XSS, buffer overflows</li>
<li class="">Provides exact line numbers and fix recommendations</li>
</ul>
<p><strong>Best Practices:</strong></p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Example SonarQube configuration enhancement</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">sonar.security.hotspots.maxFileSize=1000000</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">sonar.security.review.rating.A=80</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">sonar.security.review.rating.B=70</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">sonar.security.review.rating.C=50</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">sonar.security.review.rating.D=30</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-dynamic-application-security-testing-dast">2. Dynamic Application Security Testing (DAST)<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#2-dynamic-application-security-testing-dast" class="hash-link" aria-label="Direct link to 2. Dynamic Application Security Testing (DAST)" title="Direct link to 2. Dynamic Application Security Testing (DAST)" translate="no">​</a></h3>
<p><strong>When to Use:</strong> After application deployment, in testing environments</p>
<p><strong>Current Gap:</strong> Missing from your pipeline</p>
<p><strong>What it Does:</strong></p>
<ul>
<li class="">Tests running applications from external perspective</li>
<li class="">Simulates real-world attacks</li>
<li class="">Finds runtime vulnerabilities missed by SAST</li>
</ul>
<p><strong>Recommended Tools:</strong></p>
<ul>
<li class="">OWASP ZAP (Open source)</li>
<li class="">Burp Suite (Commercial)</li>
<li class="">Rapid7 AppSpider</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-software-composition-analysis-sca">3. Software Composition Analysis (SCA)<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#3-software-composition-analysis-sca" class="hash-link" aria-label="Direct link to 3. Software Composition Analysis (SCA)" title="Direct link to 3. Software Composition Analysis (SCA)" translate="no">​</a></h3>
<p><strong>When to Use:</strong> Throughout development lifecycle</p>
<p><strong>Tools in Your Pipeline:</strong> OWASP Dependency Check, OWASP Dependency Track</p>
<p><strong>What it Does:</strong></p>
<ul>
<li class="">Scans third-party libraries and dependencies</li>
<li class="">Identifies known vulnerabilities (CVEs)</li>
<li class="">Tracks license compliance</li>
<li class="">Monitors supply chain security</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-container-security-scanning">4. Container Security Scanning<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#4-container-security-scanning" class="hash-link" aria-label="Direct link to 4. Container Security Scanning" title="Direct link to 4. Container Security Scanning" translate="no">​</a></h3>
<p><strong>When to Use:</strong> Before and after container deployment</p>
<p><strong>Tools in Your Pipeline:</strong> Trivy</p>
<p><strong>What it Does:</strong></p>
<ul>
<li class="">Scans container images for vulnerabilities</li>
<li class="">Checks base image security</li>
<li class="">Identifies misconfigurations</li>
<li class="">Monitors runtime behavior</li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="devsecops-tools-deep-dive">🔧 DevSecOps Tools Deep Dive<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#devsecops-tools-deep-dive" class="hash-link" aria-label="Direct link to 🔧 DevSecOps Tools Deep Dive" title="Direct link to 🔧 DevSecOps Tools Deep Dive" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="secret-detection-gitleaks">Secret Detection: Gitleaks<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#secret-detection-gitleaks" class="hash-link" aria-label="Direct link to Secret Detection: Gitleaks" title="Direct link to Secret Detection: Gitleaks" translate="no">​</a></h3>
<p><strong>Purpose:</strong> Prevents sensitive information leaks in repositories</p>
<p><strong>Configuration Example:</strong></p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># .gitleaks.toml</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">extend</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">useDefault = true</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">rules</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">description = "Custom API Key Pattern"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">regex = '''(</span><span class="token punctuation" style="color:#393A34">?</span><span class="token plain">i)api</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">_</span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">?</span><span class="token plain">key</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">_</span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">?</span><span class="token plain">=</span><span class="token punctuation" style="color:#393A34">?</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">'"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain">\s</span><span class="token punctuation" style="color:#393A34">?</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">0</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">9a</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">zA</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">Z</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">{</span><span class="token number" style="color:#36acaa">32</span><span class="token punctuation" style="color:#393A34">,</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">'''</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">tags = </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"key"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"API"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">allowlist</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">paths = </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    '''go\.sum'''</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    '''\.git/'''</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">]</span><br></div></code></pre></div></div>
<p><strong>Best Practices:</strong></p>
<ul>
<li class="">Run as pre-commit hook</li>
<li class="">Scan entire Git history</li>
<li class="">Use custom regex patterns for organization-specific secrets</li>
<li class="">Integrate with CI/CD pipeline</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dependency-management-owasp-tools">Dependency Management: OWASP Tools<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#dependency-management-owasp-tools" class="hash-link" aria-label="Direct link to Dependency Management: OWASP Tools" title="Direct link to Dependency Management: OWASP Tools" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="owasp-dependency-check">OWASP Dependency Check<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#owasp-dependency-check" class="hash-link" aria-label="Direct link to OWASP Dependency Check" title="Direct link to OWASP Dependency Check" translate="no">​</a></h4>
<p><strong>Purpose:</strong> Identifies known vulnerabilities in dependencies</p>
<p><strong>Enhanced Configuration:</strong></p>
<div class="language-xml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-xml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">plugin</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">groupId</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">org.owasp</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">groupId</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">artifactId</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">dependency-check-maven</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">artifactId</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">version</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">8.4.0</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">version</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">configuration</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">failBuildOnCVSS</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">7</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">failBuildOnCVSS</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">suppressionFile</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">suppressions.xml</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">suppressionFile</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">format</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">ALL</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">format</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">nodeAnalyzerEnabled</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">true</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">nodeAnalyzerEnabled</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">ossindexAnalyzerEnabled</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">true</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">ossindexAnalyzerEnabled</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">configuration</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">plugin</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="owasp-dependency-track">OWASP Dependency Track<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#owasp-dependency-track" class="hash-link" aria-label="Direct link to OWASP Dependency Track" title="Direct link to OWASP Dependency Track" translate="no">​</a></h4>
<p><strong>Purpose:</strong> Continuous monitoring of component risks</p>
<p><strong>Features:</strong></p>
<ul>
<li class="">Software Bill of Materials (SBOM) management</li>
<li class="">Risk assessment and scoring</li>
<li class="">Policy enforcement</li>
<li class="">Vulnerability notifications</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="code-quality--security-sonarqube">Code Quality &amp; Security: SonarQube<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#code-quality--security-sonarqube" class="hash-link" aria-label="Direct link to Code Quality &amp; Security: SonarQube" title="Direct link to Code Quality &amp; Security: SonarQube" translate="no">​</a></h3>
<p><strong>Enhanced Security Rules Configuration:</strong></p>
<div class="language-properties codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-properties codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># sonar-project.properties</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">sonar.security.hotspots.inherit=NONE</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">sonar.security.review.rating=A</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">sonar.coverage.exclusions=**/test/**,**/config/**</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">sonar.security.inclusions=**/src/**</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Custom security rules</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">sonar.java.checkstyle.reportPaths=target/checkstyle-result.xml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">sonar.java.pmd.reportPaths=target/pmd.xml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">sonar.java.spotbugs.reportPaths=target/spotbugsXml.xml</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="container-security-trivy">Container Security: Trivy<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#container-security-trivy" class="hash-link" aria-label="Direct link to Container Security: Trivy" title="Direct link to Container Security: Trivy" translate="no">​</a></h3>
<p><strong>Enhanced Configuration:</strong></p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Enhanced Trivy scanning</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Run Trivy vulnerability scanner</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">uses</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> aquasecurity/trivy</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">action@master</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">with</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">image-ref</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> env.REGISTRY </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">latest</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">format</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'cyclonedx'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">output</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'trivy-results.json'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">severity</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'CRITICAL,HIGH,MEDIUM'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">ignore-unfixed</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">scanners</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'vuln,secret,misconfig,license'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Upload Trivy scan results to GitHub Security tab</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">uses</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> github/codeql</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">action/upload</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">sarif@v2</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">with</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">sarif_file</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'trivy-results.sarif'</span><br></div></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-security-trends--best-practices">📈 Security Trends &amp; Best Practices<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#-security-trends--best-practices" class="hash-link" aria-label="Direct link to 📈 Security Trends &amp; Best Practices" title="Direct link to 📈 Security Trends &amp; Best Practices" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="key-trends-shaping-devsecops">Key Trends Shaping DevSecOps<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#key-trends-shaping-devsecops" class="hash-link" aria-label="Direct link to Key Trends Shaping DevSecOps" title="Direct link to Key Trends Shaping DevSecOps" translate="no">​</a></h3>
<p>Modern DevSecOps emphasizes automation, AI-driven security, and policy-as-code frameworks, with organizations adopting shift-left security practices and continuous monitoring to ensure that security vulnerabilities are identified and addressed during the coding phase rather than post-deployment.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-shift-everywhere-security">1. Shift-Everywhere Security<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#1-shift-everywhere-security" class="hash-link" aria-label="Direct link to 1. Shift-Everywhere Security" title="Direct link to 1. Shift-Everywhere Security" translate="no">​</a></h4>
<!-- -->
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-ai-powered-security-analysis">2. AI-Powered Security Analysis<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#2-ai-powered-security-analysis" class="hash-link" aria-label="Direct link to 2. AI-Powered Security Analysis" title="Direct link to 2. AI-Powered Security Analysis" translate="no">​</a></h4>
<p>AI and machine learning are transforming DevSecOps by making security smarter and faster, with generative AI becoming the backbone of automation to help teams test more efficiently and zero in on potential risks.</p>
<p><strong>AI-Enhanced Features:</strong></p>
<ul>
<li class="">Intelligent vulnerability prioritization</li>
<li class="">Automated fix suggestions</li>
<li class="">Anomaly detection in runtime</li>
<li class="">False positive reduction</li>
<li class="">Predictive threat modeling</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-policy-as-code-implementation">3. Policy-as-Code Implementation<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#3-policy-as-code-implementation" class="hash-link" aria-label="Direct link to 3. Policy-as-Code Implementation" title="Direct link to 3. Policy-as-Code Implementation" translate="no">​</a></h4>
<p>Organizations are turning to policy as code (PaC) where security policies are written as code, allowing for automated enforcement and real-time validation within the DevSecOps pipeline.</p>
<p><strong>Example OPA Policy:</strong></p>
<div class="language-rego codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rego codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># security-policy.rego</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">package main</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Deny containers running as root</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">deny[msg] {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    input.spec.securityContext.runAsUser == 0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    msg := "Container must not run as root user"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Require security scanning labels</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">deny[msg] {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    not input.metadata.labels["security-scan"]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    msg := "Container must have security-scan label"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="security-tool-categories">Security Tool Categories<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#security-tool-categories" class="hash-link" aria-label="Direct link to Security Tool Categories" title="Direct link to Security Tool Categories" translate="no">​</a></h3>





















































<table><thead><tr><th>Category</th><th>Purpose</th><th>Recommended Tools</th><th>Integration Point</th></tr></thead><tbody><tr><td><strong>SAST</strong></td><td>Code vulnerability analysis</td><td>SonarQube, Checkmarx, Veracode</td><td>Pre-commit, CI/CD</td></tr><tr><td><strong>DAST</strong></td><td>Runtime testing</td><td>OWASP ZAP, Burp Suite, Rapid7</td><td>Staging, Production</td></tr><tr><td><strong>SCA</strong></td><td>Dependency management</td><td>Snyk, WhiteSource, OWASP DC</td><td>Build, Monitor</td></tr><tr><td><strong>Container</strong></td><td>Image &amp; runtime security</td><td>Trivy, Aqua, Twistlock</td><td>Build, Deploy, Runtime</td></tr><tr><td><strong>IaC</strong></td><td>Infrastructure scanning</td><td>Checkov, Terrascan, Bridgecrew</td><td>Pre-deploy</td></tr><tr><td><strong>Secrets</strong></td><td>Credential protection</td><td>GitLeaks, GitGuardian, Vault</td><td>Pre-commit, CI/CD</td></tr><tr><td><strong>API</strong></td><td>API security testing</td><td>Pynt, Postman, InsightAppSec</td><td>Testing, Production</td></tr></tbody></table>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="implementation-guidelines">🛠️ Implementation Guidelines<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#implementation-guidelines" class="hash-link" aria-label="Direct link to 🛠️ Implementation Guidelines" title="Direct link to 🛠️ Implementation Guidelines" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="phase-1-foundation-weeks-1-2">Phase 1: Foundation (Weeks 1-2)<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#phase-1-foundation-weeks-1-2" class="hash-link" aria-label="Direct link to Phase 1: Foundation (Weeks 1-2)" title="Direct link to Phase 1: Foundation (Weeks 1-2)" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-enhance-secret-scanning">1. Enhance Secret Scanning<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#1-enhance-secret-scanning" class="hash-link" aria-label="Direct link to 1. Enhance Secret Scanning" title="Direct link to 1. Enhance Secret Scanning" translate="no">​</a></h4>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Add to your pipeline</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Install Gitleaks</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">run</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">|</span><span class="token scalar string" style="color:#e3116c"></span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">    wget https://github.com/gitleaks/gitleaks/releases/download/v8.18.0/gitleaks_8.18.0_linux_x64.tar.gz</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">    tar -xzf gitleaks_8.18.0_linux_x64.tar.gz</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">    chmod +x gitleaks</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Run Gitleaks with custom rules</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">run</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">|</span><span class="token scalar string" style="color:#e3116c"></span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">    ./gitleaks detect --source . --config .gitleaks.toml --report-format json --report-path gitleaks-report.json</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-improve-sonarqube-configuration">2. Improve SonarQube Configuration<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#2-improve-sonarqube-configuration" class="hash-link" aria-label="Direct link to 2. Improve SonarQube Configuration" title="Direct link to 2. Improve SonarQube Configuration" translate="no">​</a></h4>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Enhanced SonarQube Analysis</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">uses</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> SonarSource/sonarqube</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">scan</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">action@master</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">env</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">SONAR_TOKEN</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> secrets.SONAR_TOKEN </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">SONAR_HOST_URL</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> vars.SONAR_HOST_URL </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">with</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">args</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token scalar string" style="color:#e3116c"></span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">      -Dsonar.projectKey=springboot-project</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">      -Dsonar.projectName=springboot-project</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">      -Dsonar.sources=src/main/java</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">      -Dsonar.tests=src/test/java</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">      -Dsonar.java.binaries=target/classes</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">      -Dsonar.coverage.jacoco.xmlReportPaths=target/site/jacoco/jacoco.xml</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">      -Dsonar.dependencyCheck.jsonReportPath=target/dependency-check-report.json</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">      -Dsonar.security.hotspots.inherit=NONE</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">      -Dsonar.qualitygate.wait=true</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="phase-2-infrastructure-security-weeks-3-4">Phase 2: Infrastructure Security (Weeks 3-4)<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#phase-2-infrastructure-security-weeks-3-4" class="hash-link" aria-label="Direct link to Phase 2: Infrastructure Security (Weeks 3-4)" title="Direct link to Phase 2: Infrastructure Security (Weeks 3-4)" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-add-infrastructure-as-code-scanning">1. Add Infrastructure as Code Scanning<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#1-add-infrastructure-as-code-scanning" class="hash-link" aria-label="Direct link to 1. Add Infrastructure as Code Scanning" title="Direct link to 1. Add Infrastructure as Code Scanning" translate="no">​</a></h4>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">iac-security</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">needs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> checkout</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">runs-on</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ubuntu</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">latest</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">steps</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">uses</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> actions/checkout@v4</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Run Checkov</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">uses</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> bridgecrewio/checkov</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">action@master</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">with</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">directory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> .</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">framework</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> terraform</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">dockerfile</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">kubernetes</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">output_format</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> sarif</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">output_file_path</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> checkov</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">results.sarif</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Upload Checkov results to GitHub Security tab</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">uses</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> github/codeql</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">action/upload</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">sarif@v2</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">with</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">sarif_file</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> checkov</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">results.sarif</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-add-kubernetes-security-scanning">2. Add Kubernetes Security Scanning<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#2-add-kubernetes-security-scanning" class="hash-link" aria-label="Direct link to 2. Add Kubernetes Security Scanning" title="Direct link to 2. Add Kubernetes Security Scanning" translate="no">​</a></h4>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">k8s-security</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">needs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> build</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">runs-on</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ubuntu</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">latest</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">steps</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">uses</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> actions/checkout@v4</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Run Kubesec</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">run</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">|</span><span class="token scalar string" style="color:#e3116c"></span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">        docker run -v $(pwd):/app kubesec/kubesec:latest scan /app/k8s/*.yaml</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="phase-3-api-security-weeks-5-6">Phase 3: API Security (Weeks 5-6)<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#phase-3-api-security-weeks-5-6" class="hash-link" aria-label="Direct link to Phase 3: API Security (Weeks 5-6)" title="Direct link to Phase 3: API Security (Weeks 5-6)" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-add-dast-scanning">1. Add DAST Scanning<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#1-add-dast-scanning" class="hash-link" aria-label="Direct link to 1. Add DAST Scanning" title="Direct link to 1. Add DAST Scanning" translate="no">​</a></h4>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">dast-scan</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">needs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> smoke</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">test</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">runs-on</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ubuntu</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">latest</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">steps</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Checkout code</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">uses</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> actions/checkout@v4</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Run OWASP ZAP Baseline Scan</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">uses</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> zaproxy/action</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">baseline@v0.7.0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">with</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">target</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'http://localhost:8080'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">rules_file_name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.zap/rules.tsv'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">cmd_options</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'-a'</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-api-security-testing">2. API Security Testing<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#2-api-security-testing" class="hash-link" aria-label="Direct link to 2. API Security Testing" title="Direct link to 2. API Security Testing" translate="no">​</a></h4>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">api-security</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">needs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> dast</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">scan</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">runs-on</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ubuntu</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">latest</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">steps</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> API Security Scan</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">run</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">|</span><span class="token scalar string" style="color:#e3116c"></span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">        docker run --rm -v $(pwd):/app \</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">          -e TARGET_URL=http://localhost:8080/api \</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">          pynt-io/pynt:latest scan</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="phase-4-runtime-security-weeks-7-8">Phase 4: Runtime Security (Weeks 7-8)<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#phase-4-runtime-security-weeks-7-8" class="hash-link" aria-label="Direct link to Phase 4: Runtime Security (Weeks 7-8)" title="Direct link to Phase 4: Runtime Security (Weeks 7-8)" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-add-runtime-monitoring">1. Add Runtime Monitoring<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#1-add-runtime-monitoring" class="hash-link" aria-label="Direct link to 1. Add Runtime Monitoring" title="Direct link to 1. Add Runtime Monitoring" translate="no">​</a></h4>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">runtime-security</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">if</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> github.ref == 'refs/heads/main'</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">needs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> deploy</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">runs-on</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ubuntu</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">latest</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">steps</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Deploy Falco Runtime Security</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">run</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">|</span><span class="token scalar string" style="color:#e3116c"></span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">        kubectl apply -f https://raw.githubusercontent.com/falcosecurity/falco/master/examples/k8s_audit_config/audit-policy.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">        helm repo add falcosecurity https://falcosecurity.github.io/charts</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">        helm install falco falcosecurity/falco</span><br></div></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="pipeline-enhancement-recommendations">🎯 Pipeline Enhancement Recommendations<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#pipeline-enhancement-recommendations" class="hash-link" aria-label="Direct link to 🎯 Pipeline Enhancement Recommendations" title="Direct link to 🎯 Pipeline Enhancement Recommendations" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="enhanced-security-pipeline-architecture">Enhanced Security Pipeline Architecture<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#enhanced-security-pipeline-architecture" class="hash-link" aria-label="Direct link to Enhanced Security Pipeline Architecture" title="Direct link to Enhanced Security Pipeline Architecture" translate="no">​</a></h3>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="security-gates-and-quality-criteria">Security Gates and Quality Criteria<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#security-gates-and-quality-criteria" class="hash-link" aria-label="Direct link to Security Gates and Quality Criteria" title="Direct link to Security Gates and Quality Criteria" translate="no">​</a></h3>















































<table><thead><tr><th>Stage</th><th>Security Gate</th><th>Failure Criteria</th><th>Action</th></tr></thead><tbody><tr><td><strong>Pre-commit</strong></td><td>Secret Detection</td><td>Any secrets found</td><td>Block commit</td></tr><tr><td><strong>Build</strong></td><td>SAST Analysis</td><td>Security rating &lt; B</td><td>Fail build</td></tr><tr><td><strong>Build</strong></td><td>SCA Scan</td><td>Critical CVE score &gt; 9.0</td><td>Fail build</td></tr><tr><td><strong>Test</strong></td><td>DAST Scan</td><td>High severity issues</td><td>Manual review required</td></tr><tr><td><strong>Deploy</strong></td><td>Container Scan</td><td>Critical vulnerabilities</td><td>Block deployment</td></tr><tr><td><strong>Runtime</strong></td><td>Anomaly Detection</td><td>Suspicious behavior</td><td>Alert &amp; investigate</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="tool-integration-matrix">Tool Integration Matrix<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#tool-integration-matrix" class="hash-link" aria-label="Direct link to Tool Integration Matrix" title="Direct link to Tool Integration Matrix" translate="no">​</a></h3>
<!-- -->
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="metrics--monitoring">📊 Metrics &amp; Monitoring<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#metrics--monitoring" class="hash-link" aria-label="Direct link to 📊 Metrics &amp; Monitoring" title="Direct link to 📊 Metrics &amp; Monitoring" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="key-security-metrics-to-track">Key Security Metrics to Track<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#key-security-metrics-to-track" class="hash-link" aria-label="Direct link to Key Security Metrics to Track" title="Direct link to Key Security Metrics to Track" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-vulnerability-metrics">1. Vulnerability Metrics<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#1-vulnerability-metrics" class="hash-link" aria-label="Direct link to 1. Vulnerability Metrics" title="Direct link to 1. Vulnerability Metrics" translate="no">​</a></h4>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Example metrics configuration</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">security_metrics</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">vulnerability_density</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">formula</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"total_vulnerabilities / lines_of_code * 1000"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">target</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"&lt; 1 vulnerability per 1000 LoC"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">mean_time_to_fix</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">formula</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"sum(fix_time) / count(vulnerabilities)"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">target</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"&lt; 48 hours for critical, &lt; 7 days for high"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">security_debt</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">formula</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"open_vulnerabilities * severity_weight"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">target</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"&lt; 100 security debt points"</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-pipeline-security-metrics">2. Pipeline Security Metrics<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#2-pipeline-security-metrics" class="hash-link" aria-label="Direct link to 2. Pipeline Security Metrics" title="Direct link to 2. Pipeline Security Metrics" translate="no">​</a></h4>









































<table><thead><tr><th>Metric</th><th>Current State</th><th>Target</th><th>Trend</th></tr></thead><tbody><tr><td><strong>Secret Detection Rate</strong></td><td>95%</td><td>100%</td><td>↗️</td></tr><tr><td><strong>False Positive Rate</strong></td><td>15%</td><td>&lt;5%</td><td>↘️</td></tr><tr><td><strong>Security Scan Coverage</strong></td><td>80%</td><td>95%</td><td>↗️</td></tr><tr><td><strong>Mean Time to Fix (Critical)</strong></td><td>72h</td><td>&lt;24h</td><td>↘️</td></tr><tr><td><strong>Security Gate Pass Rate</strong></td><td>85%</td><td>95%</td><td>↗️</td></tr></tbody></table>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-security-dashboard-configuration">3. Security Dashboard Configuration<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#3-security-dashboard-configuration" class="hash-link" aria-label="Direct link to 3. Security Dashboard Configuration" title="Direct link to 3. Security Dashboard Configuration" translate="no">​</a></h4>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Grafana dashboard configuration example</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">security_dashboard</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">panels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">title</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Vulnerability Trends"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"graph"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">targets</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">expr</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'vulnerability_count{severity="critical"}'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">expr</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'vulnerability_count{severity="high"}'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">title</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Security Scan Results"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"stat"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">targets</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">expr</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'scan_success_rate'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">expr</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'scan_duration_avg'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">title</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Top Vulnerable Components"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"table"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">targets</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">expr</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'topk(10, vulnerability_count by (component))'</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="monitoring-and-alerting">Monitoring and Alerting<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#monitoring-and-alerting" class="hash-link" aria-label="Direct link to Monitoring and Alerting" title="Direct link to Monitoring and Alerting" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-critical-alert-rules">1. Critical Alert Rules<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#1-critical-alert-rules" class="hash-link" aria-label="Direct link to 1. Critical Alert Rules" title="Direct link to 1. Critical Alert Rules" translate="no">​</a></h4>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Prometheus alerting rules</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">groups</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> security.rules</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">rules</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">alert</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> CriticalVulnerabilityFound</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">expr</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> vulnerability_count</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">severity="critical"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token plain"> 0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">for</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 0m</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">labels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">severity</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> critical</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">annotations</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">summary</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Critical vulnerability detected in {{ $labels.component }}"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">alert</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> SecurityScanFailure</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">expr</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> security_scan_success_rate &lt; 0.95</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">for</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 5m</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">labels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">severity</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> warning</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">annotations</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">summary</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Security scan success rate below threshold"</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-integration-with-incident-response">2. Integration with Incident Response<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#2-integration-with-incident-response" class="hash-link" aria-label="Direct link to 2. Integration with Incident Response" title="Direct link to 2. Integration with Incident Response" translate="no">​</a></h4>
<!-- -->
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="troubleshooting--common-issues">🚨 Troubleshooting &amp; Common Issues<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#troubleshooting--common-issues" class="hash-link" aria-label="Direct link to 🚨 Troubleshooting &amp; Common Issues" title="Direct link to 🚨 Troubleshooting &amp; Common Issues" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="common-security-tool-issues">Common Security Tool Issues<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#common-security-tool-issues" class="hash-link" aria-label="Direct link to Common Security Tool Issues" title="Direct link to Common Security Tool Issues" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-high-false-positive-rates">1. High False Positive Rates<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#1-high-false-positive-rates" class="hash-link" aria-label="Direct link to 1. High False Positive Rates" title="Direct link to 1. High False Positive Rates" translate="no">​</a></h4>
<p><strong>Problem:</strong> Security tools generating too many false positives
<strong>Solution:</strong></p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># SonarQube false positive management</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Configure SonarQube exclusions</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">run</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">|</span><span class="token scalar string" style="color:#e3116c"></span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">    echo "sonar.security.excludeUnknown=true" &gt;&gt; sonar-project.properties</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">    echo "sonar.exclusions=**/test/**,**/mock/**" &gt;&gt; sonar-project.properties</span><br></div></code></pre></div></div>
<p><strong>Trivy False Positive Suppression:</strong></p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># .trivyignore</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">CVE</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">2023</span><span class="token punctuation" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">12345</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># False positive - patched in our base image</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">CVE</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">2023</span><span class="token punctuation" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">67890</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># Not applicable to our use case</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-performance-issues">2. Performance Issues<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#2-performance-issues" class="hash-link" aria-label="Direct link to 2. Performance Issues" title="Direct link to 2. Performance Issues" translate="no">​</a></h4>
<p><strong>Problem:</strong> Security scans taking too long
<strong>Solutions:</strong></p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Parallel security scanning</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">security-scans</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">strategy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">matrix</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">tool</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">sast</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> sca</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> container</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> secrets</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">runs-on</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ubuntu</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">latest</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">steps</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Run $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> matrix.tool </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> scan</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">run</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">|</span><span class="token scalar string" style="color:#e3116c"></span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">        case ${{ matrix.tool }} in</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">          sast) run-sonarqube-scan ;;</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">          sca) run-dependency-check ;;</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">          container) run-trivy-scan ;;</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">          secrets) run-gitleaks-scan ;;</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">        esac</span><br></div></code></pre></div></div>
<p><strong>Incremental Scanning:</strong></p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Only scan changed files</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Get changed files</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> changed</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">files</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">uses</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> tj</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">actions/changed</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">files@v37</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Run incremental SAST</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">if</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> steps.changed</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">files.outputs.any_changed == 'true'</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">run</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">|</span><span class="token scalar string" style="color:#e3116c"></span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">    sonar-scanner -Dsonar.inclusions="${{ steps.changed-files.outputs.all_changed_files }}"</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-integration-failures">3. Integration Failures<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#3-integration-failures" class="hash-link" aria-label="Direct link to 3. Integration Failures" title="Direct link to 3. Integration Failures" translate="no">​</a></h4>
<p><strong>Problem:</strong> Tools not integrating properly with CI/CD
<strong>Debug Steps:</strong></p>
<ol>
<li class=""><strong>Check Tool Versions</strong></li>
</ol>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Debug tool versions</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">run</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">|</span><span class="token scalar string" style="color:#e3116c"></span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">    echo "SonarQube Scanner version:"</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">    sonar-scanner --version</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">    echo "Trivy version:"</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">    trivy --version</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">    echo "Maven version:"</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">    mvn --version</span><br></div></code></pre></div></div>
<ol start="2">
<li class=""><strong>Validate Configuration</strong></li>
</ol>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Validate security tool configs</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">run</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">|</span><span class="token scalar string" style="color:#e3116c"></span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">    # Validate SonarQube connection</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">    curl -u ${{ secrets.SONAR_TOKEN }}: ${{ vars.SONAR_HOST_URL }}/api/system/status</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># Test OWASP Dependency Track connection</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    curl </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">X GET "$</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> vars.OWASP_DTRACK_HOST_URL </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">/api/version" \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">-H "X-Api-Key</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> secrets.OWASP_DTRACK_KEY </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">"</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="security-tool-configuration-best-practices">Security Tool Configuration Best Practices<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#security-tool-configuration-best-practices" class="hash-link" aria-label="Direct link to Security Tool Configuration Best Practices" title="Direct link to Security Tool Configuration Best Practices" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-error-handling-and-retry-logic">1. Error Handling and Retry Logic<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#1-error-handling-and-retry-logic" class="hash-link" aria-label="Direct link to 1. Error Handling and Retry Logic" title="Direct link to 1. Error Handling and Retry Logic" translate="no">​</a></h4>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Run security scan with retry</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">uses</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nick</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">invision/retry@v2</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">with</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">timeout_minutes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">max_attempts</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">retry_on</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> error</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">command</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">|</span><span class="token scalar string" style="color:#e3116c"></span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">      trivy image --exit-code 1 --severity HIGH,CRITICAL ${{ env.REGISTRY }}:latest</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-graceful-degradation">2. Graceful Degradation<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#2-graceful-degradation" class="hash-link" aria-label="Direct link to 2. Graceful Degradation" title="Direct link to 2. Graceful Degradation" translate="no">​</a></h4>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Security scan with fallback</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">run</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">|</span><span class="token scalar string" style="color:#e3116c"></span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">    # Try primary scanner</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">    if ! trivy image ${{ env.REGISTRY }}:latest; then</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">      echo "Primary scanner failed, trying backup"</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">      # Use alternative scanner or skip with warning</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">      echo "⚠️ Security scan failed - manual review required"</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">      exit 0</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">    fi</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">continue-on-error</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><br></div></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="future-proofing-your-security">🔮 Future-Proofing Your Security<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#future-proofing-your-security" class="hash-link" aria-label="Direct link to 🔮 Future-Proofing Your Security" title="Direct link to 🔮 Future-Proofing Your Security" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="emerging-technologies-to-watch">Emerging Technologies to Watch<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#emerging-technologies-to-watch" class="hash-link" aria-label="Direct link to Emerging Technologies to Watch" title="Direct link to Emerging Technologies to Watch" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-ai-powered-security-tools">1. AI-Powered Security Tools<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#1-ai-powered-security-tools" class="hash-link" aria-label="Direct link to 1. AI-Powered Security Tools" title="Direct link to 1. AI-Powered Security Tools" translate="no">​</a></h4>
<p>Generative AI is moving DevSecOps from shift-left to shift-everywhere, with AI-assisted tooling helping teams test more efficiently and focus on the risks that matter.</p>
<p><strong>Integration Example:</strong></p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">ai-security-analysis</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">runs-on</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ubuntu</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">latest</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">steps</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> AI</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">Powered Vulnerability Analysis</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">uses</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> codacy/codacy</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">analysis</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">cli</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">action@master</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">with</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">project-token</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> secrets.CODACY_PROJECT_TOKEN </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">upload</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">max-allowed-issues</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2147483647</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-supply-chain-security-evolution">2. Supply Chain Security Evolution<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#2-supply-chain-security-evolution" class="hash-link" aria-label="Direct link to 2. Supply Chain Security Evolution" title="Direct link to 2. Supply Chain Security Evolution" translate="no">​</a></h4>
<p><strong>SLSA (Supply-chain Levels for Software Artifacts) Implementation:</strong></p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Generate SLSA Provenance</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">uses</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> slsa</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">framework/slsa</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">github</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">generator/.github/workflows/generator_generic_slsa3.yml@v1.7.0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">with</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">base64-subjects</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"${{ steps.hash.outputs.hashes }}"</span><br></div></code></pre></div></div>
<p><strong>Sigstore Integration:</strong></p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Sign container image</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">uses</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> sigstore/cosign</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">installer@v3.0.5</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Sign the published Docker image</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">run</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">|</span><span class="token scalar string" style="color:#e3116c"></span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">    cosign sign --yes ${{ env.REGISTRY }}:${{ github.sha }}</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-zero-trust-architecture-implementation">3. Zero Trust Architecture Implementation<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#3-zero-trust-architecture-implementation" class="hash-link" aria-label="Direct link to 3. Zero Trust Architecture Implementation" title="Direct link to 3. Zero Trust Architecture Implementation" translate="no">​</a></h4>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="roadmap-for-next-6-months">Roadmap for Next 6 Months<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#roadmap-for-next-6-months" class="hash-link" aria-label="Direct link to Roadmap for Next 6 Months" title="Direct link to Roadmap for Next 6 Months" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="quarter-1-foundation-enhancement">Quarter 1: Foundation Enhancement<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#quarter-1-foundation-enhancement" class="hash-link" aria-label="Direct link to Quarter 1: Foundation Enhancement" title="Direct link to Quarter 1: Foundation Enhancement" translate="no">​</a></h4>
<ul class="contains-task-list containsTaskList_mC6p">
<li class="task-list-item"><input type="checkbox" disabled=""> Implement pre-commit security hooks</li>
<li class="task-list-item"><input type="checkbox" disabled=""> Add IaC security scanning (Checkov/Terrascan)</li>
<li class="task-list-item"><input type="checkbox" disabled=""> Enhance secret management with HashiCorp Vault</li>
<li class="task-list-item"><input type="checkbox" disabled=""> Implement security metrics dashboard</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="quarter-2-advanced-protection">Quarter 2: Advanced Protection<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#quarter-2-advanced-protection" class="hash-link" aria-label="Direct link to Quarter 2: Advanced Protection" title="Direct link to Quarter 2: Advanced Protection" translate="no">​</a></h4>
<ul class="contains-task-list containsTaskList_mC6p">
<li class="task-list-item"><input type="checkbox" disabled=""> Add DAST scanning with OWASP ZAP</li>
<li class="task-list-item"><input type="checkbox" disabled=""> Implement API security testing</li>
<li class="task-list-item"><input type="checkbox" disabled=""> Add runtime security monitoring (Falco)</li>
<li class="task-list-item"><input type="checkbox" disabled=""> Integrate with SIEM solution</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="continuous-improvement-framework">Continuous Improvement Framework<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#continuous-improvement-framework" class="hash-link" aria-label="Direct link to Continuous Improvement Framework" title="Direct link to Continuous Improvement Framework" translate="no">​</a></h3>
<!-- -->
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-additional-resources">📚 Additional Resources<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#-additional-resources" class="hash-link" aria-label="Direct link to 📚 Additional Resources" title="Direct link to 📚 Additional Resources" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-essential-links">🔗 Essential Links<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#-essential-links" class="hash-link" aria-label="Direct link to 🔗 Essential Links" title="Direct link to 🔗 Essential Links" translate="no">​</a></h3>
<ul>
<li class=""><a href="https://owasp.org/www-project-devsecops-guideline/" target="_blank" rel="noopener noreferrer" class="">OWASP DevSecOps Guideline</a></li>
<li class=""><a href="https://csrc.nist.gov/Projects/ssdf" target="_blank" rel="noopener noreferrer" class="">NIST Secure Software Development Framework</a></li>
<li class=""><a href="https://www.cisecurity.org/controls" target="_blank" rel="noopener noreferrer" class="">CIS Controls for DevSecOps</a></li>
<li class=""><a href="https://cloudsecurityalliance.org/working-groups/devsecops/" target="_blank" rel="noopener noreferrer" class="">Cloud Security Alliance DevSecOps Working Group</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-recommended-reading">📖 Recommended Reading<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#-recommended-reading" class="hash-link" aria-label="Direct link to 📖 Recommended Reading" title="Direct link to 📖 Recommended Reading" translate="no">​</a></h3>
<ol>
<li class=""><strong>"DevSecOps for Dummies"</strong> - IBM Limited Edition</li>
<li class=""><strong>"Securing DevOps"</strong> by Julien Vehent</li>
<li class=""><strong>"Container Security"</strong> by Liz Rice</li>
<li class=""><strong>"Infrastructure as Code Security"</strong> by Various Authors</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-training-and-certifications">🎓 Training and Certifications<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#-training-and-certifications" class="hash-link" aria-label="Direct link to 🎓 Training and Certifications" title="Direct link to 🎓 Training and Certifications" translate="no">​</a></h3>



































<table><thead><tr><th>Certification</th><th>Provider</th><th>Focus Area</th><th>Duration</th></tr></thead><tbody><tr><td><strong>Certified DevSecOps Professional</strong></td><td>DevSecOps Institute</td><td>General DevSecOps</td><td>3-6 months</td></tr><tr><td><strong>AWS Security Specialty</strong></td><td>Amazon</td><td>Cloud Security</td><td>2-4 months</td></tr><tr><td><strong>Certified Kubernetes Security Specialist</strong></td><td>CNCF</td><td>Container Security</td><td>1-3 months</td></tr><tr><td><strong>CISSP</strong></td><td>(ISC)²</td><td>Information Security</td><td>6-12 months</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-tool-specific-resources">🛠️ Tool-Specific Resources<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#%EF%B8%8F-tool-specific-resources" class="hash-link" aria-label="Direct link to 🛠️ Tool-Specific Resources" title="Direct link to 🛠️ Tool-Specific Resources" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="sonarqube">SonarQube<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#sonarqube" class="hash-link" aria-label="Direct link to SonarQube" title="Direct link to SonarQube" translate="no">​</a></h4>
<ul>
<li class=""><a href="https://docs.sonarqube.org/" target="_blank" rel="noopener noreferrer" class="">Official Documentation</a></li>
<li class=""><a href="https://docs.sonarqube.org/latest/user-guide/security-rules/" target="_blank" rel="noopener noreferrer" class="">Security Rules Reference</a></li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="owasp-tools">OWASP Tools<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#owasp-tools" class="hash-link" aria-label="Direct link to OWASP Tools" title="Direct link to OWASP Tools" translate="no">​</a></h4>
<ul>
<li class=""><a href="https://owasp.org/www-project-dependency-check/" target="_blank" rel="noopener noreferrer" class="">Dependency Check Documentation</a></li>
<li class=""><a href="https://www.zaproxy.org/getting-started/" target="_blank" rel="noopener noreferrer" class="">ZAP Getting Started</a></li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="trivy">Trivy<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#trivy" class="hash-link" aria-label="Direct link to Trivy" title="Direct link to Trivy" translate="no">​</a></h4>
<ul>
<li class=""><a href="https://github.com/aquasecurity/trivy" target="_blank" rel="noopener noreferrer" class="">Official GitHub Repository</a></li>
<li class=""><a href="https://aquasecurity.github.io/trivy/" target="_blank" rel="noopener noreferrer" class="">Configuration Examples</a></li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-contributing-to-security">🤝 Contributing to Security<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#-contributing-to-security" class="hash-link" aria-label="Direct link to 🤝 Contributing to Security" title="Direct link to 🤝 Contributing to Security" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="security-champion-program">Security Champion Program<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#security-champion-program" class="hash-link" aria-label="Direct link to Security Champion Program" title="Direct link to Security Champion Program" translate="no">​</a></h3>
<p>Consider establishing a Security Champion program in your organization:</p>
<ol>
<li class=""><strong>Identify Champions:</strong> Select 1-2 developers per team</li>
<li class=""><strong>Provide Training:</strong> Regular security training and updates</li>
<li class=""><strong>Assign Responsibilities:</strong> Code review, tool configuration, incident response</li>
<li class=""><strong>Regular Meetings:</strong> Monthly security discussions and knowledge sharing</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="community-participation">Community Participation<a href="https://www.ashikmostofa.com/writing/devsecops-security-guide#community-participation" class="hash-link" aria-label="Direct link to Community Participation" title="Direct link to Community Participation" translate="no">​</a></h3>
<ul>
<li class="">Contribute to open-source security tools</li>
<li class="">Participate in security conferences and meetups</li>
<li class="">Share your experiences through blog posts or presentations</li>
<li class="">Join DevSecOps communities and forums</li>
</ul>
<hr>
<p><strong>📧 Questions or Feedback?</strong></p>
<p>This guide is a living document. Please contribute improvements, report issues, or suggest enhancements to help the entire DevSecOps community.</p>
<hr>
<hr>
<p><em>Written while teaching DevOps to 800+ engineers across 12 cohorts.</em></p>]]></content>
        <author>
            <name>Ashik Mostofa Tonmoy</name>
            <email>tonmoy.ashik@gmail.com</email>
            <uri>https://ashikmostofa.com</uri>
        </author>
        <category label="guide" term="guide"/>
        <category label="devsecops" term="devsecops"/>
        <category label="security" term="security"/>
        <category label="cicd" term="cicd"/>
        <category label="sast" term="sast"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Why your Kubernetes cluster costs 3x too much]]></title>
        <id>https://www.ashikmostofa.com/writing/kubernetes-cluster-cost-3x</id>
        <link href="https://www.ashikmostofa.com/writing/kubernetes-cluster-cost-3x"/>
        <updated>2026-09-12T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Requests set from guesswork, non-production billing overnight, baseline load at on-demand rates, and resources nobody can safely delete. In that order.]]></summary>
        <content type="html"><![CDATA[<p>A cluster that costs three times what it should is rarely running three times the workload. It is usually running the right workload, badly sized, on the wrong pricing model, with a layer of things nobody is willing to delete.</p>
<p>I audit these estates for a living. The findings repeat, and they repeat in a predictable order of severity. Here they are, with the reasoning behind each.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-requests-are-a-guess-that-nobody-revisited">1. Requests are a guess that nobody revisited<a href="https://www.ashikmostofa.com/writing/kubernetes-cluster-cost-3x#1-requests-are-a-guess-that-nobody-revisited" class="hash-link" aria-label="Direct link to 1. Requests are a guess that nobody revisited" title="Direct link to 1. Requests are a guess that nobody revisited" translate="no">​</a></h2>
<p>Someone shipped a service. They needed numbers for <code>resources.requests</code>, so they picked numbers. Those numbers are still there.</p>
<p>This matters more than it sounds, because requests — not actual usage — are what the scheduler packs against. A pod requesting 2 CPU and using 0.2 occupies 2 CPU worth of schedulable space on that node. Ten of those, and you are paying for a node that is 90% idle and 100% full.</p>
<p>Start by finding the gap between requested and used:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># What each pod is actually consuming</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl top pods --all-namespaces --sort-by=cpu</span><br></div></code></pre></div></div>
<p><code>kubectl top</code> is a point-in-time reading, so do not resize off one sample. Use a week of Prometheus history and size against a high percentile — not the peak, not the mean:</p>
<div class="language-promql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-promql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">quantile_over_time(0.95,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  rate(container_cpu_usage_seconds_total{namespace="prod",container!=""}[5m])[7d:5m]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">)</span><br></div></code></pre></div></div>
<p>P95 over a week gives you a request that absorbs normal spikes without paying for the one pathological Tuesday. On an audit of an enterprise SaaS estate, rightsizing against observed utilization rather than provisioning-time guesses was the single largest line item in a <strong>~40% reduction</strong> — and no capacity was removed to get it.</p>
<p><strong>Where this goes wrong:</strong> rightsizing memory is not symmetric with CPU. A container over its CPU request gets throttled; a container over its memory limit gets OOM-killed. Be aggressive on CPU requests, conservative on memory limits.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-non-production-runs-at-3am">2. Non-production runs at 3am<a href="https://www.ashikmostofa.com/writing/kubernetes-cluster-cost-3x#2-non-production-runs-at-3am" class="hash-link" aria-label="Direct link to 2. Non-production runs at 3am" title="Direct link to 2. Non-production runs at 3am" translate="no">​</a></h2>
<p>Development and staging clusters typically serve people in roughly one working day, in roughly one set of time zones. Left alone, they bill for all 168 hours in the week.</p>
<p>A five-day, ten-hour working window is 50 of those 168 hours. Everything else is a nightly charge for an idle environment.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Scale a non-prod namespace to zero outside working hours</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> batch/v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> CronJob</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> scale</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">down</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">nonprod</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> platform</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">schedule</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"0 20 * * 1-5"</span><span class="token plain">   </span><span class="token comment" style="color:#999988;font-style:italic"># 20:00, weekdays — cluster timezone</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">jobTemplate</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">template</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">serviceAccountName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> scaler</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">restartPolicy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> OnFailure</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">containers</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> kubectl</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> bitnami/kubectl</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">latest</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">command</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"/bin/sh"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"-c"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">args</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> kubectl scale deploy </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">l cost.scaledown=allowed </span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">replicas=0 </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">n staging</span><br></div></code></pre></div></div>
<p>Pair it with a scale-up job at the start of the working day. Two caveats before you ship this:</p>
<ul>
<li class=""><strong>Do not use <code>--all</code>.</strong> Anything running a migration, a queue consumer draining a backlog, or a nightly integration suite will be stopped mid-flight. Select on a label, as above, and let teams opt a workload out by removing it.</li>
<li class=""><strong>Scaling deployments to zero does not release nodes.</strong> The cluster autoscaler has to reclaim them, and it will not evict pods with local storage or restrictive PodDisruptionBudgets. If your node count does not follow your replica count down, that is where to look.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-steady-baseline-load-paid-at-on-demand-rates">3. Steady baseline load paid at on-demand rates<a href="https://www.ashikmostofa.com/writing/kubernetes-cluster-cost-3x#3-steady-baseline-load-paid-at-on-demand-rates" class="hash-link" aria-label="Direct link to 3. Steady baseline load paid at on-demand rates" title="Direct link to 3. Steady baseline load paid at on-demand rates" translate="no">​</a></h2>
<p>Every cluster has a floor — the capacity that is running at 4am on a Sunday because it always is. Paying on-demand rates for that floor is paying a premium for flexibility you provably are not using.</p>
<p>Three tiers, mapped to three kinds of workload:</p>

























<table><thead><tr><th>Workload</th><th>Pricing model</th><th>Why</th></tr></thead><tbody><tr><td>The floor that never goes away</td><td>Reserved / committed use</td><td>Predictable by definition. Commit and take the discount.</td></tr><tr><td>Normal daytime variation</td><td>On-demand</td><td>You are buying elasticity, and here you actually use it.</td></tr><tr><td>Batch, CI, training, anything restartable</td><td>Spot / preemptible</td><td>Interruption is an inconvenience, not an outage.</td></tr></tbody></table>
<p>The third row is where the largest untapped savings usually sit, and the reason is cultural rather than technical: the first time a spot node is reclaimed mid-job, someone files an incident, and the team quietly moves everything back to on-demand. Set the expectation <em>before</em> you migrate, not after the first reclaim.</p>
<p>Separate the tiers with node pools and let workloads choose:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">tolerations</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">key</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"spot"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">operator</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Equal"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">value</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"true"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">effect</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"NoSchedule"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">affinity</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">nodeAffinity</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">requiredDuringSchedulingIgnoredDuringExecution</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">nodeSelectorTerms</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">matchExpressions</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">key</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"workload-class"</span><span class="token plain">   </span><span class="token comment" style="color:#999988;font-style:italic"># label your spot pool with this</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token key atrule" style="color:#00a4db">operator</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> In</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token key atrule" style="color:#00a4db">values</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"spot"</span><span class="token punctuation" style="color:#393A34">]</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-untagged-resources-which-is-the-one-that-compounds">4. Untagged resources, which is the one that compounds<a href="https://www.ashikmostofa.com/writing/kubernetes-cluster-cost-3x#4-untagged-resources-which-is-the-one-that-compounds" class="hash-link" aria-label="Direct link to 4. Untagged resources, which is the one that compounds" title="Direct link to 4. Untagged resources, which is the one that compounds" translate="no">​</a></h2>
<p>The first three are sizing problems. This one is different in kind, and it is why estates regress after a successful optimization.</p>
<p>Without ownership metadata, <em>"is this safe to delete?"</em> has no answer. Nobody deletes anything that might belong to someone else, so nothing gets deleted, and waste accumulates permanently. On an estate of 100+ projects, untagged resources were the root difficulty — not the biggest single number, but the reason the other numbers kept coming back.</p>
<p>The fix is a provisioning requirement, not a cleanup script. Make ownership a condition of creation:</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># A variable with no default cannot be omitted</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">variable "owner_team" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  type        = string</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  description = "Team accountable for this resource's cost."</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">resource "azurerm_resource_group" "app" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  name     = var.name</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  location = var.location</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  tags = {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    owner       = var.owner_team</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    environment = var.environment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    cost_center = var.cost_center</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    managed_by  = "terraform"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div>
<p>Enforce it at the policy layer too, so resources created outside Terraform cannot skip it — Azure Policy, AWS SCPs, or an admission controller such as Kyverno for in-cluster objects.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-part-that-actually-determines-whether-it-lasts">The part that actually determines whether it lasts<a href="https://www.ashikmostofa.com/writing/kubernetes-cluster-cost-3x#the-part-that-actually-determines-whether-it-lasts" class="hash-link" aria-label="Direct link to The part that actually determines whether it lasts" title="Direct link to The part that actually determines whether it lasts" translate="no">​</a></h2>
<p>An audit is the easy half. Any competent engineer with read access to a billing console can find the waste in a week.</p>
<p>The reason most cost programmes regress within two quarters is that the finding was delivered as a number, and a number is not an owner. What stops the climb is making spend visible and attributable continuously — in the format the finance and delivery teams already use, not a dashboard someone has to remember to open. Adoption beats elegance, every time.</p>
<p>On the estate above, spend is <strong>still ~33% below the original baseline</strong> while the platform's workload has grown. That durability came from the tagging policy and the cost reporting, not from the rightsizing. The rightsizing produced the drop; the governance is why it stayed down.</p>
<p>If you cut before you can attribute, you will cut again next year.</p>]]></content>
        <author>
            <name>Ashik Mostofa Tonmoy</name>
            <email>tonmoy.ashik@gmail.com</email>
            <uri>https://ashikmostofa.com</uri>
        </author>
        <category label="kubernetes" term="kubernetes"/>
        <category label="cost-optimization" term="cost-optimization"/>
        <category label="finops" term="finops"/>
        <category label="azure" term="azure"/>
        <category label="aws" term="aws"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Kubernetes Comprehensive Learning Guide]]></title>
        <id>https://www.ashikmostofa.com/writing/kubernetes-learning-guide</id>
        <link href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide"/>
        <updated>2026-09-10T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Master Kubernetes container orchestration from basics through production deployment across multiple cloud providers.]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="table-of-contents">Table of Contents<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#table-of-contents" class="hash-link" aria-label="Direct link to Table of Contents" title="Direct link to Table of Contents" translate="no">​</a></h2>
<ol>
<li class=""><a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#why-kubernetes" class="">Why Kubernetes?</a></li>
<li class=""><a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#kubernetes-basics" class="">Kubernetes Basics</a></li>
<li class=""><a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#kubernetes-architecture" class="">Kubernetes Architecture</a></li>
<li class=""><a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#kubernetes-components" class="">Kubernetes Components</a></li>
<li class=""><a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#local-installation-with-minikube" class="">Local Installation with Minikube</a></li>
<li class=""><a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#local-installation-with-kind" class="">Local Installation with Kind</a></li>
<li class=""><a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#cloud-installation" class="">Cloud Installation</a></li>
<li class=""><a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#practical-examples" class="">Practical Examples</a></li>
<li class=""><a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#best-practices" class="">Best Practices</a></li>
<li class=""><a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#resources-and-next-steps" class="">Resources and Next Steps</a></li>
</ol>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-kubernetes">Why Kubernetes?<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#why-kubernetes" class="hash-link" aria-label="Direct link to Why Kubernetes?" title="Direct link to Why Kubernetes?" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-container-challenge">The Container Challenge<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#the-container-challenge" class="hash-link" aria-label="Direct link to The Container Challenge" title="Direct link to The Container Challenge" translate="no">​</a></h3>
<p>Before diving into Kubernetes, let's understand why it exists. Modern applications are increasingly built using containers, but managing containers at scale presents several challenges:</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="problems-with-manual-container-management">Problems with Manual Container Management:<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#problems-with-manual-container-management" class="hash-link" aria-label="Direct link to Problems with Manual Container Management:" title="Direct link to Problems with Manual Container Management:" translate="no">​</a></h4>
<ul>
<li class=""><strong>Scaling Issues</strong>: Manually starting/stopping containers based on demand</li>
<li class=""><strong>Service Discovery</strong>: How do containers find and communicate with each other?</li>
<li class=""><strong>Load Balancing</strong>: Distributing traffic across multiple container instances</li>
<li class=""><strong>Health Monitoring</strong>: Detecting when containers fail and replacing them</li>
<li class=""><strong>Resource Management</strong>: Efficiently utilizing CPU, memory, and storage</li>
<li class=""><strong>Configuration Management</strong>: Managing secrets, config files, and environment variables</li>
<li class=""><strong>Rolling Updates</strong>: Deploying new versions without downtime</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-kubernetes-solves">What Kubernetes Solves<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#what-kubernetes-solves" class="hash-link" aria-label="Direct link to What Kubernetes Solves" title="Direct link to What Kubernetes Solves" translate="no">​</a></h3>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="key-benefits-of-kubernetes">Key Benefits of Kubernetes:<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#key-benefits-of-kubernetes" class="hash-link" aria-label="Direct link to Key Benefits of Kubernetes:" title="Direct link to Key Benefits of Kubernetes:" translate="no">​</a></h3>













































<table><thead><tr><th>Benefit</th><th>Description</th><th>Business Impact</th></tr></thead><tbody><tr><td><strong>Automated Deployment</strong></td><td>Deploy applications with simple commands</td><td>Faster time-to-market</td></tr><tr><td><strong>Self-Healing</strong></td><td>Automatically restart failed containers</td><td>Improved reliability</td></tr><tr><td><strong>Auto-Scaling</strong></td><td>Scale applications based on demand</td><td>Cost optimization</td></tr><tr><td><strong>Service Discovery</strong></td><td>Automatic networking between services</td><td>Simplified architecture</td></tr><tr><td><strong>Rolling Updates</strong></td><td>Deploy without downtime</td><td>Better user experience</td></tr><tr><td><strong>Resource Optimization</strong></td><td>Efficient use of infrastructure</td><td>Lower operational costs</td></tr><tr><td><strong>Portability</strong></td><td>Run anywhere (cloud, on-premise, hybrid)</td><td>Vendor independence</td></tr></tbody></table>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="kubernetes-basics">Kubernetes Basics<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#kubernetes-basics" class="hash-link" aria-label="Direct link to Kubernetes Basics" title="Direct link to Kubernetes Basics" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-kubernetes">What is Kubernetes?<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#what-is-kubernetes" class="hash-link" aria-label="Direct link to What is Kubernetes?" title="Direct link to What is Kubernetes?" translate="no">​</a></h3>
<p>Kubernetes (often abbreviated as "K8s") is an open-source container orchestration platform that automates the deployment, scaling, and management of containerized applications.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="key-concepts">Key Concepts<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#key-concepts" class="hash-link" aria-label="Direct link to Key Concepts" title="Direct link to Key Concepts" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-cluster">1. <strong>Cluster</strong><a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#1-cluster" class="hash-link" aria-label="Direct link to 1-cluster" title="Direct link to 1-cluster" translate="no">​</a></h4>
<p>A set of machines (physical or virtual) that run Kubernetes. A cluster consists of:</p>
<ul>
<li class=""><strong>Control Plane</strong>: Manages the cluster</li>
<li class=""><strong>Worker Nodes</strong>: Run your applications</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-pod">2. <strong>Pod</strong><a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#2-pod" class="hash-link" aria-label="Direct link to 2-pod" title="Direct link to 2-pod" translate="no">​</a></h4>
<ul>
<li class="">The smallest deployable unit in Kubernetes</li>
<li class="">Contains one or more containers</li>
<li class="">Containers in a pod share storage and network</li>
<li class="">Pods are ephemeral (temporary)</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-node">3. <strong>Node</strong><a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#3-node" class="hash-link" aria-label="Direct link to 3-node" title="Direct link to 3-node" translate="no">​</a></h4>
<ul>
<li class="">A physical or virtual machine in the cluster</li>
<li class="">Can be a control plane node or worker node</li>
<li class="">Runs pods and Kubernetes components</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-service">4. <strong>Service</strong><a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#4-service" class="hash-link" aria-label="Direct link to 4-service" title="Direct link to 4-service" translate="no">​</a></h4>
<ul>
<li class="">Provides stable networking for pods</li>
<li class="">Acts as a load balancer</li>
<li class="">Enables service discovery</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-deployment">5. <strong>Deployment</strong><a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#5-deployment" class="hash-link" aria-label="Direct link to 5-deployment" title="Direct link to 5-deployment" translate="no">​</a></h4>
<ul>
<li class="">Manages pod replicas</li>
<li class="">Handles rolling updates</li>
<li class="">Ensures desired state</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="kubernetes-vs-traditional-deployment">Kubernetes vs. Traditional Deployment<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#kubernetes-vs-traditional-deployment" class="hash-link" aria-label="Direct link to Kubernetes vs. Traditional Deployment" title="Direct link to Kubernetes vs. Traditional Deployment" translate="no">​</a></h3>
<!-- -->
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="kubernetes-architecture">Kubernetes Architecture<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#kubernetes-architecture" class="hash-link" aria-label="Direct link to Kubernetes Architecture" title="Direct link to Kubernetes Architecture" translate="no">​</a></h2>
<p>Kubernetes follows a distributed architecture pattern with clear separation between the control plane and data plane.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="high-level-architecture">High-Level Architecture<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#high-level-architecture" class="hash-link" aria-label="Direct link to High-Level Architecture" title="Direct link to High-Level Architecture" translate="no">​</a></h3>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="control-plane-vs-data-plane">Control Plane vs Data Plane<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#control-plane-vs-data-plane" class="hash-link" aria-label="Direct link to Control Plane vs Data Plane" title="Direct link to Control Plane vs Data Plane" translate="no">​</a></h3>



































<table><thead><tr><th>Component</th><th>Control Plane</th><th>Data Plane</th></tr></thead><tbody><tr><td><strong>Purpose</strong></td><td>Cluster management and orchestration</td><td>Run application workloads</td></tr><tr><td><strong>Components</strong></td><td>API Server, etcd, Scheduler, Controller Manager</td><td>Kubelet, Kube-proxy, Container Runtime</td></tr><tr><td><strong>Responsibilities</strong></td><td>- Make global decisions<br>- Store cluster state<br>- Schedule pods<br>- Manage controllers</td><td>- Run pods<br>- Maintain network rules<br>- Report node status<br>- Execute workloads</td></tr><tr><td><strong>Scaling</strong></td><td>Usually 3-5 nodes for HA</td><td>Can scale to thousands of nodes</td></tr><tr><td><strong>Failure Impact</strong></td><td>Cannot create/update resources</td><td>Workloads continue running</td></tr></tbody></table>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="kubernetes-components">Kubernetes Components<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#kubernetes-components" class="hash-link" aria-label="Direct link to Kubernetes Components" title="Direct link to Kubernetes Components" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="control-plane-components">Control Plane Components<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#control-plane-components" class="hash-link" aria-label="Direct link to Control Plane Components" title="Direct link to Control Plane Components" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-api-server-kube-apiserver">1. <strong>API Server (kube-apiserver)</strong><a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#1-api-server-kube-apiserver" class="hash-link" aria-label="Direct link to 1-api-server-kube-apiserver" title="Direct link to 1-api-server-kube-apiserver" translate="no">​</a></h4>
<ul>
<li class=""><strong>Purpose</strong>: The front-end of the Kubernetes control plane</li>
<li class=""><strong>Functions</strong>:
<ul>
<li class="">Exposes the Kubernetes API</li>
<li class="">Handles authentication and authorization</li>
<li class="">Validates and processes API requests</li>
<li class="">Serves as the communication hub for all components</li>
</ul>
</li>
</ul>
<!-- -->
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-etcd">2. <strong>etcd</strong><a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#2-etcd" class="hash-link" aria-label="Direct link to 2-etcd" title="Direct link to 2-etcd" translate="no">​</a></h4>
<ul>
<li class=""><strong>Purpose</strong>: Distributed key-value store for cluster data</li>
<li class=""><strong>Stores</strong>:
<ul>
<li class="">Cluster configuration</li>
<li class="">Pod states and metadata</li>
<li class="">Secrets and ConfigMaps</li>
<li class="">Network policies</li>
</ul>
</li>
<li class=""><strong>Features</strong>:
<ul>
<li class="">High availability</li>
<li class="">Consistent data storage</li>
<li class="">Backup and restore capabilities</li>
</ul>
</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-scheduler-kube-scheduler">3. <strong>Scheduler (kube-scheduler)</strong><a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#3-scheduler-kube-scheduler" class="hash-link" aria-label="Direct link to 3-scheduler-kube-scheduler" title="Direct link to 3-scheduler-kube-scheduler" translate="no">​</a></h4>
<ul>
<li class=""><strong>Purpose</strong>: Assigns pods to nodes</li>
<li class=""><strong>Decision Factors</strong>:
<ul>
<li class="">Resource requirements (CPU, memory)</li>
<li class="">Node capacity and availability</li>
<li class="">Affinity and anti-affinity rules</li>
<li class="">Quality of Service requirements</li>
<li class="">Custom scheduling policies</li>
</ul>
</li>
</ul>
<!-- -->
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-controller-manager-kube-controller-manager">4. <strong>Controller Manager (kube-controller-manager)</strong><a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#4-controller-manager-kube-controller-manager" class="hash-link" aria-label="Direct link to 4-controller-manager-kube-controller-manager" title="Direct link to 4-controller-manager-kube-controller-manager" translate="no">​</a></h4>
<ul>
<li class=""><strong>Purpose</strong>: Runs controller processes that regulate cluster state</li>
<li class=""><strong>Key Controllers</strong>:
<ul>
<li class=""><strong>Node Controller</strong>: Monitors node health</li>
<li class=""><strong>Deployment Controller</strong>: Manages deployments</li>
<li class=""><strong>Service Controller</strong>: Manages services</li>
<li class=""><strong>Endpoint Controller</strong>: Manages endpoints</li>
<li class=""><strong>ReplicaSet Controller</strong>: Ensures desired pod replicas</li>
</ul>
</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-cloud-controller-manager">5. <strong>Cloud Controller Manager</strong><a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#5-cloud-controller-manager" class="hash-link" aria-label="Direct link to 5-cloud-controller-manager" title="Direct link to 5-cloud-controller-manager" translate="no">​</a></h4>
<ul>
<li class=""><strong>Purpose</strong>: Integrates with cloud provider APIs</li>
<li class=""><strong>Functions</strong>:
<ul>
<li class="">Node management (create/delete cloud VMs)</li>
<li class="">Load balancer management</li>
<li class="">Volume management</li>
<li class="">Route management</li>
</ul>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="worker-node-components">Worker Node Components<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#worker-node-components" class="hash-link" aria-label="Direct link to Worker Node Components" title="Direct link to Worker Node Components" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-kubelet">1. <strong>Kubelet</strong><a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#1-kubelet" class="hash-link" aria-label="Direct link to 1-kubelet" title="Direct link to 1-kubelet" translate="no">​</a></h4>
<ul>
<li class=""><strong>Purpose</strong>: Node agent that communicates with control plane</li>
<li class=""><strong>Responsibilities</strong>:
<ul>
<li class="">Register node with cluster</li>
<li class="">Watch for pod assignments</li>
<li class="">Start and stop containers</li>
<li class="">Report node and pod status</li>
<li class="">Execute health checks</li>
</ul>
</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-kube-proxy">2. <strong>Kube-proxy</strong><a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#2-kube-proxy" class="hash-link" aria-label="Direct link to 2-kube-proxy" title="Direct link to 2-kube-proxy" translate="no">​</a></h4>
<ul>
<li class=""><strong>Purpose</strong>: Network proxy that maintains network rules</li>
<li class=""><strong>Functions</strong>:
<ul>
<li class="">Implement service networking</li>
<li class="">Load balance traffic to pods</li>
<li class="">Maintain iptables rules</li>
<li class="">Enable service discovery</li>
</ul>
</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-container-runtime">3. <strong>Container Runtime</strong><a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#3-container-runtime" class="hash-link" aria-label="Direct link to 3-container-runtime" title="Direct link to 3-container-runtime" translate="no">​</a></h4>
<ul>
<li class=""><strong>Purpose</strong>: Software responsible for running containers</li>
<li class=""><strong>Options</strong>:
<ul>
<li class=""><strong>containerd</strong>: Most popular, lightweight</li>
<li class=""><strong>CRI-O</strong>: Kubernetes-native runtime</li>
<li class=""><strong>Docker Engine</strong>: Traditional but being phased out</li>
</ul>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="component-communication-flow">Component Communication Flow<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#component-communication-flow" class="hash-link" aria-label="Direct link to Component Communication Flow" title="Direct link to Component Communication Flow" translate="no">​</a></h3>
<!-- -->
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="local-installation-with-minikube">Local Installation with Minikube<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#local-installation-with-minikube" class="hash-link" aria-label="Direct link to Local Installation with Minikube" title="Direct link to Local Installation with Minikube" translate="no">​</a></h2>
<p>Minikube is the most popular tool for running Kubernetes locally. It implements a local Kubernetes cluster on macOS, Linux, and Windows, with primary goals to be the best tool for local Kubernetes application development and to support all Kubernetes features that fit.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="system-requirements">System Requirements<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#system-requirements" class="hash-link" aria-label="Direct link to System Requirements" title="Direct link to System Requirements" translate="no">​</a></h3>






























<table><thead><tr><th>Component</th><th>Minimum</th><th>Recommended</th></tr></thead><tbody><tr><td><strong>CPU</strong></td><td>2 cores</td><td>4+ cores</td></tr><tr><td><strong>Memory</strong></td><td>2GB RAM</td><td>4GB+ RAM</td></tr><tr><td><strong>Disk Space</strong></td><td>20GB</td><td>40GB+</td></tr><tr><td><strong>Virtualization</strong></td><td>Enabled</td><td>Enabled</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="installation">Installation<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#installation" class="hash-link" aria-label="Direct link to Installation" title="Direct link to Installation" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="linux-installation">Linux Installation<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#linux-installation" class="hash-link" aria-label="Direct link to Linux Installation" title="Direct link to Linux Installation" translate="no">​</a></h4>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Download latest minikube</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">curl -LO https://github.com/kubernetes/minikube/releases/latest/download/minikube-linux-amd64</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Install minikube</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">sudo install minikube-linux-amd64 /usr/local/bin/minikube &amp;&amp; rm minikube-linux-amd64</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Verify installation</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">minikube version</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="macos-installation">macOS Installation<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#macos-installation" class="hash-link" aria-label="Direct link to macOS Installation" title="Direct link to macOS Installation" translate="no">​</a></h4>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Using Homebrew</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">brew install minikube</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Or direct download</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">curl -LO https://github.com/kubernetes/minikube/releases/latest/download/minikube-darwin-amd64</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">sudo install minikube-darwin-amd64 /usr/local/bin/minikube</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="windows-installation">Windows Installation<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#windows-installation" class="hash-link" aria-label="Direct link to Windows Installation" title="Direct link to Windows Installation" translate="no">​</a></h4>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Using Chocolatey</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">choco install minikube</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Or download from GitHub and add to PATH</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="install-kubectl">Install kubectl<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#install-kubectl" class="hash-link" aria-label="Direct link to Install kubectl" title="Direct link to Install kubectl" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Linux</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">chmod +x kubectl</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">sudo mv kubectl /usr/local/bin/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># macOS</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">brew install kubectl</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Windows</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">choco install kubernetes-cli</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="starting-your-first-cluster">Starting Your First Cluster<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#starting-your-first-cluster" class="hash-link" aria-label="Direct link to Starting Your First Cluster" title="Direct link to Starting Your First Cluster" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Start minikube with default settings</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">minikube start</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Start with specific resources</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">minikube start --cpus=4 --memory=8192mb --disk-size=50gb</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Start with specific Kubernetes version</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">minikube start --kubernetes-version=v1.32.0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Start with specific driver</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">minikube start --driver=docker</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="available-drivers">Available Drivers<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#available-drivers" class="hash-link" aria-label="Direct link to Available Drivers" title="Direct link to Available Drivers" translate="no">​</a></h3>









































<table><thead><tr><th>Driver</th><th>Platform</th><th>Pros</th><th>Cons</th></tr></thead><tbody><tr><td><strong>Docker</strong></td><td>All</td><td>Fast, widely available</td><td>Requires Docker</td></tr><tr><td><strong>VirtualBox</strong></td><td>All</td><td>Full isolation</td><td>Slower performance</td></tr><tr><td><strong>KVM2</strong></td><td>Linux</td><td>Good performance</td><td>Linux only</td></tr><tr><td><strong>HyperKit</strong></td><td>macOS</td><td>Native integration</td><td>macOS only</td></tr><tr><td><strong>Hyper-V</strong></td><td>Windows</td><td>Native integration</td><td>Windows Pro+ only</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="minikube-commands-cheat-sheet">Minikube Commands Cheat Sheet<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#minikube-commands-cheat-sheet" class="hash-link" aria-label="Direct link to Minikube Commands Cheat Sheet" title="Direct link to Minikube Commands Cheat Sheet" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Cluster Management</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">minikube start                    # Start cluster</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">minikube stop                     # Stop cluster</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">minikube delete                   # Delete cluster</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">minikube status                   # Check cluster status</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">minikube pause                    # Pause cluster</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">minikube unpause                  # Unpause cluster</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Information</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">minikube ip                       # Get cluster IP</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">minikube dashboard                # Open Kubernetes dashboard</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">minikube service &lt;service-name&gt;   # Access service URL</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Add-ons</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">minikube addons list              # List available add-ons</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">minikube addons enable ingress    # Enable ingress</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">minikube addons enable dashboard  # Enable dashboard</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Advanced</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">minikube ssh                      # SSH into minikube node</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">minikube logs                     # View minikube logs</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">minikube tunnel                   # Create tunnel for LoadBalancer services</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="useful-minikube-add-ons">Useful Minikube Add-ons<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#useful-minikube-add-ons" class="hash-link" aria-label="Direct link to Useful Minikube Add-ons" title="Direct link to Useful Minikube Add-ons" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Enable essential add-ons</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">minikube addons enable dashboard</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">minikube addons enable ingress</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">minikube addons enable metrics-server</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">minikube addons enable storage-provisioner</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># View all available add-ons</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">minikube addons list</span><br></div></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="local-installation-with-kind">Local Installation with Kind<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#local-installation-with-kind" class="hash-link" aria-label="Direct link to Local Installation with Kind" title="Direct link to Local Installation with Kind" translate="no">​</a></h2>
<p>Kind (Kubernetes in Docker) is a tool for running local Kubernetes clusters using Docker container "nodes". Kind was primarily designed for testing Kubernetes itself, but may be used for local development or CI.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-choose-kind">Why Choose Kind?<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#why-choose-kind" class="hash-link" aria-label="Direct link to Why Choose Kind?" title="Direct link to Why Choose Kind?" translate="no">​</a></h3>








































<table><thead><tr><th>Feature</th><th>Kind</th><th>Minikube</th></tr></thead><tbody><tr><td><strong>Multi-node support</strong></td><td>✅ Easy</td><td>⚠️ Complex</td></tr><tr><td><strong>CI/CD friendly</strong></td><td>✅ Excellent</td><td>⚠️ Good</td></tr><tr><td><strong>Resource usage</strong></td><td>✅ Lower</td><td>⚠️ Higher</td></tr><tr><td><strong>Setup complexity</strong></td><td>✅ Simple</td><td>✅ Simple</td></tr><tr><td><strong>Add-ons</strong></td><td>⚠️ Manual</td><td>✅ Built-in</td></tr><tr><td><strong>LoadBalancer support</strong></td><td>⚠️ Manual</td><td>✅ Built-in</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="installation-1">Installation<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#installation-1" class="hash-link" aria-label="Direct link to Installation" title="Direct link to Installation" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="prerequisites">Prerequisites<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#prerequisites" class="hash-link" aria-label="Direct link to Prerequisites" title="Direct link to Prerequisites" translate="no">​</a></h4>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Install Docker first</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Ubuntu/Debian</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">sudo apt update &amp;&amp; sudo apt install docker.io</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># macOS</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">brew install docker</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Start Docker service</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">sudo systemctl start docker</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">sudo usermod -aG docker $USER  # Add user to docker group</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="install-kind">Install Kind<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#install-kind" class="hash-link" aria-label="Direct link to Install Kind" title="Direct link to Install Kind" translate="no">​</a></h4>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Linux/macOS</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.29.0/kind-linux-amd64</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">chmod +x ./kind</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">sudo mv ./kind /usr/local/bin/kind</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># macOS with Homebrew</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">brew install kind</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Using Go</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">go install sigs.k8s.io/kind@v0.29.0</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="creating-clusters">Creating Clusters<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#creating-clusters" class="hash-link" aria-label="Direct link to Creating Clusters" title="Direct link to Creating Clusters" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="single-node-cluster">Single Node Cluster<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#single-node-cluster" class="hash-link" aria-label="Direct link to Single Node Cluster" title="Direct link to Single Node Cluster" translate="no">​</a></h4>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Create a simple cluster</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kind create cluster</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Create cluster with custom name</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kind create cluster --name my-cluster</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Verify cluster</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl cluster-info --context kind-kind</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="multi-node-cluster">Multi-Node Cluster<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#multi-node-cluster" class="hash-link" aria-label="Direct link to Multi-Node Cluster" title="Direct link to Multi-Node Cluster" translate="no">​</a></h4>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># cluster-config.yaml</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Cluster</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> kind.x</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">k8s.io/v1alpha4</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">nodes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">role</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> control</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">plane</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">role</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> worker</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">role</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> worker</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">role</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> worker</span><br></div></code></pre></div></div>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Create multi-node cluster</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kind create cluster --config cluster-config.yaml --name multi-node</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># View nodes</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl get nodes</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="advanced-configuration">Advanced Configuration<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#advanced-configuration" class="hash-link" aria-label="Direct link to Advanced Configuration" title="Direct link to Advanced Configuration" translate="no">​</a></h4>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># advanced-config.yaml</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Cluster</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> kind.x</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">k8s.io/v1alpha4</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> advanced</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">cluster</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">nodes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">role</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> control</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">plane</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">kubeadmConfigPatches</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">|</span><span class="token scalar string" style="color:#e3116c"></span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">    kind: InitConfiguration</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">    nodeRegistration:</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">      kubeletExtraArgs:</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">        node-labels: "ingress-ready=true"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">extraPortMappings</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">containerPort</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">80</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">hostPort</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">80</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">protocol</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> TCP</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">containerPort</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">443</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">hostPort</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">443</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">protocol</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> TCP</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">role</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> worker</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">extraMounts</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">hostPath</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /path/to/my/files</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">containerPath</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /files</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">role</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> worker</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="kind-commands">Kind Commands<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#kind-commands" class="hash-link" aria-label="Direct link to Kind Commands" title="Direct link to Kind Commands" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Cluster Management</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kind create cluster --name &lt;name&gt;     # Create cluster</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kind delete cluster --name &lt;name&gt;     # Delete cluster</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kind get clusters                     # List clusters</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Working with Images</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kind load docker-image &lt;image&gt;        # Load Docker image into cluster</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kind load docker-image nginx:latest --name my-cluster</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Export cluster logs</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kind export logs ./logs --name my-cluster</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="setting-up-ingress-with-kind">Setting up Ingress with Kind<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#setting-up-ingress-with-kind" class="hash-link" aria-label="Direct link to Setting up Ingress with Kind" title="Direct link to Setting up Ingress with Kind" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># 1. Create cluster with port mapping</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">cat &lt;&lt;EOF | kind create cluster --config=-</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kind: Cluster</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">apiVersion: kind.x-k8s.io/v1alpha4</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">nodes:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">- role: control-plane</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  kubeadmConfigPatches:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  - |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    kind: InitConfiguration</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    nodeRegistration:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      kubeletExtraArgs:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        node-labels: "ingress-ready=true"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  extraPortMappings:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  - containerPort: 80</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    hostPort: 80</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  - containerPort: 443</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    hostPort: 443</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">EOF</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 2. Install ingress controller</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 3. Wait for ingress controller</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl wait --namespace ingress-nginx \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --for=condition=ready pod \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --selector=app.kubernetes.io/component=controller \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --timeout=90s</span><br></div></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cloud-installation">Cloud Installation<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#cloud-installation" class="hash-link" aria-label="Direct link to Cloud Installation" title="Direct link to Cloud Installation" translate="no">​</a></h2>
<p>Cloud providers offer managed Kubernetes services that handle the control plane for you. The three main contenders are Amazon Web Services (AWS) with EKS, Microsoft Azure with AKS, and Google Cloud with GKE.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="comparison-of-cloud-providers">Comparison of Cloud Providers<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#comparison-of-cloud-providers" class="hash-link" aria-label="Direct link to Comparison of Cloud Providers" title="Direct link to Comparison of Cloud Providers" translate="no">​</a></h3>





















































<table><thead><tr><th>Feature</th><th>AWS EKS</th><th>Azure AKS</th><th>Google GKE</th></tr></thead><tbody><tr><td><strong>Control Plane Cost</strong></td><td>$0.20/hour</td><td>Free</td><td>$0.10/hour</td></tr><tr><td><strong>Maximum Nodes</strong></td><td>450</td><td>1000</td><td>5000</td></tr><tr><td><strong>Auto-scaling</strong></td><td>✅</td><td>✅</td><td>✅</td></tr><tr><td><strong>Upgrade Management</strong></td><td>Manual</td><td>Manual</td><td>Automatic</td></tr><tr><td><strong>Monitoring</strong></td><td>CloudWatch</td><td>Azure Monitor</td><td>Stackdriver</td></tr><tr><td><strong>Service Mesh</strong></td><td>Manual setup</td><td>Manual setup</td><td>Istio built-in</td></tr><tr><td><strong>Windows Support</strong></td><td>✅</td><td>✅</td><td>❌</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="amazon-eks-elastic-kubernetes-service">Amazon EKS (Elastic Kubernetes Service)<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#amazon-eks-elastic-kubernetes-service" class="hash-link" aria-label="Direct link to Amazon EKS (Elastic Kubernetes Service)" title="Direct link to Amazon EKS (Elastic Kubernetes Service)" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="prerequisites-1">Prerequisites<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#prerequisites-1" class="hash-link" aria-label="Direct link to Prerequisites" title="Direct link to Prerequisites" translate="no">​</a></h4>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Install AWS CLI</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">unzip awscliv2.zip</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">sudo ./aws/install</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Configure AWS credentials</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">aws configure</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Install eksctl</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">sudo mv /tmp/eksctl /usr/local/bin</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="create-eks-cluster">Create EKS Cluster<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#create-eks-cluster" class="hash-link" aria-label="Direct link to Create EKS Cluster" title="Direct link to Create EKS Cluster" translate="no">​</a></h4>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Simple cluster creation</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">eksctl create cluster --name my-cluster --region us-west-2</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Advanced cluster with specific configuration</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">eksctl create cluster \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --name production-cluster \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --version 1.32 \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --region us-west-2 \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --nodegroup-name workers \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --node-type m5.large \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --nodes 3 \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --nodes-min 1 \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --nodes-max 10 \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --managed</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="eks-configuration-yaml">EKS Configuration YAML<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#eks-configuration-yaml" class="hash-link" aria-label="Direct link to EKS Configuration YAML" title="Direct link to EKS Configuration YAML" translate="no">​</a></h4>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># cluster.yaml</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> eksctl.io/v1alpha5</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ClusterConfig</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> production</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">cluster</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">region</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> us</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">west</span><span class="token punctuation" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">version</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"1.32"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">managedNodeGroups</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> worker</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">nodes</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">instanceType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> m5.large</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">minSize</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">maxSize</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">desiredCapacity</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">volumeSize</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">ssh</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">allow</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">iam</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">withAddonPolicies</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">autoScaler</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">cloudWatch</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">ebs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><br></div></code></pre></div></div>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Create cluster from config</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">eksctl create cluster -f cluster.yaml</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="azure-aks-azure-kubernetes-service">Azure AKS (Azure Kubernetes Service)<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#azure-aks-azure-kubernetes-service" class="hash-link" aria-label="Direct link to Azure AKS (Azure Kubernetes Service)" title="Direct link to Azure AKS (Azure Kubernetes Service)" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="prerequisites-2">Prerequisites<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#prerequisites-2" class="hash-link" aria-label="Direct link to Prerequisites" title="Direct link to Prerequisites" translate="no">​</a></h4>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Install Azure CLI</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Login to Azure</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">az login</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Create resource group</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">az group create --name myResourceGroup --location eastus</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="create-aks-cluster">Create AKS Cluster<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#create-aks-cluster" class="hash-link" aria-label="Direct link to Create AKS Cluster" title="Direct link to Create AKS Cluster" translate="no">​</a></h4>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Simple cluster creation</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">az aks create \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --resource-group myResourceGroup \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --name myAKSCluster \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --node-count 3 \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --enable-addons monitoring \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --generate-ssh-keys</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Get credentials</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">az aks get-credentials --resource-group myResourceGroup --name myAKSCluster</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Advanced cluster with specific features</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">az aks create \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --resource-group myResourceGroup \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --name production-cluster \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --node-count 3 \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --node-vm-size Standard_D4s_v3 \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --kubernetes-version 1.32.0 \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --enable-addons monitoring,http_application_routing \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --enable-autoscaler \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --min-count 1 \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --max-count 10 \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --network-plugin azure \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --service-cidr 10.0.0.0/16 \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --dns-service-ip 10.0.0.10</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="google-gke-google-kubernetes-engine">Google GKE (Google Kubernetes Engine)<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#google-gke-google-kubernetes-engine" class="hash-link" aria-label="Direct link to Google GKE (Google Kubernetes Engine)" title="Direct link to Google GKE (Google Kubernetes Engine)" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="prerequisites-3">Prerequisites<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#prerequisites-3" class="hash-link" aria-label="Direct link to Prerequisites" title="Direct link to Prerequisites" translate="no">​</a></h4>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Install Google Cloud SDK</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">curl https://sdk.cloud.google.com | bash</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">exec -l $SHELL</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Initialize gcloud</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">gcloud init</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Set default project and zone</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">gcloud config set project PROJECT_ID</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">gcloud config set compute/zone us-central1-a</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Enable required APIs</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">gcloud services enable container.googleapis.com</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="create-gke-cluster">Create GKE Cluster<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#create-gke-cluster" class="hash-link" aria-label="Direct link to Create GKE Cluster" title="Direct link to Create GKE Cluster" translate="no">​</a></h4>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Simple cluster creation</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">gcloud container clusters create my-cluster \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --num-nodes=3 \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --zone=us-central1-a</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Get credentials</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">gcloud container clusters get-credentials my-cluster --zone=us-central1-a</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Advanced cluster with auto-scaling and specific machine types</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">gcloud container clusters create production-cluster \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --machine-type=e2-standard-4 \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --num-nodes=3 \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --enable-autoscaling \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --min-nodes=1 \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --max-nodes=10 \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --enable-autorepair \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --enable-autoupgrade \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --disk-size=100GB \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --image-type=COS_CONTAINERD \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --cluster-version=1.32 \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --zone=us-central1-a</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="cost-optimization-tips">Cost Optimization Tips<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#cost-optimization-tips" class="hash-link" aria-label="Direct link to Cost Optimization Tips" title="Direct link to Cost Optimization Tips" translate="no">​</a></h3>
<!-- -->
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="cost-comparison-table">Cost Comparison Table<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#cost-comparison-table" class="hash-link" aria-label="Direct link to Cost Comparison Table" title="Direct link to Cost Comparison Table" translate="no">​</a></h4>





























<table><thead><tr><th>Provider</th><th>Control Plane</th><th>Worker Nodes</th><th>Additional Costs</th></tr></thead><tbody><tr><td><strong>AWS EKS</strong></td><td>$73/month</td><td>EC2 pricing</td><td>Data transfer, LoadBalancer</td></tr><tr><td><strong>Azure AKS</strong></td><td>Free</td><td>VM pricing</td><td>Data transfer, LoadBalancer</td></tr><tr><td><strong>Google GKE</strong></td><td>$36/month</td><td>Compute pricing</td><td>Data transfer, sustained use discounts</td></tr></tbody></table>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="practical-examples">Practical Examples<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#practical-examples" class="hash-link" aria-label="Direct link to Practical Examples" title="Direct link to Practical Examples" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="example-1-deploying-a-simple-web-application">Example 1: Deploying a Simple Web Application<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#example-1-deploying-a-simple-web-application" class="hash-link" aria-label="Direct link to Example 1: Deploying a Simple Web Application" title="Direct link to Example 1: Deploying a Simple Web Application" translate="no">​</a></h3>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># nginx-deployment.yaml</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> apps/v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Deployment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nginx</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">deployment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">labels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">app</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nginx</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">replicas</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">selector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">matchLabels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">app</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nginx</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">template</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">labels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">app</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nginx</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">containers</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nginx</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nginx</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">1.24</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">ports</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">containerPort</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">80</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">requests</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"64Mi"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">cpu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"250m"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">limits</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"128Mi"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">cpu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"500m"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Service</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nginx</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">service</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">selector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">app</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nginx</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">ports</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">protocol</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> TCP</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">80</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">targetPort</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">80</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ClusterIP</span><br></div></code></pre></div></div>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Deploy the application</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl apply -f nginx-deployment.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Check deployment status</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl get deployments</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl get pods</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl get services</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Scale the deployment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl scale deployment nginx-deployment --replicas=5</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># View deployment details</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl describe deployment nginx-deployment</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="example-2-configmap-and-secret-usage">Example 2: ConfigMap and Secret Usage<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#example-2-configmap-and-secret-usage" class="hash-link" aria-label="Direct link to Example 2: ConfigMap and Secret Usage" title="Direct link to Example 2: ConfigMap and Secret Usage" translate="no">​</a></h3>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># app-config.yaml</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ConfigMap</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> app</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">config</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">data</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">database_url</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"postgresql://localhost:5432/myapp"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">debug_mode</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"true"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">app_name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"My Application"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Secret</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> app</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">secrets</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Opaque</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">data</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">database_password</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> cGFzc3dvcmQxMjM=  </span><span class="token comment" style="color:#999988;font-style:italic"># base64 encoded "password123"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">api_key</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> YWJjZGVmZ2hpams=  </span><span class="token comment" style="color:#999988;font-style:italic"># base64 encoded "abcdefghijk"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> apps/v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Deployment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> web</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">app</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">replicas</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">selector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">matchLabels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">app</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> web</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">app</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">template</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">labels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">app</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> web</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">app</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">containers</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> web</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">app</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nginx</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">alpine</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">env</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> DATABASE_URL</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">valueFrom</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">configMapKeyRef</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> app</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">config</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">key</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> database_url</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> DEBUG_MODE</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">valueFrom</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">configMapKeyRef</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> app</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">config</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">key</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> debug_mode</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> DATABASE_PASSWORD</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">valueFrom</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">secretKeyRef</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> app</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">secrets</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">key</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> database_password</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> API_KEY</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">valueFrom</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">secretKeyRef</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> app</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">secrets</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">key</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> api_key</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="example-3-persistent-storage">Example 3: Persistent Storage<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#example-3-persistent-storage" class="hash-link" aria-label="Direct link to Example 3: Persistent Storage" title="Direct link to Example 3: Persistent Storage" translate="no">​</a></h3>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># persistent-storage.yaml</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> PersistentVolumeClaim</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> web</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">app</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">storage</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">accessModes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> ReadWriteOnce</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">requests</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">storage</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 10Gi</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">storageClassName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> standard</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> apps/v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Deployment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> web</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">app</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">with</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">storage</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">replicas</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">selector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">matchLabels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">app</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> web</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">app</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">with</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">storage</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">template</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">labels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">app</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> web</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">app</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">with</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">storage</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">containers</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> web</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">app</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nginx</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">alpine</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">volumeMounts</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> web</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">storage</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">mountPath</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /usr/share/nginx/html</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">ports</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">containerPort</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">80</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">volumes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> web</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">storage</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">persistentVolumeClaim</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">claimName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> web</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">app</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">storage</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="example-4-ingress-configuration">Example 4: Ingress Configuration<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#example-4-ingress-configuration" class="hash-link" aria-label="Direct link to Example 4: Ingress Configuration" title="Direct link to Example 4: Ingress Configuration" translate="no">​</a></h3>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># ingress-example.yaml</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> networking.k8s.io/v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Ingress</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> web</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">app</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">ingress</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">annotations</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">nginx.ingress.kubernetes.io/rewrite-target</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">nginx.ingress.kubernetes.io/ssl-redirect</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"true"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">ingressClassName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nginx</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">tls</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">hosts</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> myapp.example.com</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">secretName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> tls</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">secret</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">rules</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">host</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> myapp.example.com</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">http</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">paths</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">path</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">pathType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Prefix</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">backend</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">service</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nginx</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">service</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">number</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">80</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">path</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /api</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">pathType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Prefix</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">backend</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">service</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> api</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">service</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">number</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">8080</span><br></div></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="best-practices">Best Practices<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#best-practices" class="hash-link" aria-label="Direct link to Best Practices" title="Direct link to Best Practices" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-resource-management">1. Resource Management<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#1-resource-management" class="hash-link" aria-label="Direct link to 1. Resource Management" title="Direct link to 1. Resource Management" translate="no">​</a></h3>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Always set resource requests and limits</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">requests</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"64Mi"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">cpu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"250m"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">limits</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"128Mi"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">cpu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"500m"</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-health-checks">2. Health Checks<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#2-health-checks" class="hash-link" aria-label="Direct link to 2. Health Checks" title="Direct link to 2. Health Checks" translate="no">​</a></h3>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Implement liveness and readiness probes</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">livenessProbe</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">httpGet</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">path</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /health</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">8080</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">initialDelaySeconds</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">30</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">periodSeconds</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">timeoutSeconds</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">failureThreshold</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">readinessProbe</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">httpGet</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">path</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /ready</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">8080</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">initialDelaySeconds</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">periodSeconds</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">timeoutSeconds</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">failureThreshold</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-security-best-practices">3. Security Best Practices<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#3-security-best-practices" class="hash-link" aria-label="Direct link to 3. Security Best Practices" title="Direct link to 3. Security Best Practices" translate="no">​</a></h3>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Use security contexts</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">securityContext</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">runAsNonRoot</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">runAsUser</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1000</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">fsGroup</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2000</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">capabilities</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">drop</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> ALL</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">readOnlyRootFilesystem</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">allowPrivilegeEscalation</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">false</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-namespace-organization">4. Namespace Organization<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#4-namespace-organization" class="hash-link" aria-label="Direct link to 4. Namespace Organization" title="Direct link to 4. Namespace Organization" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Create namespaces for different environments</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl create namespace development</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl create namespace staging</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl create namespace production</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Use namespace in deployments</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl apply -f app.yaml -n development</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-monitoring-and-logging">5. Monitoring and Logging<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#5-monitoring-and-logging" class="hash-link" aria-label="Direct link to 5. Monitoring and Logging" title="Direct link to 5. Monitoring and Logging" translate="no">​</a></h3>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Add labels for monitoring</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">labels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">app</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> my</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">app</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">version</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v1.0.0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">environment</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> production</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">team</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> backend</span><br></div></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="resources-and-next-steps">Resources and Next Steps<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#resources-and-next-steps" class="hash-link" aria-label="Direct link to Resources and Next Steps" title="Direct link to Resources and Next Steps" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="essential-kubectl-commands">Essential kubectl Commands<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#essential-kubectl-commands" class="hash-link" aria-label="Direct link to Essential kubectl Commands" title="Direct link to Essential kubectl Commands" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Cluster Information</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl cluster-info</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl get nodes</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl describe node &lt;node-name&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Working with Pods</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl get pods</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl describe pod &lt;pod-name&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl logs &lt;pod-name&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl exec -it &lt;pod-name&gt; -- /bin/bash</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Working with Deployments</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl get deployments</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl scale deployment &lt;deployment-name&gt; --replicas=5</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl rollout status deployment/&lt;deployment-name&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl rollout history deployment/&lt;deployment-name&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Working with Services</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl get services</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl port-forward service/&lt;service-name&gt; 8080:80</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Configuration</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl apply -f &lt;file.yaml&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl delete -f &lt;file.yaml&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl get all</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl get all -n &lt;namespace&gt;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="learning-path">Learning Path<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#learning-path" class="hash-link" aria-label="Direct link to Learning Path" title="Direct link to Learning Path" translate="no">​</a></h3>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="recommended-tools">Recommended Tools<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#recommended-tools" class="hash-link" aria-label="Direct link to Recommended Tools" title="Direct link to Recommended Tools" translate="no">​</a></h3>








































<table><thead><tr><th>Category</th><th>Tools</th><th>Purpose</th></tr></thead><tbody><tr><td><strong>Development</strong></td><td>kubectl, k9s, kubectx</td><td>Cluster interaction</td></tr><tr><td><strong>Package Management</strong></td><td>Helm, Kustomize</td><td>Application deployment</td></tr><tr><td><strong>Monitoring</strong></td><td>Prometheus, Grafana</td><td>Metrics and alerting</td></tr><tr><td><strong>Logging</strong></td><td>ELK Stack, Fluentd</td><td>Log aggregation</td></tr><tr><td><strong>Security</strong></td><td>Falco, OPA Gatekeeper</td><td>Security monitoring</td></tr><tr><td><strong>CI/CD</strong></td><td>Tekton, ArgoCD</td><td>Pipeline automation</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="next-steps">Next Steps<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#next-steps" class="hash-link" aria-label="Direct link to Next Steps" title="Direct link to Next Steps" translate="no">​</a></h3>
<ol>
<li class=""><strong>Hands-on Practice</strong>: Set up a local cluster and deploy sample applications</li>
<li class=""><strong>Certification</strong>: Consider CKA (Certified Kubernetes Administrator) or CKAD (Certified Kubernetes Application Developer)</li>
<li class=""><strong>Advanced Topics</strong>: Learn about service mesh, operators, and custom resources</li>
<li class=""><strong>Production Readiness</strong>: Study monitoring, logging, security, and backup strategies</li>
<li class=""><strong>Community</strong>: Join Kubernetes community, attend meetups, contribute to open source</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="useful-resources">Useful Resources<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#useful-resources" class="hash-link" aria-label="Direct link to Useful Resources" title="Direct link to Useful Resources" translate="no">​</a></h3>
<ul>
<li class=""><strong>Official Documentation</strong>: <a href="https://kubernetes.io/docs/" target="_blank" rel="noopener noreferrer" class="">https://kubernetes.io/docs/</a></li>
<li class=""><strong>Interactive Tutorials</strong>: <a href="https://kubernetes.io/docs/tutorials/" target="_blank" rel="noopener noreferrer" class="">https://kubernetes.io/docs/tutorials/</a></li>
<li class=""><strong>Kubernetes by Example</strong>: <a href="https://kubernetesbyexample.com/" target="_blank" rel="noopener noreferrer" class="">https://kubernetesbyexample.com/</a></li>
<li class=""><strong>CNCF Landscape</strong>: <a href="https://landscape.cncf.io/" target="_blank" rel="noopener noreferrer" class="">https://landscape.cncf.io/</a></li>
<li class=""><strong>Kubernetes Slack</strong>: <a href="https://kubernetes.slack.com/" target="_blank" rel="noopener noreferrer" class="">https://kubernetes.slack.com/</a></li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="troubleshooting-common-issues">Troubleshooting Common Issues<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#troubleshooting-common-issues" class="hash-link" aria-label="Direct link to Troubleshooting Common Issues" title="Direct link to Troubleshooting Common Issues" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="pod-issues">Pod Issues<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#pod-issues" class="hash-link" aria-label="Direct link to Pod Issues" title="Direct link to Pod Issues" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Pod stuck in Pending state</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl describe pod &lt;pod-name&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Look for events: insufficient resources, scheduling issues</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Pod CrashLoopBackOff</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl logs &lt;pod-name&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl logs &lt;pod-name&gt; --previous</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Check container logs and exit codes</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># ImagePullBackOff</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl describe pod &lt;pod-name&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Check image name, registry access, credentials</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="network-issues">Network Issues<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#network-issues" class="hash-link" aria-label="Direct link to Network Issues" title="Direct link to Network Issues" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Service not accessible</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl get endpoints &lt;service-name&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl describe service &lt;service-name&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># DNS resolution issues</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl run test-pod --image=busybox -it --rm -- nslookup &lt;service-name&gt;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="resource-issues">Resource Issues<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#resource-issues" class="hash-link" aria-label="Direct link to Resource Issues" title="Direct link to Resource Issues" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Check resource usage</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl top nodes</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl top pods</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Check resource quotas</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl describe resourcequota -n &lt;namespace&gt;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="this-comprehensive-guide-provides-a-solid-foundation-for-understanding-and-working-with-kubernetes-start-with-local-installations-practice-with-the-examples-and-gradually-move-to-cloud-deployments-as-you-gain-confidence">This comprehensive guide provides a solid foundation for understanding and working with Kubernetes. Start with local installations, practice with the examples, and gradually move to cloud deployments as you gain confidence.<a href="https://www.ashikmostofa.com/writing/kubernetes-learning-guide#this-comprehensive-guide-provides-a-solid-foundation-for-understanding-and-working-with-kubernetes-start-with-local-installations-practice-with-the-examples-and-gradually-move-to-cloud-deployments-as-you-gain-confidence" class="hash-link" aria-label="Direct link to This comprehensive guide provides a solid foundation for understanding and working with Kubernetes. Start with local installations, practice with the examples, and gradually move to cloud deployments as you gain confidence." title="Direct link to This comprehensive guide provides a solid foundation for understanding and working with Kubernetes. Start with local installations, practice with the examples, and gradually move to cloud deployments as you gain confidence." translate="no">​</a></h2>
<p><em>Written while teaching DevOps to 800+ engineers across 12 cohorts.</em></p>]]></content>
        <author>
            <name>Ashik Mostofa Tonmoy</name>
            <email>tonmoy.ashik@gmail.com</email>
            <uri>https://ashikmostofa.com</uri>
        </author>
        <category label="guide" term="guide"/>
        <category label="kubernetes" term="kubernetes"/>
        <category label="containers" term="containers"/>
        <category label="orchestration" term="orchestration"/>
        <category label="devops" term="devops"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Helm & GitOps: A Complete Beginner's Guide]]></title>
        <id>https://www.ashikmostofa.com/writing/helm-gitops-guide</id>
        <link href="https://www.ashikmostofa.com/writing/helm-gitops-guide"/>
        <updated>2026-09-05T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Helm charts and GitOps with ArgoCD, from first chart to a full deployment workflow, for managing Kubernetes releases at scale.]]></summary>
        <content type="html"><![CDATA[<blockquote>
<p><strong>Orchestration Made Easy with Kubernetes</strong></p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-table-of-contents">📚 Table of Contents<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#-table-of-contents" class="hash-link" aria-label="Direct link to 📚 Table of Contents" title="Direct link to 📚 Table of Contents" translate="no">​</a></h2>
<ol>
<li class=""><a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#introduction" class="">Introduction to Kubernetes Package Management</a></li>
<li class=""><a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#helm-charts" class="">Helm Charts Fundamentals</a></li>
<li class=""><a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#helm-microservices" class="">Helm for Microservices</a></li>
<li class=""><a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#gitops" class="">GitOps Concepts</a></li>
<li class=""><a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#argocd" class="">ArgoCD Configuration</a></li>
<li class=""><a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#complete-workflow" class="">Complete Workflow Example</a></li>
<li class=""><a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#best-practices" class="">Best Practices</a></li>
</ol>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction">🎯 Introduction to Kubernetes Package Management<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#introduction" class="hash-link" aria-label="Direct link to 🎯 Introduction to Kubernetes Package Management" title="Direct link to 🎯 Introduction to Kubernetes Package Management" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-problem-managing-complex-kubernetes-applications">The Problem: Managing Complex Kubernetes Applications<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#the-problem-managing-complex-kubernetes-applications" class="hash-link" aria-label="Direct link to The Problem: Managing Complex Kubernetes Applications" title="Direct link to The Problem: Managing Complex Kubernetes Applications" translate="no">​</a></h3>
<p>Imagine you're organizing a massive event. You need:</p>
<ul>
<li class="">Venue booking</li>
<li class="">Catering</li>
<li class="">Entertainment</li>
<li class="">Decorations</li>
<li class="">Security</li>
</ul>
<p>Without a coordinator, you'd manually manage each vendor, track changes, and ensure everything works together. <strong>This is what deploying applications on Kubernetes feels like without Helm.</strong></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-kubernetes">What is Kubernetes?<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#what-is-kubernetes" class="hash-link" aria-label="Direct link to What is Kubernetes?" title="Direct link to What is Kubernetes?" translate="no">​</a></h3>
<p><strong>Analogy:</strong> Think of Kubernetes as a <strong>smart apartment building manager</strong> that:</p>
<ul>
<li class="">Assigns apartments (containers) to tenants (applications)</li>
<li class="">Ensures everyone has electricity and water (resources)</li>
<li class="">Handles complaints and repairs (self-healing)</li>
<li class="">Manages the lobby, elevators, and common areas (networking)</li>
</ul>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="key-kubernetes-concepts">Key Kubernetes Concepts<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#key-kubernetes-concepts" class="hash-link" aria-label="Direct link to Key Kubernetes Concepts" title="Direct link to Key Kubernetes Concepts" translate="no">​</a></h3>








































<table><thead><tr><th>Concept</th><th>Analogy</th><th>Description</th></tr></thead><tbody><tr><td><strong>Pod</strong></td><td>Apartment</td><td>Smallest deployable unit, contains one or more containers</td></tr><tr><td><strong>Deployment</strong></td><td>Building Blueprint</td><td>Defines how many pods, which version, how to update</td></tr><tr><td><strong>Service</strong></td><td>Address Book</td><td>Provides stable network endpoint to access pods</td></tr><tr><td><strong>ConfigMap</strong></td><td>Settings File</td><td>Stores configuration data</td></tr><tr><td><strong>Secret</strong></td><td>Safe Box</td><td>Stores sensitive data (passwords, keys)</td></tr><tr><td><strong>Namespace</strong></td><td>Building Floor</td><td>Logical cluster subdivision</td></tr></tbody></table>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="helm-charts">🎁 Helm Charts Fundamentals<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#helm-charts" class="hash-link" aria-label="Direct link to 🎁 Helm Charts Fundamentals" title="Direct link to 🎁 Helm Charts Fundamentals" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-helm">What is Helm?<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#what-is-helm" class="hash-link" aria-label="Direct link to What is Helm?" title="Direct link to What is Helm?" translate="no">​</a></h3>
<p><strong>Helm = The Package Manager for Kubernetes</strong></p>
<p><strong>Analogy:</strong> Helm is like <strong>a meal kit delivery service</strong> (HelloFresh, Blue Apron):</p>
<ul>
<li class=""><strong>Without Helm:</strong> You manually buy ingredients, write recipes, measure quantities, adjust for servings</li>
<li class=""><strong>With Helm:</strong> You get pre-packaged ingredients, tested recipes, and easy customization</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-do-we-need-helm">Why Do We Need Helm?<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#why-do-we-need-helm" class="hash-link" aria-label="Direct link to Why Do We Need Helm?" title="Direct link to Why Do We Need Helm?" translate="no">​</a></h3>
<p><strong>Before Helm:</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># You need to manually apply each file</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl apply -f deployment.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl apply -f service.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl apply -f configmap.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl apply -f secret.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl apply -f ingress.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Repeat for each environment (dev, staging, prod)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Manually manage versions, rollbacks, dependencies</span><br></div></code></pre></div></div>
<p><strong>With Helm:</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># One command to install everything</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">helm install my-app ./my-chart</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="helm-architecture">Helm Architecture<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#helm-architecture" class="hash-link" aria-label="Direct link to Helm Architecture" title="Direct link to Helm Architecture" translate="no">​</a></h3>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="core-helm-concepts">Core Helm Concepts<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#core-helm-concepts" class="hash-link" aria-label="Direct link to Core Helm Concepts" title="Direct link to Core Helm Concepts" translate="no">​</a></h3>



































<table><thead><tr><th>Concept</th><th>Analogy</th><th>Description</th></tr></thead><tbody><tr><td><strong>Chart</strong></td><td>Recipe Box</td><td>Package containing all resources needed to run an app</td></tr><tr><td><strong>Release</strong></td><td>Cooked Meal</td><td>Running instance of a chart in your cluster</td></tr><tr><td><strong>Repository</strong></td><td>Recipe Website</td><td>Collection of charts you can download</td></tr><tr><td><strong>Values</strong></td><td>Ingredient Substitutions</td><td>Configuration options to customize deployment</td></tr><tr><td><strong>Templates</strong></td><td>Recipe Instructions</td><td>Kubernetes YAML files with placeholders</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="helm-chart-structure">Helm Chart Structure<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#helm-chart-structure" class="hash-link" aria-label="Direct link to Helm Chart Structure" title="Direct link to Helm Chart Structure" translate="no">​</a></h3>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">my-awesome-chart/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── Chart.yaml              # Chart metadata (name, version, description)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── values.yaml             # Default configuration values</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── charts/                 # Dependency charts (sub-charts)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── templates/              # Kubernetes resource templates</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   ├── deployment.yaml     # Pod deployment template</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   ├── service.yaml        # Service template</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   ├── ingress.yaml        # Ingress template</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   ├── configmap.yaml      # ConfigMap template</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   ├── _helpers.tpl        # Reusable template functions</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   └── NOTES.txt           # Post-installation instructions</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── .helmignore             # Files to ignore (like .gitignore)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">└── README.md               # Documentation</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="understanding-chartyaml">Understanding Chart.yaml<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#understanding-chartyaml" class="hash-link" aria-label="Direct link to Understanding Chart.yaml" title="Direct link to Understanding Chart.yaml" translate="no">​</a></h3>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v2                      </span><span class="token comment" style="color:#999988;font-style:italic"># Helm API version</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> my</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">awesome</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">chart              </span><span class="token comment" style="color:#999988;font-style:italic"># Chart name</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">description</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> A simple Helm chart    </span><span class="token comment" style="color:#999988;font-style:italic"># What this chart does</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> application                   </span><span class="token comment" style="color:#999988;font-style:italic"># Type: application or library</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">version</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 0.1.0                      </span><span class="token comment" style="color:#999988;font-style:italic"># Chart version (SemVer)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">appVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"1.0"</span><span class="token plain">                   </span><span class="token comment" style="color:#999988;font-style:italic"># Version of the app being deployed</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">keywords</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> nginx</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> web</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">maintainers</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Your Name</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">email</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> you@example.com</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">dependencies</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">                       </span><span class="token comment" style="color:#999988;font-style:italic"># Other charts this needs</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> redis</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">version</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"~10.5.0"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">repository</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"https://charts.bitnami.com/bitnami"</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="understanding-valuesyaml">Understanding values.yaml<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#understanding-valuesyaml" class="hash-link" aria-label="Direct link to Understanding values.yaml" title="Direct link to Understanding values.yaml" translate="no">​</a></h3>
<p><strong>Analogy:</strong> <code>values.yaml</code> is like a <strong>customization form</strong> at a restaurant:</p>
<ul>
<li class="">Want extra cheese? ✓</li>
<li class="">How spicy? Medium</li>
<li class="">Portion size? Large</li>
</ul>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># values.yaml - Configuration options</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Number of replicas</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">replicaCount</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Container image</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">repository</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nginx</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">tag</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"1.25.0"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">pullPolicy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> IfNotPresent</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Service configuration</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">service</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> LoadBalancer</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">80</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">targetPort</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">8080</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Resource limits</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">limits</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">cpu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 500m</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 512Mi</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">requests</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">cpu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 250m</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 256Mi</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Environment-specific settings</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">environment</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> production</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Feature flags</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">features</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">monitoring</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">logging</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="understanding-templates">Understanding Templates<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#understanding-templates" class="hash-link" aria-label="Direct link to Understanding Templates" title="Direct link to Understanding Templates" translate="no">​</a></h3>
<p>Templates use <strong>Go templating</strong> with special Helm functions:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># templates/deployment.yaml</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> apps/v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Deployment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> .Release.Name </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> .Chart.Name </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">labels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">app</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> .Chart.Name </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">version</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> .Chart.AppVersion </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">replicas</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> .Values.replicaCount </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">selector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">matchLabels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">app</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> .Chart.Name </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">template</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">labels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">app</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> .Chart.Name </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">containers</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> .Chart.Name </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"{{ .Values.image.repository }}:{{ .Values.image.tag }}"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">ports</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">containerPort</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> .Values.service.targetPort </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> toYaml .Values.resources </span><span class="token punctuation" style="color:#393A34">|</span><span class="token plain"> nindent 10 </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p><strong>Template Variables Explained:</strong></p>






























<table><thead><tr><th>Variable</th><th>Description</th><th>Example</th></tr></thead><tbody><tr><td><code>{{ .Release.Name }}</code></td><td>Name you give during installation</td><td><code>my-app</code></td></tr><tr><td><code>{{ .Chart.Name }}</code></td><td>Chart name from Chart.yaml</td><td><code>my-awesome-chart</code></td></tr><tr><td><code>{{ .Chart.Version }}</code></td><td>Chart version</td><td><code>0.1.0</code></td></tr><tr><td><code>{{ .Values.xxx }}</code></td><td>Value from values.yaml</td><td><code>.Values.replicaCount</code></td></tr></tbody></table>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-hands-on-creating-your-first-helm-chart">🔧 Hands-On: Creating Your First Helm Chart<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#-hands-on-creating-your-first-helm-chart" class="hash-link" aria-label="Direct link to 🔧 Hands-On: Creating Your First Helm Chart" title="Direct link to 🔧 Hands-On: Creating Your First Helm Chart" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-1-install-helm">Step 1: Install Helm<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#step-1-install-helm" class="hash-link" aria-label="Direct link to Step 1: Install Helm" title="Direct link to Step 1: Install Helm" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># macOS</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">brew install helm</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Linux</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Windows (using Chocolatey)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">choco install kubernetes-helm</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Verify installation</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">helm version</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-2-create-a-new-chart">Step 2: Create a New Chart<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#step-2-create-a-new-chart" class="hash-link" aria-label="Direct link to Step 2: Create a New Chart" title="Direct link to Step 2: Create a New Chart" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Create a new chart called "my-nginx-app"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">helm create my-nginx-app</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Navigate to the chart</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">cd my-nginx-app</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># View the structure</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">tree .</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-3-customize-valuesyaml">Step 3: Customize values.yaml<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#step-3-customize-valuesyaml" class="hash-link" aria-label="Direct link to Step 3: Customize values.yaml" title="Direct link to Step 3: Customize values.yaml" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Edit values.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">nano values.yaml</span><br></div></code></pre></div></div>
<p>Replace with this simple configuration:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">replicaCount</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">repository</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nginx</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">tag</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"1.25.0"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">pullPolicy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> IfNotPresent</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">service</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> NodePort</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">80</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">targetPort</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">80</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">limits</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">cpu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 200m</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 256Mi</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">requests</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">cpu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 100m</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 128Mi</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-4-validate-your-chart">Step 4: Validate Your Chart<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#step-4-validate-your-chart" class="hash-link" aria-label="Direct link to Step 4: Validate Your Chart" title="Direct link to Step 4: Validate Your Chart" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Lint the chart (check for errors)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">helm lint .</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Dry-run to see what would be deployed</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">helm install --dry-run --debug my-nginx-app .</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Template rendering (see final YAML)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">helm template my-nginx-app .</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-5-install-the-chart">Step 5: Install the Chart<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#step-5-install-the-chart" class="hash-link" aria-label="Direct link to Step 5: Install the Chart" title="Direct link to Step 5: Install the Chart" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Install in your Kubernetes cluster</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">helm install my-nginx-app .</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Check the installation</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">helm list</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Check the pods</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl get pods</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Check the service</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl get svc</span><br></div></code></pre></div></div>
<p><strong>Expected Output:</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">NAME: my-nginx-app</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">LAST DEPLOYED: Thu Oct 16 2025 10:30:00</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">NAMESPACE: default</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">STATUS: deployed</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">REVISION: 1</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-6-upgrade-your-chart">Step 6: Upgrade Your Chart<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#step-6-upgrade-your-chart" class="hash-link" aria-label="Direct link to Step 6: Upgrade Your Chart" title="Direct link to Step 6: Upgrade Your Chart" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Modify values.yaml (e.g., change replicas to 3)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">nano values.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Upgrade the release</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">helm upgrade my-nginx-app .</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Check revision history</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">helm history my-nginx-app</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-7-rollback-if-needed">Step 7: Rollback if Needed<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#step-7-rollback-if-needed" class="hash-link" aria-label="Direct link to Step 7: Rollback if Needed" title="Direct link to Step 7: Rollback if Needed" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Rollback to previous version</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">helm rollback my-nginx-app 1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Check status</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">helm status my-nginx-app</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-8-uninstall">Step 8: Uninstall<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#step-8-uninstall" class="hash-link" aria-label="Direct link to Step 8: Uninstall" title="Direct link to Step 8: Uninstall" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Uninstall the release</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">helm uninstall my-nginx-app</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Verify removal</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl get pods</span><br></div></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="helm-microservices">🏗️ Helm for Microservices<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#helm-microservices" class="hash-link" aria-label="Direct link to 🏗️ Helm for Microservices" title="Direct link to 🏗️ Helm for Microservices" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="understanding-microservices-architecture">Understanding Microservices Architecture<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#understanding-microservices-architecture" class="hash-link" aria-label="Direct link to Understanding Microservices Architecture" title="Direct link to Understanding Microservices Architecture" translate="no">​</a></h3>
<p><strong>Analogy:</strong> A microservice architecture is like a <strong>shopping mall</strong>:</p>
<ul>
<li class="">Each store (microservice) operates independently</li>
<li class="">Stores communicate through the mall directory (API)</li>
<li class="">If one store closes, others keep operating</li>
<li class="">Easy to add new stores or renovate existing ones</li>
</ul>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="real-world-example-googles-online-boutique">Real-World Example: Google's Online Boutique<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#real-world-example-googles-online-boutique" class="hash-link" aria-label="Direct link to Real-World Example: Google's Online Boutique" title="Direct link to Real-World Example: Google's Online Boutique" translate="no">​</a></h3>
<p>Let's use the Google Cloud microservices demo as our example.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="architecture-overview">Architecture Overview<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#architecture-overview" class="hash-link" aria-label="Direct link to Architecture Overview" title="Direct link to Architecture Overview" translate="no">​</a></h4>

































































<table><thead><tr><th>Service</th><th>Language</th><th>Purpose</th></tr></thead><tbody><tr><td><strong>frontend</strong></td><td>Go</td><td>Web UI</td></tr><tr><td><strong>cartservice</strong></td><td>C#</td><td>Shopping cart</td></tr><tr><td><strong>productcatalogservice</strong></td><td>Go</td><td>Product information</td></tr><tr><td><strong>currencyservice</strong></td><td>Node.js</td><td>Currency conversion</td></tr><tr><td><strong>paymentservice</strong></td><td>Node.js</td><td>Payment processing</td></tr><tr><td><strong>shippingservice</strong></td><td>Go</td><td>Shipping cost calculation</td></tr><tr><td><strong>emailservice</strong></td><td>Python</td><td>Order confirmation emails</td></tr><tr><td><strong>checkoutservice</strong></td><td>Go</td><td>Order checkout</td></tr><tr><td><strong>recommendationservice</strong></td><td>Python</td><td>Product recommendations</td></tr><tr><td><strong>adservice</strong></td><td>Java</td><td>Advertisement</td></tr><tr><td><strong>redis-cart</strong></td><td>Redis</td><td>Cart data storage</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="setting-up-the-microservices-demo">Setting Up the Microservices Demo<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#setting-up-the-microservices-demo" class="hash-link" aria-label="Direct link to Setting Up the Microservices Demo" title="Direct link to Setting Up the Microservices Demo" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="option-1-quick-start-using-pre-built-manifests">Option 1: Quick Start (Using Pre-built Manifests)<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#option-1-quick-start-using-pre-built-manifests" class="hash-link" aria-label="Direct link to Option 1: Quick Start (Using Pre-built Manifests)" title="Direct link to Option 1: Quick Start (Using Pre-built Manifests)" translate="no">​</a></h4>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Clone the repository</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">git clone --depth 1 --branch v0 https://github.com/GoogleCloudPlatform/microservices-demo.git</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">cd microservices-demo</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Apply all services at once</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl apply -f ./release/kubernetes-manifests.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Wait for pods to be ready</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl get pods -w</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Get the frontend URL</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl get service frontend-external</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="option-2-using-helm-recommended-for-production">Option 2: Using Helm (Recommended for Production)<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#option-2-using-helm-recommended-for-production" class="hash-link" aria-label="Direct link to Option 2: Using Helm (Recommended for Production)" title="Direct link to Option 2: Using Helm (Recommended for Production)" translate="no">​</a></h4>
<p>First, let's create a Helm chart for the Online Boutique.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="creating-a-helm-chart-for-microservices">Creating a Helm Chart for Microservices<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#creating-a-helm-chart-for-microservices" class="hash-link" aria-label="Direct link to Creating a Helm Chart for Microservices" title="Direct link to Creating a Helm Chart for Microservices" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Create the chart structure</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">helm create online-boutique</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">cd online-boutique</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="chartyaml">Chart.yaml<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#chartyaml" class="hash-link" aria-label="Direct link to Chart.yaml" title="Direct link to Chart.yaml" translate="no">​</a></h4>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v2</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> online</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">boutique</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">description</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Google Cloud microservices demo application</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> application</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">version</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 0.1.0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">appVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"v0.10.0"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">keywords</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> microservices</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> demo</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> ecommerce</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">maintainers</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> DevOps Team</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">email</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> devops@example.com</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="valuesyaml-for-microservices">values.yaml for Microservices<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#valuesyaml-for-microservices" class="hash-link" aria-label="Direct link to values.yaml for Microservices" title="Direct link to values.yaml for Microservices" translate="no">​</a></h4>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Global settings</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">global</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">environment</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> production</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">domain</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> boutique.example.com</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Frontend service</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">frontend</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">replicaCount</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">repository</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> gcr.io/google</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">samples/microservices</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">demo/frontend</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">tag</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v0.10.0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">service</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> LoadBalancer</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">80</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">limits</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">cpu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 200m</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 256Mi</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">requests</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">cpu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 100m</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 128Mi</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Product Catalog Service</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">productcatalog</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">replicaCount</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">repository</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> gcr.io/google</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">samples/microservices</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">demo/productcatalogservice</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">tag</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v0.10.0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">service</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3550</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">limits</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">cpu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 200m</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 128Mi</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Cart Service</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">cartservice</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">replicaCount</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">repository</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> gcr.io/google</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">samples/microservices</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">demo/cartservice</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">tag</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v0.10.0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">service</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">7070</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">limits</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">cpu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 300m</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 256Mi</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Redis Cache</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">redis</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">enabled</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">architecture</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> standalone</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">auth</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">enabled</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">master</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">limits</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">cpu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 200m</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 256Mi</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Checkout Service</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">checkoutservice</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">replicaCount</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">repository</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> gcr.io/google</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">samples/microservices</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">demo/checkoutservice</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">tag</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v0.10.0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">service</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5050</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">limits</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">cpu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 200m</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 128Mi</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Currency Service</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">currencyservice</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">replicaCount</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">repository</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> gcr.io/google</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">samples/microservices</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">demo/currencyservice</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">tag</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v0.10.0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">service</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">7000</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">limits</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">cpu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 200m</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 128Mi</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Payment Service</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">paymentservice</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">replicaCount</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">repository</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> gcr.io/google</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">samples/microservices</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">demo/paymentservice</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">tag</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v0.10.0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">service</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">50051</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">limits</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">cpu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 200m</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 128Mi</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Email Service</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">emailservice</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">replicaCount</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">repository</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> gcr.io/google</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">samples/microservices</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">demo/emailservice</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">tag</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v0.10.0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">service</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5000</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">limits</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">cpu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 200m</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 128Mi</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Shipping Service</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">shippingservice</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">replicaCount</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">repository</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> gcr.io/google</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">samples/microservices</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">demo/shippingservice</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">tag</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v0.10.0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">service</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">50051</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">limits</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">cpu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 200m</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 128Mi</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Recommendation Service</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">recommendationservice</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">replicaCount</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">repository</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> gcr.io/google</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">samples/microservices</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">demo/recommendationservice</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">tag</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v0.10.0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">service</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">8080</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">limits</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">cpu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 200m</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 256Mi</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Ad Service</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">adservice</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">replicaCount</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">repository</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> gcr.io/google</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">samples/microservices</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">demo/adservice</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">tag</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v0.10.0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">service</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">9555</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">limits</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">cpu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 300m</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 300Mi</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="template-example-templatesfrontend-deploymentyaml">Template Example: templates/frontend-deployment.yaml<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#template-example-templatesfrontend-deploymentyaml" class="hash-link" aria-label="Direct link to Template Example: templates/frontend-deployment.yaml" title="Direct link to Template Example: templates/frontend-deployment.yaml" translate="no">​</a></h4>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> apps/v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Deployment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> .Release.Name </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">frontend</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">labels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">app</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> frontend</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">chart</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> .Chart.Name </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> .Chart.Version </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">replicas</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> .Values.frontend.replicaCount </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">selector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">matchLabels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">app</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> frontend</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">template</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">labels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">app</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> frontend</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">containers</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> frontend</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"{{ .Values.frontend.image.repository }}:{{ .Values.frontend.image.tag }}"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">ports</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">containerPort</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">8080</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">env</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> PORT</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">value</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"8080"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> PRODUCT_CATALOG_SERVICE_ADDR</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">value</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"{{ .Release.Name }}-productcatalog:3550"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> CURRENCY_SERVICE_ADDR</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">value</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"{{ .Release.Name }}-currencyservice:7000"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> CART_SERVICE_ADDR</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">value</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"{{ .Release.Name }}-cartservice:7070"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> RECOMMENDATION_SERVICE_ADDR</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">value</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"{{ .Release.Name }}-recommendationservice:8080"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> SHIPPING_SERVICE_ADDR</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">value</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"{{ .Release.Name }}-shippingservice:50051"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> CHECKOUT_SERVICE_ADDR</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">value</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"{{ .Release.Name }}-checkoutservice:5050"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> AD_SERVICE_ADDR</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">value</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"{{ .Release.Name }}-adservice:9555"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> toYaml .Values.frontend.resources </span><span class="token punctuation" style="color:#393A34">|</span><span class="token plain"> nindent 10 </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">livenessProbe</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">httpGet</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">path</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /_healthz</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">8080</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">initialDelaySeconds</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">periodSeconds</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">readinessProbe</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">httpGet</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">path</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /_healthz</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">8080</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">initialDelaySeconds</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">periodSeconds</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="template-example-templatesfrontend-serviceyaml">Template Example: templates/frontend-service.yaml<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#template-example-templatesfrontend-serviceyaml" class="hash-link" aria-label="Direct link to Template Example: templates/frontend-service.yaml" title="Direct link to Template Example: templates/frontend-service.yaml" translate="no">​</a></h4>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Service</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> .Release.Name </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">frontend</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">external</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">labels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">app</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> frontend</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> .Values.frontend.service.type </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">selector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">app</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> frontend</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">ports</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> http</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> .Values.frontend.service.port </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">targetPort</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">8080</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="installing-microservices-with-helm">Installing Microservices with Helm<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#installing-microservices-with-helm" class="hash-link" aria-label="Direct link to Installing Microservices with Helm" title="Direct link to Installing Microservices with Helm" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Install the entire application</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">helm install boutique ./online-boutique</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Check deployment status</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">helm status boutique</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Watch pods coming up</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl get pods -l "release=boutique" -w</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Get the frontend URL</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl get service boutique-frontend-external</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Test different configurations for different environments</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Development environment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">helm install boutique-dev ./online-boutique \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --set frontend.replicaCount=1 \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --set global.environment=development</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Production environment with more replicas</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">helm install boutique-prod ./online-boutique \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --set frontend.replicaCount=5 \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --set productcatalog.replicaCount=5 \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --set global.environment=production</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="environment-specific-values-files">Environment-Specific Values Files<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#environment-specific-values-files" class="hash-link" aria-label="Direct link to Environment-Specific Values Files" title="Direct link to Environment-Specific Values Files" translate="no">​</a></h3>
<p>Create separate values files for each environment:</p>
<p><strong>values-dev.yaml</strong></p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">global</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">environment</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> development</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">frontend</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">replicaCount</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">limits</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">cpu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 100m</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 128Mi</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">productcatalog</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">replicaCount</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><br></div></code></pre></div></div>
<p><strong>values-prod.yaml</strong></p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">global</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">environment</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> production</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">frontend</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">replicaCount</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">limits</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">cpu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 500m</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 512Mi</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">productcatalog</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">replicaCount</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5</span><br></div></code></pre></div></div>
<p><strong>Install with environment-specific values:</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Development</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">helm install boutique-dev ./online-boutique -f values-dev.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Production</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">helm install boutique-prod ./online-boutique -f values-prod.yaml</span><br></div></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="gitops">🔄 GitOps Concepts<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#gitops" class="hash-link" aria-label="Direct link to 🔄 GitOps Concepts" title="Direct link to 🔄 GitOps Concepts" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-gitops">What is GitOps?<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#what-is-gitops" class="hash-link" aria-label="Direct link to What is GitOps?" title="Direct link to What is GitOps?" translate="no">​</a></h3>
<p><strong>Analogy:</strong> GitOps is like <strong>having a smart home system</strong>:</p>
<ul>
<li class="">Your desired home state is in an app (Git repository)</li>
<li class="">"Temperature: 72°F, Lights: On, Security: Armed"</li>
<li class="">The system constantly checks and adjusts to match your settings</li>
<li class="">Any change to settings is logged and versioned</li>
<li class="">You can easily revert to yesterday's settings</li>
</ul>
<p><strong>Traditional Deployment vs GitOps:</strong></p>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="gitops-principles">GitOps Principles<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#gitops-principles" class="hash-link" aria-label="Direct link to GitOps Principles" title="Direct link to GitOps Principles" translate="no">​</a></h3>






























<table><thead><tr><th>Principle</th><th>Description</th><th>Benefit</th></tr></thead><tbody><tr><td><strong>Declarative</strong></td><td>System state described declaratively</td><td>Clear, version-controlled desired state</td></tr><tr><td><strong>Versioned &amp; Immutable</strong></td><td>Everything in Git, never modified in place</td><td>Complete audit trail, easy rollback</td></tr><tr><td><strong>Pulled Automatically</strong></td><td>Software agents pull desired state</td><td>No external credentials needed</td></tr><tr><td><strong>Continuously Reconciled</strong></td><td>Software agents verify actual state</td><td>Self-healing, drift detection</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-gitops">Why GitOps?<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#why-gitops" class="hash-link" aria-label="Direct link to Why GitOps?" title="Direct link to Why GitOps?" translate="no">​</a></h3>
<p><strong>Without GitOps:</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Developer manually deploys</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl apply -f deployment.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Who deployed? When? Why? What was the previous state?</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># No audit trail, hard to rollback, risky</span><br></div></code></pre></div></div>
<p><strong>With GitOps:</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Developer commits change to Git</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">git add deployment.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">git commit -m "Increase replicas to 5 for Black Friday"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">git push</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># ArgoCD automatically:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 1. Detects the change</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 2. Validates the change</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 3. Applies to cluster</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 4. Monitors for drift</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Complete audit trail in Git history!</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="gitops-workflow">GitOps Workflow<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#gitops-workflow" class="hash-link" aria-label="Direct link to GitOps Workflow" title="Direct link to GitOps Workflow" translate="no">​</a></h3>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="repository-structure-for-gitops">Repository Structure for GitOps<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#repository-structure-for-gitops" class="hash-link" aria-label="Direct link to Repository Structure for GitOps" title="Direct link to Repository Structure for GitOps" translate="no">​</a></h3>
<p><strong>Two Repository Approach (Recommended):</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">app-source-repo/          # Application Code</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── src/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   └── main.go</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── Dockerfile</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">└── .github/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    └── workflows/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        └── ci.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">app-config-repo/          # Kubernetes Manifests</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── environments/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   ├── dev/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   │   ├── values.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   │   └── kustomization.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   ├── staging/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   │   └── values.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   └── prod/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│       └── values.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── helm-charts/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   └── my-app/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│       ├── Chart.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│       ├── values.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│       └── templates/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">└── argocd/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    └── applications/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        ├── dev-app.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        ├── staging-app.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        └── prod-app.yaml</span><br></div></code></pre></div></div>
<p><strong>Why Separate Repositories?</strong></p>
<ul>
<li class=""><strong>Security:</strong> Different access controls</li>
<li class=""><strong>Clarity:</strong> Code changes vs config changes</li>
<li class=""><strong>Automation:</strong> CI/CD pipelines are simpler</li>
<li class=""><strong>Auditability:</strong> Clear separation of concerns</li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="argocd">🎯 ArgoCD Configuration<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#argocd" class="hash-link" aria-label="Direct link to 🎯 ArgoCD Configuration" title="Direct link to 🎯 ArgoCD Configuration" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-argocd">What is ArgoCD?<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#what-is-argocd" class="hash-link" aria-label="Direct link to What is ArgoCD?" title="Direct link to What is ArgoCD?" translate="no">​</a></h3>
<p><strong>Analogy:</strong> ArgoCD is like a <strong>vigilant security guard</strong> for your cluster:</p>
<ul>
<li class="">Constantly compares what's in Git (the blueprint) vs what's running (the building)</li>
<li class="">Automatically fixes discrepancies</li>
<li class="">Alerts you to any unauthorized changes</li>
<li class="">Keeps detailed logs of all activities</li>
</ul>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="argocd-architecture-components">ArgoCD Architecture Components<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#argocd-architecture-components" class="hash-link" aria-label="Direct link to ArgoCD Architecture Components" title="Direct link to ArgoCD Architecture Components" translate="no">​</a></h3>

























<table><thead><tr><th>Component</th><th>Purpose</th><th>Analogy</th></tr></thead><tbody><tr><td><strong>API Server</strong></td><td>Handles API calls, UI, CLI</td><td>Receptionist</td></tr><tr><td><strong>Repository Server</strong></td><td>Fetches manifests from Git</td><td>Librarian</td></tr><tr><td><strong>Application Controller</strong></td><td>Monitors apps, syncs state</td><td>Quality Inspector</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="installing-argocd">Installing ArgoCD<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#installing-argocd" class="hash-link" aria-label="Direct link to Installing ArgoCD" title="Direct link to Installing ArgoCD" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-1-create-namespace-and-install">Step 1: Create Namespace and Install<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#step-1-create-namespace-and-install" class="hash-link" aria-label="Direct link to Step 1: Create Namespace and Install" title="Direct link to Step 1: Create Namespace and Install" translate="no">​</a></h4>
<p>Better use helm <code>https://github.com/argoproj/argo-helm/tree/main/charts/argo-cd</code></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Create namespace</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl create namespace argocd</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Install ArgoCD</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Wait for pods to be ready</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl get pods -n argocd -w</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-2-access-argocd-ui">Step 2: Access ArgoCD UI<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#step-2-access-argocd-ui" class="hash-link" aria-label="Direct link to Step 2: Access ArgoCD UI" title="Direct link to Step 2: Access ArgoCD UI" translate="no">​</a></h4>
<p><strong>Option 1: Port Forward (Quick Test)</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Forward port 8080 to ArgoCD server</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl port-forward svc/argocd-server -n argocd 8080:443</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Access at: https://localhost:8080</span><br></div></code></pre></div></div>
<p><strong>Option 2: LoadBalancer (Production)</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Change service type to LoadBalancer</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "LoadBalancer"}}'</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Get external IP</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl get svc argocd-server -n argocd</span><br></div></code></pre></div></div>
<p><strong>Option 3: Ingress (Recommended for Production)</strong></p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># argocd-ingress.yaml</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> networking.k8s.io/v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Ingress</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> argocd</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">server</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">ingress</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> argocd</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">annotations</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">cert-manager.io/cluster-issuer</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> letsencrypt</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">prod</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">nginx.ingress.kubernetes.io/ssl-passthrough</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"true"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">nginx.ingress.kubernetes.io/backend-protocol</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"HTTPS"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">ingressClassName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nginx</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">rules</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">host</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> argocd.example.com</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">http</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">paths</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">path</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">pathType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Prefix</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">backend</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">service</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> argocd</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">server</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">number</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">443</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">tls</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">hosts</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> argocd.example.com</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">secretName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> argocd</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">tls</span><br></div></code></pre></div></div>
<p>Apply ingress:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">kubectl apply -f argocd-ingress.yaml</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-3-get-initial-admin-password">Step 3: Get Initial Admin Password<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#step-3-get-initial-admin-password" class="hash-link" aria-label="Direct link to Step 3: Get Initial Admin Password" title="Direct link to Step 3: Get Initial Admin Password" translate="no">​</a></h4>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Get the initial admin password</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d &amp;&amp; echo</span><br></div></code></pre></div></div>
<p><strong>Default Credentials:</strong></p>
<ul>
<li class="">Username: <code>admin</code></li>
<li class="">Password: (from the command above)</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-4-login-with-cli">Step 4: Login with CLI<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#step-4-login-with-cli" class="hash-link" aria-label="Direct link to Step 4: Login with CLI" title="Direct link to Step 4: Login with CLI" translate="no">​</a></h4>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Install ArgoCD CLI</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># macOS</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">brew install argocd</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Linux</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">curl -sSL -o argocd https://github.com/argoproj/argo-cd/releases/latest/download/argocd-linux-amd64</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">chmod +x argocd</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">sudo mv argocd /usr/local/bin/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Login</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">argocd login localhost:8080 --username admin --password &lt;initial-password&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Change password</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">argocd account update-password</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="configuring-your-first-application">Configuring Your First Application<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#configuring-your-first-application" class="hash-link" aria-label="Direct link to Configuring Your First Application" title="Direct link to Configuring Your First Application" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="method-1-using-cli">Method 1: Using CLI<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#method-1-using-cli" class="hash-link" aria-label="Direct link to Method 1: Using CLI" title="Direct link to Method 1: Using CLI" translate="no">​</a></h4>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Create application</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">argocd app create boutique-dev \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --repo https://github.com/your-org/app-config-repo.git \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --path helm-charts/online-boutique \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --dest-server https://kubernetes.default.svc \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --dest-namespace default \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --values values-dev.yaml \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --sync-policy automated \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --auto-prune \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --self-heal</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Check application status</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">argocd app get boutique-dev</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Sync manually (if not auto-sync)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">argocd app sync boutique-dev</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># View logs</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">argocd app logs boutique-dev</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="method-2-using-yaml-manifest-recommended">Method 2: Using YAML Manifest (Recommended)<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#method-2-using-yaml-manifest-recommended" class="hash-link" aria-label="Direct link to Method 2: Using YAML Manifest (Recommended)" title="Direct link to Method 2: Using YAML Manifest (Recommended)" translate="no">​</a></h4>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># argocd-application.yaml</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> argoproj.io/v1alpha1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Application</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> boutique</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">dev</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> argocd</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># Finalizer that ensures cascading deletes</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">finalizers</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> resources</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">finalizer.argocd.argoproj.io</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># The project the application belongs to</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">project</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> default</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># Source of the application manifests</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">source</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">repoURL</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//github.com/your</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">org/app</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">config</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">repo.git</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">targetRevision</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> HEAD  </span><span class="token comment" style="color:#999988;font-style:italic"># Can be branch, tag, or commit SHA</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">path</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> helm</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">charts/online</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">boutique</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># Helm specific config</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">helm</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># Use specific values file</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">valueFiles</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> values</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">dev.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># Override specific values</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">parameters</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> frontend.replicaCount</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">value</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"2"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> global.environment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">value</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"development"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># Destination cluster and namespace</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">destination</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">server</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//kubernetes.default.svc</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> default</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># Sync policy</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">syncPolicy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">automated</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># Automatically sync when Git changes</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">prune</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># Delete resources not in Git</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">selfHeal</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain">     </span><span class="token comment" style="color:#999988;font-style:italic"># Force sync if cluster state changes</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">allowEmpty</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">false</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># Don't sync if repo is empty</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">syncOptions</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> CreateNamespace=true  </span><span class="token comment" style="color:#999988;font-style:italic"># Auto-create namespace if needed</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># Retry config</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">retry</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">limit</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">backoff</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">duration</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 5s</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">factor</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">maxDuration</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 3m</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># Health check configuration</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">ignoreDifferences</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">group</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> apps</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Deployment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">jsonPointers</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> /spec/replicas  </span><span class="token comment" style="color:#999988;font-style:italic"># Ignore if HPA modifies replicas</span><br></div></code></pre></div></div>
<p>Apply the application:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">kubectl apply -f argocd-application.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Watch it sync</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl get applications -n argocd -w</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="argocd-sync-policies">ArgoCD Sync Policies<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#argocd-sync-policies" class="hash-link" aria-label="Direct link to ArgoCD Sync Policies" title="Direct link to ArgoCD Sync Policies" translate="no">​</a></h3>






























<table><thead><tr><th>Policy</th><th>Description</th><th>Use Case</th></tr></thead><tbody><tr><td><strong>Manual</strong></td><td>Require manual trigger to sync</td><td>Production deployments requiring approval</td></tr><tr><td><strong>Automated</strong></td><td>Auto-sync on Git changes</td><td>Development/staging environments</td></tr><tr><td><strong>Prune</strong></td><td>Delete resources not in Git</td><td>Keep cluster clean</td></tr><tr><td><strong>Self-Heal</strong></td><td>Revert manual cluster changes</td><td>Enforce GitOps principles</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="advanced-argocd-configurations">Advanced ArgoCD Configurations<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#advanced-argocd-configurations" class="hash-link" aria-label="Direct link to Advanced ArgoCD Configurations" title="Direct link to Advanced ArgoCD Configurations" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="multi-environment-setup">Multi-Environment Setup<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#multi-environment-setup" class="hash-link" aria-label="Direct link to Multi-Environment Setup" title="Direct link to Multi-Environment Setup" translate="no">​</a></h4>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># argocd-apps/dev-app.yaml</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> argoproj.io/v1alpha1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Application</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> boutique</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">dev</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> argocd</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">project</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> boutique</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">source</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">repoURL</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//github.com/your</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">org/app</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">config</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">repo.git</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">targetRevision</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> develop</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">path</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> helm</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">charts/online</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">boutique</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">helm</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">valueFiles</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> values</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">dev.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">destination</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">server</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//kubernetes.default.svc</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> dev</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">syncPolicy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">automated</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">prune</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">selfHeal</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># argocd-apps/staging-app.yaml</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> argoproj.io/v1alpha1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Application</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> boutique</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">staging</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> argocd</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">project</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> boutique</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">source</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">repoURL</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//github.com/your</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">org/app</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">config</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">repo.git</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">targetRevision</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> main</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">path</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> helm</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">charts/online</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">boutique</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">helm</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">valueFiles</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> values</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">staging.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">destination</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">server</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//kubernetes.default.svc</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> staging</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">syncPolicy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">automated</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">prune</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">selfHeal</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">false</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># Require approval for staging</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># argocd-apps/prod-app.yaml</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> argoproj.io/v1alpha1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Application</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> boutique</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">prod</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> argocd</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">project</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> boutique</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">source</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">repoURL</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//github.com/your</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">org/app</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">config</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">repo.git</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">targetRevision</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v1.0.0  </span><span class="token comment" style="color:#999988;font-style:italic"># Use tags for prod</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">path</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> helm</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">charts/online</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">boutique</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">helm</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">valueFiles</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> values</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">prod.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">destination</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">server</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//kubernetes.default.svc</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> prod</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">syncPolicy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">automated</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">false</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># Manual sync for production</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="app-of-apps-pattern">App of Apps Pattern<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#app-of-apps-pattern" class="hash-link" aria-label="Direct link to App of Apps Pattern" title="Direct link to App of Apps Pattern" translate="no">​</a></h4>
<p>Create a master app that manages other apps:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># argocd-apps/root-app.yaml</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> argoproj.io/v1alpha1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Application</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> root</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">app</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> argocd</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">project</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> default</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">source</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">repoURL</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//github.com/your</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">org/app</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">config</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">repo.git</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">targetRevision</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> HEAD</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">path</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> argocd</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">apps</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">destination</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">server</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//kubernetes.default.svc</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> argocd</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">syncPolicy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">automated</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">prune</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">selfHeal</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><br></div></code></pre></div></div>
<p>Now all your apps are managed by this root app!</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">kubectl apply -f argocd-apps/root-app.yaml</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="argocd-projects-multi-tenancy">ArgoCD Projects (Multi-Tenancy)<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#argocd-projects-multi-tenancy" class="hash-link" aria-label="Direct link to ArgoCD Projects (Multi-Tenancy)" title="Direct link to ArgoCD Projects (Multi-Tenancy)" translate="no">​</a></h3>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># argocd-project.yaml</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> argoproj.io/v1alpha1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> AppProject</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> boutique</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> argocd</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">description</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Online Boutique Application</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># Allow deployments to these clusters</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">destinations</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> dev</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">server</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//kubernetes.default.svc</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> staging</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">server</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//kubernetes.default.svc</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> prod</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">server</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//kubernetes.default.svc</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># Allow pulling from these Git repos</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">sourceRepos</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> https</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//github.com/your</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">org/app</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">config</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">repo.git</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># Allowed resource types</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">clusterResourceWhitelist</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">group</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">''</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Namespace</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespaceResourceWhitelist</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">group</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'apps'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Deployment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">group</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">''</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Service</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">group</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">''</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ConfigMap</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">group</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">''</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Secret</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># RBAC roles</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">roles</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> developer</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">description</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Developers can view and sync</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">policies</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> p</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> proj</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">boutique</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">developer</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> applications</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> get</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> boutique/*</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> allow</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> p</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> proj</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">boutique</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">developer</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> applications</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> sync</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> boutique/dev</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">*</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> allow</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> admin</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">description</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Admins have full access</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">policies</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> p</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> proj</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">boutique</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">admin</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> applications</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> *</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> boutique/*</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> allow</span><br></div></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="complete-workflow">🔄 Complete Workflow Example<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#complete-workflow" class="hash-link" aria-label="Direct link to 🔄 Complete Workflow Example" title="Direct link to 🔄 Complete Workflow Example" translate="no">​</a></h2>
<p>Let's put everything together with a real-world scenario!</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="scenario-deploying-online-boutique-with-gitops">Scenario: Deploying Online Boutique with GitOps<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#scenario-deploying-online-boutique-with-gitops" class="hash-link" aria-label="Direct link to Scenario: Deploying Online Boutique with GitOps" title="Direct link to Scenario: Deploying Online Boutique with GitOps" translate="no">​</a></h3>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-by-step-implementation">Step-by-Step Implementation<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#step-by-step-implementation" class="hash-link" aria-label="Direct link to Step-by-Step Implementation" title="Direct link to Step-by-Step Implementation" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-repository-setup">1. Repository Setup<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#1-repository-setup" class="hash-link" aria-label="Direct link to 1. Repository Setup" title="Direct link to 1. Repository Setup" translate="no">​</a></h4>
<p><strong>App Source Repository:</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Create and clone your app repo</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">git clone https://github.com/your-org/online-boutique-app.git</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">cd online-boutique-app</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Structure</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># online-boutique-app/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># ├── src/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># │   ├── frontend/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># │   ├── cartservice/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># │   └── productcatalogservice/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># ├── Dockerfile</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># └── .github/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">#     └── workflows/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">#         └── ci.yaml</span><br></div></code></pre></div></div>
<p><strong>Config Repository:</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Create and clone your config repo</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">git clone https://github.com/your-org/online-boutique-config.git</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">cd online-boutique-config</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Structure</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># online-boutique-config/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># ├── helm-charts/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># │   └── online-boutique/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># ├── environments/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># │   ├── dev/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># │   ├── staging/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># │   └── prod/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># └── argocd-apps/</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-ci-pipeline-github-actions">2. CI Pipeline (GitHub Actions)<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#2-ci-pipeline-github-actions" class="hash-link" aria-label="Direct link to 2. CI Pipeline (GitHub Actions)" title="Direct link to 2. CI Pipeline (GitHub Actions)" translate="no">​</a></h4>
<p><strong>Create <code>.github/workflows/ci.yaml</code>:</strong></p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> CI/CD Pipeline</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">on</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">push</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">branches</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"> main</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> develop </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">pull_request</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">branches</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"> main </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">env</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">REGISTRY</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ghcr.io</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">IMAGE_NAME</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> github.repository </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">jobs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">build-and-push</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">runs-on</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ubuntu</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">latest</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">permissions</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">contents</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> write</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">packages</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> write</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">steps</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Checkout code</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">uses</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> actions/checkout@v3</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Set up Docker Buildx</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">uses</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> docker/setup</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">buildx</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">action@v2</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Log in to GitHub Container Registry</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">uses</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> docker/login</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">action@v2</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">with</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">registry</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> env.REGISTRY </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">username</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> github.actor </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">password</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> secrets.GITHUB_TOKEN </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Extract metadata</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> meta</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">uses</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> docker/metadata</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">action@v4</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">with</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">images</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> env.REGISTRY </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">/$</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> env.IMAGE_NAME </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">tags</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">|</span><span class="token scalar string" style="color:#e3116c"></span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">            type=ref,event=branch</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">            type=sha,prefix={{branch}}-</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">            type=semver,pattern={{version}}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Build and push Docker image</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">uses</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> docker/build</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">push</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">action@v4</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">with</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">context</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> .</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">push</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">tags</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> steps.meta.outputs.tags </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">labels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> steps.meta.outputs.labels </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">cache-from</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> type=gha</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">cache-to</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> type=gha</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">mode=max</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Update Helm values</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">env</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">IMAGE_TAG</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> github.sha </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">run</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">|</span><span class="token scalar string" style="color:#e3116c"></span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">          # Clone config repo</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">          git clone https://github.com/your-org/online-boutique-config.git</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">          cd online-boutique-config</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token comment" style="color:#999988;font-style:italic"># Update image tag in values file</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">sed -i "s/tag</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">.*/tag</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> \"$IMAGE_TAG\"/" \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            environments/dev/values.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token comment" style="color:#999988;font-style:italic"># Commit and push</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          git config user.name "GitHub Actions"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          git config user.email "actions@github.com"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          git add environments/dev/values.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          git commit </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">m "Update image tag to $IMAGE_TAG"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          git push https</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//x</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">access</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">token</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">$</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> secrets.GH_PAT </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">@github.com/your</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">org/online</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">boutique</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">config.git</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-helm-chart-configuration">3. Helm Chart Configuration<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#3-helm-chart-configuration" class="hash-link" aria-label="Direct link to 3. Helm Chart Configuration" title="Direct link to 3. Helm Chart Configuration" translate="no">​</a></h4>
<p><strong>helm-charts/online-boutique/values.yaml:</strong></p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Default values</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">global</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">environment</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> development</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">imageRegistry</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ghcr.io/your</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">org</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">frontend</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">enabled</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">replicaCount</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">repository</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> online</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">boutique</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">app/frontend</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">tag</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"latest"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">pullPolicy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> IfNotPresent</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">service</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ClusterIP</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">80</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">targetPort</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">8080</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">limits</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">cpu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 200m</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 256Mi</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">requests</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">cpu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 100m</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 128Mi</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">autoscaling</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">enabled</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">minReplicas</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">maxReplicas</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">targetCPUUtilizationPercentage</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">80</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Similar blocks for other services...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">productcatalog</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">enabled</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">replicaCount</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># ... config</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">cartservice</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">enabled</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">replicaCount</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># ... config</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># etc.</span><br></div></code></pre></div></div>
<p><strong>environments/dev/values.yaml:</strong></p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">global</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">environment</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> development</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">frontend</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">replicaCount</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">limits</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">cpu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 100m</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 128Mi</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">productcatalog</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">replicaCount</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><br></div></code></pre></div></div>
<p><strong>environments/prod/values.yaml:</strong></p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">global</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">environment</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> production</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">frontend</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">replicaCount</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">autoscaling</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">enabled</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">minReplicas</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">maxReplicas</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">20</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">limits</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">cpu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 500m</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 512Mi</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">productcatalog</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">replicaCount</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">autoscaling</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">enabled</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-argocd-application-setup">4. ArgoCD Application Setup<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#4-argocd-application-setup" class="hash-link" aria-label="Direct link to 4. ArgoCD Application Setup" title="Direct link to 4. ArgoCD Application Setup" translate="no">​</a></h4>
<p><strong>argocd-apps/boutique-dev.yaml:</strong></p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> argoproj.io/v1alpha1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Application</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> boutique</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">dev</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> argocd</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">finalizers</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> resources</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">finalizer.argocd.argoproj.io</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">project</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> default</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">source</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">repoURL</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//github.com/your</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">org/online</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">boutique</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">config.git</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">targetRevision</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> develop</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">path</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> helm</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">charts/online</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">boutique</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">helm</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">valueFiles</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> ../../environments/dev/values.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">destination</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">server</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//kubernetes.default.svc</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> dev</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">syncPolicy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">automated</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">prune</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">selfHeal</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">syncOptions</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> CreateNamespace=true</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-deploy-everything">5. Deploy Everything<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#5-deploy-everything" class="hash-link" aria-label="Direct link to 5. Deploy Everything" title="Direct link to 5. Deploy Everything" translate="no">​</a></h4>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># 1. Install ArgoCD (if not already)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl create namespace argocd</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 2. Apply ArgoCD applications</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl apply -f argocd-apps/boutique-dev.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 3. Watch the magic happen!</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl get applications -n argocd</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">argocd app get boutique-dev --watch</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 4. Access the application</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl get svc -n dev</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-make-a-change-and-watch-gitops-in-action">6. Make a Change and Watch GitOps in Action<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#6-make-a-change-and-watch-gitops-in-action" class="hash-link" aria-label="Direct link to 6. Make a Change and Watch GitOps in Action" title="Direct link to 6. Make a Change and Watch GitOps in Action" translate="no">​</a></h4>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># In your app source repo</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">cd online-boutique-app</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo "console.log('New feature!');" &gt;&gt; src/frontend/app.js</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">git add .</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">git commit -m "Add new feature"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">git push origin main</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># GitHub Actions will:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 1. Build new image</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 2. Push to registry</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 3. Update config repo</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># ArgoCD will:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 1. Detect the change in config repo</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 2. Pull new manifests</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 3. Apply to cluster</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 4. Show sync status in UI</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Watch it happen:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">argocd app watch boutique-dev</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="troubleshooting-common-issues">Troubleshooting Common Issues<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#troubleshooting-common-issues" class="hash-link" aria-label="Direct link to Troubleshooting Common Issues" title="Direct link to Troubleshooting Common Issues" translate="no">​</a></h3>
<p><strong>Issue 1: Application Out of Sync</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Check differences</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">argocd app diff boutique-dev</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Manual sync</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">argocd app sync boutique-dev</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Force sync (if needed)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">argocd app sync boutique-dev --force</span><br></div></code></pre></div></div>
<p><strong>Issue 2: Image Pull Errors</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Create image pull secret</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl create secret docker-registry regcred \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --docker-server=ghcr.io \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --docker-username=your-username \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --docker-password=your-token \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  -n dev</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Reference in deployment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Add to values.yaml:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">imagePullSecrets:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  - name: regcred</span><br></div></code></pre></div></div>
<p><strong>Issue 3: Health Check Failures</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Check pod logs</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl logs -n dev deployment/boutique-dev-frontend</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Check events</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl get events -n dev --sort-by='.lastTimestamp'</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Describe deployment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl describe deployment boutique-dev-frontend -n dev</span><br></div></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="best-practices">📋 Best Practices<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#best-practices" class="hash-link" aria-label="Direct link to 📋 Best Practices" title="Direct link to 📋 Best Practices" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="helm-best-practices">Helm Best Practices<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#helm-best-practices" class="hash-link" aria-label="Direct link to Helm Best Practices" title="Direct link to Helm Best Practices" translate="no">​</a></h3>
<ol>
<li class="">
<p><strong>Version Everything</strong></p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Always specify versions</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v2</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">version</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 1.2.3</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">appVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"2.0.1"</span><br></div></code></pre></div></div>
</li>
<li class="">
<p><strong>Use Semantic Versioning</strong></p>
<ul>
<li class="">MAJOR.MINOR.PATCH (1.2.3)</li>
<li class="">MAJOR: Breaking changes</li>
<li class="">MINOR: New features</li>
<li class="">PATCH: Bug fixes</li>
</ul>
</li>
<li class="">
<p><strong>Document Your Charts</strong></p>
<div class="language-markdown codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-markdown codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token title important punctuation" style="color:#393A34">#</span><span class="token title important"> README.md</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">##</span><span class="token title important"> Configuration</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token table table-header-row punctuation" style="color:#393A34">|</span><span class="token table table-header-row table-header important"> Parameter </span><span class="token table table-header-row punctuation" style="color:#393A34">|</span><span class="token table table-header-row table-header important"> Description </span><span class="token table table-header-row punctuation" style="color:#393A34">|</span><span class="token table table-header-row table-header important"> Default </span><span class="token table table-header-row punctuation" style="color:#393A34">|</span><span class="token table table-header-row"></span><br></div><div class="token-line" style="color:#393A34"><span class="token table table-header-row"></span><span class="token table table-line punctuation" style="color:#393A34">|</span><span class="token table table-line punctuation" style="color:#393A34">-----------</span><span class="token table table-line punctuation" style="color:#393A34">|</span><span class="token table table-line punctuation" style="color:#393A34">-------------</span><span class="token table table-line punctuation" style="color:#393A34">|</span><span class="token table table-line punctuation" style="color:#393A34">---------</span><span class="token table table-line punctuation" style="color:#393A34">|</span><span class="token table table-line"></span><br></div><div class="token-line" style="color:#393A34"><span class="token table table-line"></span><span class="token table table-data-rows punctuation" style="color:#393A34">|</span><span class="token table table-data-rows table-data"> replicaCount </span><span class="token table table-data-rows punctuation" style="color:#393A34">|</span><span class="token table table-data-rows table-data"> Number of replicas </span><span class="token table table-data-rows punctuation" style="color:#393A34">|</span><span class="token table table-data-rows table-data"> 3 </span><span class="token table table-data-rows punctuation" style="color:#393A34">|</span><br></div></code></pre></div></div>
</li>
<li class="">
<p><strong>Use _helpers.tpl for Reusable Templates</strong></p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> define "myapp.fullname" </span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> printf "%s</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">%s" .Release.Name .Chart.Name </span><span class="token punctuation" style="color:#393A34">|</span><span class="token plain"> trunc 63 </span><span class="token punctuation" style="color:#393A34">|</span><span class="token plain"> trimSuffix "</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">" </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> end </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
</li>
<li class="">
<p><strong>Always Set Resource Limits</strong></p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">limits</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">cpu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 500m</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 512Mi</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">requests</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">cpu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 250m</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 256Mi</span><br></div></code></pre></div></div>
</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="gitops-best-practices">GitOps Best Practices<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#gitops-best-practices" class="hash-link" aria-label="Direct link to GitOps Best Practices" title="Direct link to GitOps Best Practices" translate="no">​</a></h3>
<ol>
<li class="">
<p><strong>Separate Code from Config</strong></p>
<ul>
<li class="">One repo for application code</li>
<li class="">One repo for Kubernetes manifests</li>
</ul>
</li>
<li class="">
<p><strong>Use Branches for Environments</strong></p>
<ul>
<li class=""><code>develop</code> → dev environment</li>
<li class=""><code>main</code> → staging environment</li>
<li class=""><code>tags</code> → production environment</li>
</ul>
</li>
<li class="">
<p><strong>Implement PR Reviews</strong></p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># GitHub branch protection</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> Require pull request reviews</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> Require status checks</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> Require signed commits</span><br></div></code></pre></div></div>
</li>
<li class="">
<p><strong>Never Commit Secrets</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Use Sealed Secrets or External Secrets</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Never in Git:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">password: mypassword  # ❌</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Instead:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">apiVersion: bitnami.com/v1alpha1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kind: SealedSecret</span><br></div></code></pre></div></div>
</li>
<li class="">
<p><strong>Tag Production Releases</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">git tag -a v1.0.0 -m "Production release"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">git push origin v1.0.0</span><br></div></code></pre></div></div>
</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="argocd-best-practices">ArgoCD Best Practices<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#argocd-best-practices" class="hash-link" aria-label="Direct link to ArgoCD Best Practices" title="Direct link to ArgoCD Best Practices" translate="no">​</a></h3>
<ol>
<li class="">
<p><strong>Use Projects for Multi-Tenancy</strong></p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Isolate teams</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">project</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> team</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">a</span><br></div></code></pre></div></div>
</li>
<li class="">
<p><strong>Enable Automated Sync with Caution</strong></p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Dev: auto-sync ✓</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Staging: auto-sync with approval</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Prod: manual sync</span><br></div></code></pre></div></div>
</li>
<li class="">
<p><strong>Configure Notifications</strong></p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Slack, email notifications</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ConfigMap</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> argocd</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">notifications</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">cm</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">data</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">service.slack</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">|</span><span class="token scalar string" style="color:#e3116c"></span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">    token: $slack-token</span><br></div></code></pre></div></div>
</li>
<li class="">
<p><strong>Use Health Checks</strong></p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Custom health assessments</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">healthCheck</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">http</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">path</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /healthz</span><br></div></code></pre></div></div>
</li>
<li class="">
<p><strong>Implement RBAC</strong></p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Role-based access</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">p</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> role</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">developer</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> applications</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> get</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token important">*/*</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> allow</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">p</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> role</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">developer</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> applications</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> sync</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token important">*/dev-*</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> allow</span><br></div></code></pre></div></div>
</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="security-best-practices">Security Best Practices<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#security-best-practices" class="hash-link" aria-label="Direct link to Security Best Practices" title="Direct link to Security Best Practices" translate="no">​</a></h3>
<ol>
<li class="">
<p><strong>Scan Images</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># In CI pipeline</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">- name: Scan image</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  uses: aquasecurity/trivy-action@master</span><br></div></code></pre></div></div>
</li>
<li class="">
<p><strong>Use Non-Root Containers</strong></p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">securityContext</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">runAsNonRoot</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">runAsUser</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1000</span><br></div></code></pre></div></div>
</li>
<li class="">
<p><strong>Implement Network Policies</strong></p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> networking.k8s.io/v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> NetworkPolicy</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> deny</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">all</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">podSelector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">policyTypes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> Ingress</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> Egress</span><br></div></code></pre></div></div>
</li>
<li class="">
<p><strong>Rotate Credentials</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Regular rotation</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">argocd account update-password</span><br></div></code></pre></div></div>
</li>
<li class="">
<p><strong>Audit Logs</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Monitor ArgoCD activity</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl logs -n argocd deployment/argocd-server</span><br></div></code></pre></div></div>
</li>
</ol>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-quick-reference-commands">🎓 Quick Reference Commands<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#-quick-reference-commands" class="hash-link" aria-label="Direct link to 🎓 Quick Reference Commands" title="Direct link to 🎓 Quick Reference Commands" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="helm-commands">Helm Commands<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#helm-commands" class="hash-link" aria-label="Direct link to Helm Commands" title="Direct link to Helm Commands" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Chart Management</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">helm create &lt;chart-name&gt;              # Create new chart</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">helm lint &lt;chart&gt;                     # Validate chart</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">helm template &lt;chart&gt;                 # Render templates</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">helm package &lt;chart&gt;                  # Package chart</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Repository Management</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">helm repo add &lt;name&gt; &lt;url&gt;            # Add repository</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">helm repo update                      # Update repositories</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">helm search repo &lt;keyword&gt;            # Search charts</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Release Management</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">helm install &lt;name&gt; &lt;chart&gt;           # Install chart</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">helm upgrade &lt;name&gt; &lt;chart&gt;           # Upgrade release</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">helm rollback &lt;name&gt; &lt;revision&gt;       # Rollback release</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">helm uninstall &lt;name&gt;                 # Delete release</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">helm list                             # List releases</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">helm history &lt;name&gt;                   # View release history</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Debugging</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">helm get values &lt;name&gt;                # Show values</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">helm get manifest &lt;name&gt;              # Show manifests</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">helm get all &lt;name&gt;                   # Show everything</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="argocd-commands">ArgoCD Commands<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#argocd-commands" class="hash-link" aria-label="Direct link to ArgoCD Commands" title="Direct link to ArgoCD Commands" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Application Management</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">argocd app create &lt;name&gt;              # Create app</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">argocd app get &lt;name&gt;                 # Get app details</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">argocd app list                       # List apps</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">argocd app delete &lt;name&gt;              # Delete app</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Sync Operations</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">argocd app sync &lt;name&gt;                # Sync app</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">argocd app sync &lt;name&gt; --force        # Force sync</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">argocd app wait &lt;name&gt;                # Wait for sync</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Monitoring</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">argocd app watch &lt;name&gt;               # Watch app status</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">argocd app logs &lt;name&gt;                # View logs</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">argocd app diff &lt;name&gt;                # Show differences</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Repository Management</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">argocd repo add &lt;url&gt;                 # Add repository</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">argocd repo list                      # List repositories</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="kubectl-commands">Kubectl Commands<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#kubectl-commands" class="hash-link" aria-label="Direct link to Kubectl Commands" title="Direct link to Kubectl Commands" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Pod Management</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl get pods                      # List pods</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl logs &lt;pod&gt;                    # View logs</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl exec -it &lt;pod&gt; -- /bin/bash   # Shell into pod</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl describe pod &lt;pod&gt;            # Describe pod</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Deployment Management</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl get deployments               # List deployments</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl scale deployment &lt;name&gt; --replicas=5</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl rollout status deployment/&lt;name&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl rollout history deployment/&lt;name&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Service Management</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl get services                  # List services</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl expose deployment &lt;name&gt;      # Expose deployment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Namespace Management</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl get namespaces                # List namespaces</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl create namespace &lt;name&gt;       # Create namespace</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kubectl config set-context --current --namespace=&lt;name&gt;</span><br></div></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-conclusion">🎉 Conclusion<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#-conclusion" class="hash-link" aria-label="Direct link to 🎉 Conclusion" title="Direct link to 🎉 Conclusion" translate="no">​</a></h2>
<p>Congratulations! You now understand:</p>
<p>✅ <strong>Kubernetes fundamentals</strong> - The building blocks<br>
✅ <strong>Helm Charts</strong> - Package management for K8s<br>
✅ <strong>Microservices deployment</strong> - Complex apps made simple<br>
✅ <strong>GitOps principles</strong> - Git as the source of truth<br>
✅ <strong>ArgoCD</strong> - Automated continuous delivery<br>
✅ <strong>Complete workflow</strong> - From code to production</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="next-steps">Next Steps<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#next-steps" class="hash-link" aria-label="Direct link to Next Steps" title="Direct link to Next Steps" translate="no">​</a></h3>
<ol>
<li class=""><strong>Practice:</strong> Set up a test cluster and try the examples</li>
<li class=""><strong>Explore:</strong> Check out Artifact Hub for more charts</li>
<li class=""><strong>Contribute:</strong> Share your charts with the community</li>
<li class=""><strong>Learn More:</strong> Dive into advanced topics like:
<ul>
<li class="">Helm hooks</li>
<li class="">ArgoCD ApplicationSets</li>
<li class="">Progressive delivery with Argo Rollouts</li>
<li class="">Secret management with Sealed Secrets</li>
</ul>
</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="additional-resources">Additional Resources<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#additional-resources" class="hash-link" aria-label="Direct link to Additional Resources" title="Direct link to Additional Resources" translate="no">​</a></h3>
<ul>
<li class="">📖 <a href="https://helm.sh/docs/" target="_blank" rel="noopener noreferrer" class="">Helm Documentation</a></li>
<li class="">📖 <a href="https://argo-cd.readthedocs.io/" target="_blank" rel="noopener noreferrer" class="">ArgoCD Documentation</a></li>
<li class="">📦 <a href="https://artifacthub.io/" target="_blank" rel="noopener noreferrer" class="">Artifact Hub</a></li>
<li class="">🐙 <a href="https://github.com/GoogleCloudPlatform/microservices-demo" target="_blank" rel="noopener noreferrer" class="">Online Boutique Demo</a></li>
<li class="">🎓 <a href="https://kubernetes.io/docs/" target="_blank" rel="noopener noreferrer" class="">Kubernetes Documentation</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="visual-references">Visual References<a href="https://www.ashikmostofa.com/writing/helm-gitops-guide#visual-references" class="hash-link" aria-label="Direct link to Visual References" title="Direct link to Visual References" translate="no">​</a></h3>
<p><strong>Helm Logo &amp; Concepts:</strong>
<img decoding="async" loading="lazy" src="https://helm.sh/img/helm-logo.svg" alt="Helm Architecture" class="img_ev3q"></p>
<p><strong>ArgoCD Dashboard Example:</strong>
<img decoding="async" loading="lazy" src="https://argo-cd.readthedocs.io/en/stable/assets/argocd-ui.gif" alt="ArgoCD Dashboard" class="img_ev3q"></p>
<p><strong>GitOps Workflow:</strong>
<img decoding="async" loading="lazy" src="https://www.weave.works/assets/images/blt689fe1ea8e00e37f/GitOps.png" alt="GitOps Flow" class="img_ev3q"></p>
<hr>
<p><strong>Made with ❤️ for DevOps Beginners</strong></p>
<p><em>"The best way to learn is by doing. Start small, iterate often, and don't be afraid to break things in your test environment!"</em></p>
<hr>
<p><em>Written while teaching DevOps to 800+ engineers across 12 cohorts.</em></p>]]></content>
        <author>
            <name>Ashik Mostofa Tonmoy</name>
            <email>tonmoy.ashik@gmail.com</email>
            <uri>https://ashikmostofa.com</uri>
        </author>
        <category label="guide" term="guide"/>
        <category label="helm" term="helm"/>
        <category label="gitops" term="gitops"/>
        <category label="argocd" term="argocd"/>
        <category label="kubernetes" term="kubernetes"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Complete Terraform Learning Guide]]></title>
        <id>https://www.ashikmostofa.com/writing/terraform-complete-guide</id>
        <link href="https://www.ashikmostofa.com/writing/terraform-complete-guide"/>
        <updated>2026-09-01T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Master Infrastructure as Code with Terraform: learn core concepts, modules, state management, best practices, and deployment strategies.]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-table-of-contents">📚 Table of Contents<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#-table-of-contents" class="hash-link" aria-label="Direct link to 📚 Table of Contents" title="Direct link to 📚 Table of Contents" translate="no">​</a></h2>
<ol>
<li class=""><a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#1-introduction-to-terraform" class="">Introduction to Terraform</a></li>
<li class=""><a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#2-core-components" class="">Core Components</a></li>
<li class=""><a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#3-terraform-modules" class="">Terraform Modules</a></li>
<li class=""><a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#4-strategy-to-build-a-project" class="">Strategy to Build a Project</a></li>
<li class=""><a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#5-best-practices" class="">Best Practices</a></li>
<li class=""><a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#6-hands-on-examples" class="">Hands-On Examples</a></li>
<li class=""><a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#7-additional-resources" class="">Additional Resources</a></li>
</ol>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-introduction-to-terraform">1. Introduction to Terraform<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#1-introduction-to-terraform" class="hash-link" aria-label="Direct link to 1. Introduction to Terraform" title="Direct link to 1. Introduction to Terraform" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-terraform">What is Terraform?<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#what-is-terraform" class="hash-link" aria-label="Direct link to What is Terraform?" title="Direct link to What is Terraform?" translate="no">​</a></h3>
<p><strong>Terraform</strong> is an <strong>Infrastructure as Code (IaC)</strong> tool created by HashiCorp. It allows you to define and manage your cloud infrastructure using code instead of manually clicking through cloud provider consoles.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-simple-analogy">🎯 Simple Analogy<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#-simple-analogy" class="hash-link" aria-label="Direct link to 🎯 Simple Analogy" title="Direct link to 🎯 Simple Analogy" translate="no">​</a></h3>
<p>Think of Terraform like <strong>LEGO instructions</strong>:</p>
<ul>
<li class=""><strong>Without Terraform</strong>: You manually build your LEGO castle brick by brick, each time slightly different, prone to mistakes.</li>
<li class=""><strong>With Terraform</strong>: You have a blueprint (code) that tells you exactly which pieces to use and where. Anyone can follow the same instructions and build an identical castle every time.</li>
</ul>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-infrastructure-as-code">Why Infrastructure as Code?<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#why-infrastructure-as-code" class="hash-link" aria-label="Direct link to Why Infrastructure as Code?" title="Direct link to Why Infrastructure as Code?" translate="no">​</a></h3>

































<table><thead><tr><th>Traditional Infrastructure</th><th>Infrastructure as Code (Terraform)</th></tr></thead><tbody><tr><td>Manual setup through UI</td><td>Automated through code</td></tr><tr><td>Hard to replicate</td><td>Easy to replicate</td></tr><tr><td>No version history</td><td>Version controlled (Git)</td></tr><tr><td>Error-prone</td><td>Consistent and predictable</td></tr><tr><td>Difficult collaboration</td><td>Easy team collaboration</td></tr><tr><td>No documentation</td><td>Self-documenting</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="key-benefits">Key Benefits<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#key-benefits" class="hash-link" aria-label="Direct link to Key Benefits" title="Direct link to Key Benefits" translate="no">​</a></h3>
<ol>
<li class=""><strong>Automation</strong>: Create hundreds of servers with one command</li>
<li class=""><strong>Consistency</strong>: Same code = Same infrastructure every time</li>
<li class=""><strong>Version Control</strong>: Track changes like you do with application code</li>
<li class=""><strong>Reusability</strong>: Write once, use multiple times</li>
<li class=""><strong>Multi-Cloud</strong>: Works with AWS, Azure, Google Cloud, and 3000+ providers</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-terraform-works---the-restaurant-analogy">How Terraform Works - The Restaurant Analogy<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#how-terraform-works---the-restaurant-analogy" class="hash-link" aria-label="Direct link to How Terraform Works - The Restaurant Analogy" title="Direct link to How Terraform Works - The Restaurant Analogy" translate="no">​</a></h3>
<p>Imagine you're running a restaurant:</p>
<!-- -->
<ul>
<li class=""><strong>Your order (Terraform code)</strong>: Specifies what you want</li>
<li class=""><strong>Chef (Terraform engine)</strong>: Reads your order and coordinates</li>
<li class=""><strong>Kitchen staff (Providers)</strong>: Each specializes in different cuisines (cloud providers)</li>
<li class=""><strong>Recipe book (State file)</strong>: Keeps track of what's been prepared</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-declarative-approach">The Declarative Approach<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#the-declarative-approach" class="hash-link" aria-label="Direct link to The Declarative Approach" title="Direct link to The Declarative Approach" translate="no">​</a></h3>
<p><strong>Imperative (Traditional):</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">1. Create a network</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">2. Wait for network to be ready</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">3. Create a subnet in the network</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">4. Create a server in the subnet</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">5. Install software on server</span><br></div></code></pre></div></div>
<p><strong>Declarative (Terraform):</strong></p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># I want a server with these specs</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">resource "aws_instance" "my_server" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  instance_type = "t2.micro"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  ami           = "ami-12345678"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div>
<p>Terraform figures out the steps automatically!</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-core-components">2. Core Components<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#2-core-components" class="hash-link" aria-label="Direct link to 2. Core Components" title="Direct link to 2. Core Components" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="21-terraform-architecture">2.1 Terraform Architecture<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#21-terraform-architecture" class="hash-link" aria-label="Direct link to 2.1 Terraform Architecture" title="Direct link to 2.1 Terraform Architecture" translate="no">​</a></h3>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="22-core-components-explained">2.2 Core Components Explained<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#22-core-components-explained" class="hash-link" aria-label="Direct link to 2.2 Core Components Explained" title="Direct link to 2.2 Core Components Explained" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-terraform-configuration-files-tf-files">1. <strong>Terraform Configuration Files (.tf files)</strong><a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#1-terraform-configuration-files-tf-files" class="hash-link" aria-label="Direct link to 1-terraform-configuration-files-tf-files" title="Direct link to 1-terraform-configuration-files-tf-files" translate="no">​</a></h4>
<p>These are your "blueprints" written in HCL (HashiCorp Configuration Language).</p>
<p><strong>Analogy</strong>: Think of them as cooking recipes - they describe ingredients (resources) and steps (dependencies).</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Example: Simple configuration structure</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">resource "aws_instance" "web_server" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  ami           = "ami-0c55b159cbfafe1f0"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  instance_type = "t2.micro"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  tags = {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Name = "MyWebServer"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-terraform-cli-command-line-interface">2. <strong>Terraform CLI (Command Line Interface)</strong><a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#2-terraform-cli-command-line-interface" class="hash-link" aria-label="Direct link to 2-terraform-cli-command-line-interface" title="Direct link to 2-terraform-cli-command-line-interface" translate="no">​</a></h4>
<p>The tool you use to execute Terraform commands.</p>
<p><strong>Analogy</strong>: Like a construction foreman who reads the blueprints and directs the workers.</p>
<p><strong>Common Commands:</strong></p>








































<table><thead><tr><th>Command</th><th>What It Does</th><th>When to Use</th></tr></thead><tbody><tr><td><code>terraform init</code></td><td>Downloads providers and sets up backend</td><td>First time in a project</td></tr><tr><td><code>terraform plan</code></td><td>Shows what will change</td><td>Before applying changes</td></tr><tr><td><code>terraform apply</code></td><td>Creates/updates infrastructure</td><td>When ready to deploy</td></tr><tr><td><code>terraform destroy</code></td><td>Deletes all managed infrastructure</td><td>Cleanup or teardown</td></tr><tr><td><code>terraform validate</code></td><td>Checks syntax</td><td>During development</td></tr><tr><td><code>terraform fmt</code></td><td>Formats code nicely</td><td>Before committing code</td></tr></tbody></table>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-providers">3. <strong>Providers</strong><a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#3-providers" class="hash-link" aria-label="Direct link to 3-providers" title="Direct link to 3-providers" translate="no">​</a></h4>
<p>Providers are plugins that allow Terraform to interact with cloud platforms, SaaS, and APIs.</p>
<p><strong>Analogy</strong>: Like different language translators - AWS provider speaks "AWS language", Azure provider speaks "Azure language".</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># AWS Provider</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">provider "aws" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  region = "us-east-1"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Azure Provider</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">provider "azurerm" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  features {}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div>
<p><strong>Popular Providers:</strong></p>



































<table><thead><tr><th>Provider</th><th>Description</th><th>Example Resources</th></tr></thead><tbody><tr><td>aws</td><td>Amazon Web Services</td><td>EC2, S3, RDS, VPC</td></tr><tr><td>azurerm</td><td>Microsoft Azure</td><td>Virtual Machines, Storage, AKS</td></tr><tr><td>google</td><td>Google Cloud Platform</td><td>Compute Engine, GCS, GKE</td></tr><tr><td>kubernetes</td><td>Kubernetes</td><td>Deployments, Services, Ingress</td></tr><tr><td>docker</td><td>Docker</td><td>Containers, Images, Networks</td></tr></tbody></table>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-resources">4. <strong>Resources</strong><a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#4-resources" class="hash-link" aria-label="Direct link to 4-resources" title="Direct link to 4-resources" translate="no">​</a></h4>
<p>Resources are the infrastructure components you want to create.</p>
<p><strong>Analogy</strong>: Resources are like individual LEGO blocks - servers, networks, databases, etc.</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">resource "resource_type" "resource_name" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  # Configuration parameters</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  parameter1 = "value1"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  parameter2 = "value2"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div>
<p><strong>Example:</strong></p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># AWS EC2 Instance</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">resource "aws_instance" "app_server" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  ami           = "ami-0c55b159cbfafe1f0"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  instance_type = "t2.micro"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Azure Virtual Machine</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">resource "azurerm_virtual_machine" "app_vm" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  name                  = "myVM"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  location              = "East US"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  resource_group_name   = "myResourceGroup"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  vm_size              = "Standard_B2s"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-state-file-terraformtfstate">5. <strong>State File (terraform.tfstate)</strong><a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#5-state-file-terraformtfstate" class="hash-link" aria-label="Direct link to 5-state-file-terraformtfstate" title="Direct link to 5-state-file-terraformtfstate" translate="no">​</a></h4>
<p>The state file is Terraform's memory - it keeps track of what infrastructure exists.</p>
<p><strong>Analogy</strong>: Like an inventory list in a warehouse. Terraform checks this list to know what's already been built and what needs to change.</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"version"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"terraform_version"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"1.9.0"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"resources"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"type"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"aws_instance"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"web_server"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"instances"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"attributes"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token property" style="color:#36acaa">"id"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"i-1234567890abcdef0"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token property" style="color:#36acaa">"instance_type"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"t2.micro"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token property" style="color:#36acaa">"public_ip"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"54.123.45.67"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p><strong>⚠️ Important</strong>: Never manually edit the state file! Let Terraform manage it.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-variables">6. <strong>Variables</strong><a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#6-variables" class="hash-link" aria-label="Direct link to 6-variables" title="Direct link to 6-variables" translate="no">​</a></h4>
<p>Variables make your code reusable and flexible.</p>
<p><strong>Analogy</strong>: Like placeholders in a form - you fill them in with different values each time.</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Defining a variable</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">variable "instance_type" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  description = "EC2 instance type"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  type        = string</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  default     = "t2.micro"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Using the variable</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">resource "aws_instance" "web" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  instance_type = var.instance_type</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div>
<p><strong>Variable Types:</strong></p>
<!-- -->
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="7-outputs">7. <strong>Outputs</strong><a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#7-outputs" class="hash-link" aria-label="Direct link to 7-outputs" title="Direct link to 7-outputs" translate="no">​</a></h4>
<p>Outputs display information about your infrastructure after creation.</p>
<p><strong>Analogy</strong>: Like a receipt after shopping - shows you what you got.</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">output "instance_public_ip" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  description = "Public IP of the EC2 instance"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  value       = aws_instance.web.public_ip</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="8-data-sources">8. <strong>Data Sources</strong><a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#8-data-sources" class="hash-link" aria-label="Direct link to 8-data-sources" title="Direct link to 8-data-sources" translate="no">​</a></h4>
<p>Data sources allow you to fetch information about existing resources.</p>
<p><strong>Analogy</strong>: Like looking up information in a phonebook - read-only access to existing data.</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Fetch existing AWS AMI</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">data "aws_ami" "ubuntu" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  most_recent = true</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  owners      = ["099720109477"] # Canonical</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  filter {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    name   = "name"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    values = ["ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-*"]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Use the fetched data</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">resource "aws_instance" "web" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  ami = data.aws_ami.ubuntu.id</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="23-terraform-workflow">2.3 Terraform Workflow<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#23-terraform-workflow" class="hash-link" aria-label="Direct link to 2.3 Terraform Workflow" title="Direct link to 2.3 Terraform Workflow" translate="no">​</a></h3>
<!-- -->
<p><strong>Step-by-Step Workflow:</strong></p>
<ol>
<li class=""><strong>Write</strong>: Create <code>.tf</code> files with your infrastructure requirements</li>
<li class=""><strong>Initialize</strong>: Run <code>terraform init</code> to download providers</li>
<li class=""><strong>Validate</strong>: Run <code>terraform validate</code> to check syntax</li>
<li class=""><strong>Plan</strong>: Run <code>terraform plan</code> to preview changes</li>
<li class=""><strong>Apply</strong>: Run <code>terraform apply</code> to create infrastructure</li>
<li class=""><strong>Modify</strong>: Update code as needed and repeat</li>
<li class=""><strong>Destroy</strong>: Run <code>terraform destroy</code> when done</li>
</ol>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-terraform-modules">3. Terraform Modules<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#3-terraform-modules" class="hash-link" aria-label="Direct link to 3. Terraform Modules" title="Direct link to 3. Terraform Modules" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="31-what-are-modules">3.1 What are Modules?<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#31-what-are-modules" class="hash-link" aria-label="Direct link to 3.1 What are Modules?" title="Direct link to 3.1 What are Modules?" translate="no">​</a></h3>
<p><strong>Modules</strong> are containers for multiple resources that are used together. They're like reusable "packages" of Terraform code.</p>
<p><strong>Analogy</strong>:</p>
<ul>
<li class=""><strong>Without Modules</strong>: Building a house by specifying every nail, plank, and screw individually</li>
<li class=""><strong>With Modules</strong>: Using pre-fabricated walls, doors, and windows that you can install multiple times</li>
</ul>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="32-module-structure">3.2 Module Structure<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#32-module-structure" class="hash-link" aria-label="Direct link to 3.2 Module Structure" title="Direct link to 3.2 Module Structure" translate="no">​</a></h3>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">project/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── main.tf              # Root module - calls other modules</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── variables.tf         # Input variables</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── outputs.tf          # Output values</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── terraform.tfvars    # Variable values</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">└── modules/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    ├── network/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    │   ├── main.tf</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    │   ├── variables.tf</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    │   └── outputs.tf</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    ├── compute/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    │   ├── main.tf</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    │   ├── variables.tf</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    │   └── outputs.tf</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    └── database/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        ├── main.tf</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        ├── variables.tf</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        └── outputs.tf</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="33-creating-a-module---network-example">3.3 Creating a Module - Network Example<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#33-creating-a-module---network-example" class="hash-link" aria-label="Direct link to 3.3 Creating a Module - Network Example" title="Direct link to 3.3 Creating a Module - Network Example" translate="no">​</a></h3>
<p><strong>modules/network/main.tf</strong></p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># This module creates a VPC and subnet</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">resource "aws_vpc" "main" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  cidr_block           = var.vpc_cidr</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  enable_dns_hostnames = true</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  enable_dns_support   = true</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  tags = {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Name        = "${var.environment}-vpc"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Environment = var.environment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">resource "aws_subnet" "public" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  vpc_id                  = aws_vpc.main.id</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  cidr_block              = var.public_subnet_cidr</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  availability_zone       = var.availability_zone</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  map_public_ip_on_launch = true</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  tags = {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Name        = "${var.environment}-public-subnet"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Environment = var.environment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">resource "aws_internet_gateway" "main" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  vpc_id = aws_vpc.main.id</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  tags = {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Name        = "${var.environment}-igw"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Environment = var.environment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div>
<p><strong>modules/network/variables.tf</strong></p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">variable "environment" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  description = "Environment name (dev, staging, prod)"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  type        = string</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">variable "vpc_cidr" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  description = "CIDR block for VPC"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  type        = string</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  default     = "10.0.0.0/16"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">variable "public_subnet_cidr" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  description = "CIDR block for public subnet"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  type        = string</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  default     = "10.0.1.0/24"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">variable "availability_zone" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  description = "AWS availability zone"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  type        = string</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div>
<p><strong>modules/network/outputs.tf</strong></p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">output "vpc_id" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  description = "ID of the VPC"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  value       = aws_vpc.main.id</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">output "public_subnet_id" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  description = "ID of the public subnet"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  value       = aws_subnet.public.id</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">output "vpc_cidr_block" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  description = "CIDR block of the VPC"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  value       = aws_vpc.main.cidr_block</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="34-using-modules">3.4 Using Modules<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#34-using-modules" class="hash-link" aria-label="Direct link to 3.4 Using Modules" title="Direct link to 3.4 Using Modules" translate="no">​</a></h3>
<p><strong>main.tf (Root Module)</strong></p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">terraform {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  required_version = "&gt;= 1.9.0"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  required_providers {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    aws = {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      source  = "hashicorp/aws"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      version = "~&gt; 5.0"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">provider "aws" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  region = var.aws_region</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Use the network module</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">module "network" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  source = "./modules/network"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  environment        = var.environment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  vpc_cidr          = "10.0.0.0/16"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  public_subnet_cidr = "10.0.1.0/24"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  availability_zone  = "${var.aws_region}a"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Use outputs from the module</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">output "vpc_id" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  value = module.network.vpc_id</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="35-module-sources">3.5 Module Sources<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#35-module-sources" class="hash-link" aria-label="Direct link to 3.5 Module Sources" title="Direct link to 3.5 Module Sources" translate="no">​</a></h3>
<p>You can load modules from different sources:</p>






























<table><thead><tr><th>Source Type</th><th>Example</th><th>Use Case</th></tr></thead><tbody><tr><td>Local Path</td><td><code>./modules/network</code></td><td>Custom modules in your project</td></tr><tr><td>Terraform Registry</td><td><code>terraform-aws-modules/vpc/aws</code></td><td>Public, community modules</td></tr><tr><td>Git Repository</td><td><code>git::https://github.com/user/repo.git</code></td><td>Private/shared team modules</td></tr><tr><td>HTTP URL</td><td><code>https://example.com/module.zip</code></td><td>Hosted modules</td></tr></tbody></table>
<p><strong>Example using Terraform Registry:</strong></p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">module "vpc" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  source  = "terraform-aws-modules/vpc/aws"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  version = "5.0.0"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  name = "my-vpc"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  cidr = "10.0.0.0/16"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  azs             = ["us-east-1a", "us-east-1b"]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  private_subnets = ["10.0.1.0/24", "10.0.2.0/24"]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  public_subnets  = ["10.0.101.0/24", "10.0.102.0/24"]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  enable_nat_gateway = true</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  enable_vpn_gateway = true</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  tags = {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Environment = "dev"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="36-module-benefits">3.6 Module Benefits<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#36-module-benefits" class="hash-link" aria-label="Direct link to 3.6 Module Benefits" title="Direct link to 3.6 Module Benefits" translate="no">​</a></h3>
<!-- -->
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-strategy-to-build-a-project">4. Strategy to Build a Project<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#4-strategy-to-build-a-project" class="hash-link" aria-label="Direct link to 4. Strategy to Build a Project" title="Direct link to 4. Strategy to Build a Project" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="41-project-planning-phase">4.1 Project Planning Phase<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#41-project-planning-phase" class="hash-link" aria-label="Direct link to 4.1 Project Planning Phase" title="Direct link to 4.1 Project Planning Phase" translate="no">​</a></h3>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="42-project-structure-strategy">4.2 Project Structure Strategy<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#42-project-structure-strategy" class="hash-link" aria-label="Direct link to 4.2 Project Structure Strategy" title="Direct link to 4.2 Project Structure Strategy" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="small-project-monolithic">Small Project (Monolithic)<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#small-project-monolithic" class="hash-link" aria-label="Direct link to Small Project (Monolithic)" title="Direct link to Small Project (Monolithic)" translate="no">​</a></h4>
<p>For simple projects with few resources:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">simple-project/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── main.tf           # All resources</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── variables.tf      # All variables</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── outputs.tf        # All outputs</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── terraform.tfvars  # Variable values</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">└── README.md         # Documentation</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="medium-project-organized">Medium Project (Organized)<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#medium-project-organized" class="hash-link" aria-label="Direct link to Medium Project (Organized)" title="Direct link to Medium Project (Organized)" translate="no">​</a></h4>
<p>For projects with multiple environments:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">medium-project/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── environments/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   ├── dev/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   │   ├── main.tf</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   │   ├── variables.tf</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   │   ├── terraform.tfvars</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   │   └── backend.tf</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   ├── staging/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   │   └── ...</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   └── prod/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│       └── ...</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── modules/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   ├── network/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   ├── compute/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   └── database/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">└── README.md</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="large-project-enterprise">Large Project (Enterprise)<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#large-project-enterprise" class="hash-link" aria-label="Direct link to Large Project (Enterprise)" title="Direct link to Large Project (Enterprise)" translate="no">​</a></h4>
<p>For complex, multi-team projects:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">enterprise-project/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── infrastructure/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   ├── global/              # Shared resources (IAM, DNS)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   │   ├── main.tf</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   │   └── ...</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   └── regional/            # Region-specific resources</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│       ├── us-east-1/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│       └── eu-west-1/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── modules/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   ├── networking/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   │   ├── vpc/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   │   ├── subnets/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   │   └── security-groups/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   ├── compute/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   │   ├── ec2/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   │   ├── asg/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   │   └── alb/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   ├── data/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   │   ├── rds/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   │   ├── s3/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   │   └── dynamodb/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   └── security/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│       ├── iam/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│       └── kms/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── environments/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   ├── dev/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   ├── staging/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   └── prod/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── scripts/             # Helper scripts</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── policies/            # Sentinel/OPA policies</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── docs/               # Documentation</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── .github/            # CI/CD workflows</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   └── workflows/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">└── README.md</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="43-environment-strategy">4.3 Environment Strategy<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#43-environment-strategy" class="hash-link" aria-label="Direct link to 4.3 Environment Strategy" title="Direct link to 4.3 Environment Strategy" translate="no">​</a></h3>
<!-- -->
<p><strong>Example: Environment-Specific Variables</strong></p>
<p><strong>environments/dev/terraform.tfvars</strong></p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">environment     = "dev"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">instance_type   = "t2.micro"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">instance_count  = 1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">enable_backups  = false</span><br></div></code></pre></div></div>
<p><strong>environments/prod/terraform.tfvars</strong></p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">environment     = "prod"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">instance_type   = "t3.large"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">instance_count  = 3</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">enable_backups  = true</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">multi_az        = true</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="44-state-management-strategy">4.4 State Management Strategy<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#44-state-management-strategy" class="hash-link" aria-label="Direct link to 4.4 State Management Strategy" title="Direct link to 4.4 State Management Strategy" translate="no">​</a></h3>
<!-- -->
<p><strong>Example: Remote State with S3</strong></p>
<p><strong>backend.tf</strong></p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">terraform {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  backend "s3" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    bucket         = "my-terraform-state-bucket"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    key            = "prod/terraform.tfstate"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    region         = "us-east-1"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    encrypt        = true</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    dynamodb_table = "terraform-state-lock"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="45-naming-conventions">4.5 Naming Conventions<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#45-naming-conventions" class="hash-link" aria-label="Direct link to 4.5 Naming Conventions" title="Direct link to 4.5 Naming Conventions" translate="no">​</a></h3>
<p>Consistent naming is crucial for maintainability:</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Resource naming pattern: [environment]-[app]-[resource-type]-[descriptor]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">resource "aws_instance" "web" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  tags = {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Name = "${var.environment}-webapp-server-01"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    # dev-webapp-server-01</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    # prod-webapp-server-01</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">resource "aws_s3_bucket" "logs" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  bucket = "${var.environment}-${var.app_name}-logs-${var.aws_region}"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  # dev-myapp-logs-us-east-1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="46-step-by-step-project-implementation">4.6 Step-by-Step Project Implementation<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#46-step-by-step-project-implementation" class="hash-link" aria-label="Direct link to 4.6 Step-by-Step Project Implementation" title="Direct link to 4.6 Step-by-Step Project Implementation" translate="no">​</a></h3>
<p><strong>Phase 1: Foundation</strong></p>
<!-- -->
<p><strong>Phase 2: Development</strong></p>
<!-- -->
<p><strong>Phase 3: Deployment</strong></p>
<!-- -->
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-best-practices">5. Best Practices<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#5-best-practices" class="hash-link" aria-label="Direct link to 5. Best Practices" title="Direct link to 5. Best Practices" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="51-code-organization">5.1 Code Organization<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#51-code-organization" class="hash-link" aria-label="Direct link to 5.1 Code Organization" title="Direct link to 5.1 Code Organization" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="-do">✅ DO<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#-do" class="hash-link" aria-label="Direct link to ✅ DO" title="Direct link to ✅ DO" translate="no">​</a></h4>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Good: Descriptive resource names</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">resource "aws_instance" "web_server" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  ami           = data.aws_ami.ubuntu.id</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  instance_type = var.instance_type</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  tags = {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Name        = "${var.environment}-web-server"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Environment = var.environment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    ManagedBy   = "Terraform"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Good: Use variables for reusability</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">variable "instance_type" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  description = "EC2 instance type for web servers"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  type        = string</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  default     = "t2.micro"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  validation {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    condition     = contains(["t2.micro", "t2.small", "t2.medium"], var.instance_type)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    error_message = "Instance type must be t2.micro, t2.small, or t2.medium."</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="-dont">❌ DON'T<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#-dont" class="hash-link" aria-label="Direct link to ❌ DON'T" title="Direct link to ❌ DON'T" translate="no">​</a></h4>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Bad: Hardcoded values</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">resource "aws_instance" "x" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  ami           = "ami-12345678"  # Don't hardcode AMI IDs</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  instance_type = "t2.micro"     # Don't hardcode instance types</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  tags = {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Name = "server1"  # Not descriptive</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Bad: No validation</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">variable "instance_type" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  type = string</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="52-state-management-best-practices">5.2 State Management Best Practices<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#52-state-management-best-practices" class="hash-link" aria-label="Direct link to 5.2 State Management Best Practices" title="Direct link to 5.2 State Management Best Practices" translate="no">​</a></h3>
<!-- -->
<p><strong>Example: Complete Backend Configuration</strong></p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">terraform {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  required_version = "&gt;= 1.9.0"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  backend "s3" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    bucket         = "company-terraform-states"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    key            = "prod/webapp/terraform.tfstate"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    region         = "us-east-1"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    encrypt        = true</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    kms_key_id     = "arn:aws:kms:us-east-1:123456789:key/xxx"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    dynamodb_table = "terraform-state-lock"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    # Additional security</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    acl            = "private"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    # Enable versioning on S3 bucket</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    versioning     = true</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="53-security-best-practices">5.3 Security Best Practices<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#53-security-best-practices" class="hash-link" aria-label="Direct link to 5.3 Security Best Practices" title="Direct link to 5.3 Security Best Practices" translate="no">​</a></h3>



































<table><thead><tr><th>Practice</th><th>Why</th><th>How</th></tr></thead><tbody><tr><td>Never commit secrets</td><td>Prevents exposure</td><td>Use environment variables, AWS Secrets Manager</td></tr><tr><td>Use least privilege IAM</td><td>Minimizes risk</td><td>Create specific IAM roles per resource</td></tr><tr><td>Encrypt everything</td><td>Protects data</td><td>Enable encryption for state, databases, storage</td></tr><tr><td>Scan for vulnerabilities</td><td>Catch issues early</td><td>Use tools like tfsec, checkov, terrascan</td></tr><tr><td>Use private modules</td><td>Control access</td><td>Host modules in private registries</td></tr></tbody></table>
<p><strong>Example: Using Secrets Securely</strong></p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># ❌ BAD: Never do this!</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">resource "aws_db_instance" "bad_example" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  username = "admin"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  password = "SuperSecret123!"  # Never hardcode passwords!</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># ✅ GOOD: Use AWS Secrets Manager</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">data "aws_secretsmanager_secret_version" "db_password" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  secret_id = "prod/database/password"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">resource "aws_db_instance" "good_example" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  username = "admin"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  password = data.aws_secretsmanager_secret_version.db_password.secret_string</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="54-resource-tagging-strategy">5.4 Resource Tagging Strategy<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#54-resource-tagging-strategy" class="hash-link" aria-label="Direct link to 5.4 Resource Tagging Strategy" title="Direct link to 5.4 Resource Tagging Strategy" translate="no">​</a></h3>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Create a local map of common tags</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">locals {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  common_tags = {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Environment = var.environment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Project     = var.project_name</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    ManagedBy   = "Terraform"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Owner       = var.owner_email</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    CostCenter  = var.cost_center</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    CreatedDate = formatdate("YYYY-MM-DD", timestamp())</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Apply to resources</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">resource "aws_instance" "web" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  # ... other configuration ...</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  tags = merge(</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    local.common_tags,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      Name = "${var.environment}-web-server"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      Role = "WebServer"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  )</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="55-version-control-best-practices">5.5 Version Control Best Practices<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#55-version-control-best-practices" class="hash-link" aria-label="Direct link to 5.5 Version Control Best Practices" title="Direct link to 5.5 Version Control Best Practices" translate="no">​</a></h3>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># .gitignore for Terraform projects</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Local .terraform directories</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">**/.terraform/*</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># .tfstate files</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">*.tfstate</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">*.tfstate.*</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Crash log files</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">crash.log</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">crash.*.log</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Exclude all .tfvars files, which might contain sensitive data</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">*.tfvars</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">*.tfvars.json</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Ignore override files</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">override.tf</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">override.tf.json</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">*_override.tf</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">*_override.tf.json</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Ignore CLI configuration files</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">.terraformrc</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">terraform.rc</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Ignore plan files</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">*.tfplan</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="56-code-quality-checks">5.6 Code Quality Checks<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#56-code-quality-checks" class="hash-link" aria-label="Direct link to 5.6 Code Quality Checks" title="Direct link to 5.6 Code Quality Checks" translate="no">​</a></h3>
<!-- -->
<p><strong>Commands:</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Format code</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">terraform fmt -recursive</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Validate syntax</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">terraform validate</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Security scan with tfsec</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">tfsec .</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Policy scan with checkov</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">checkov -d .</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Generate plan</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">terraform plan -out=tfplan</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="57-documentation-best-practices">5.7 Documentation Best Practices<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#57-documentation-best-practices" class="hash-link" aria-label="Direct link to 5.7 Documentation Best Practices" title="Direct link to 5.7 Documentation Best Practices" translate="no">​</a></h3>
<p><strong>Every module should have:</strong></p>
<ol>
<li class=""><strong>README.md</strong> with:
<ul>
<li class="">Purpose and description</li>
<li class="">Requirements</li>
<li class="">Usage examples</li>
<li class="">Input variables table</li>
<li class="">Output values table</li>
</ul>
</li>
</ol>
<p><strong>Example README.md:</strong></p>
<div class="language-markdown codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-markdown codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token title important punctuation" style="color:#393A34">#</span><span class="token title important"> Network Module</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Creates a VPC with public and private subnets.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">##</span><span class="token title important"> Requirements</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Terraform &gt;= 1.9.0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> AWS Provider &gt;= 5.0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">##</span><span class="token title important"> Usage</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">```hcl</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">module "network" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  source = "./modules/network"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  environment = "prod"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  vpc_cidr    = "10.0.0.0/16"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="inputs">Inputs<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#inputs" class="hash-link" aria-label="Direct link to Inputs" title="Direct link to Inputs" translate="no">​</a></h2>


























<table><thead><tr><th>Name</th><th>Description</th><th>Type</th><th>Default</th><th>Required</th></tr></thead><tbody><tr><td>environment</td><td>Environment name</td><td>string</td><td>-</td><td>yes</td></tr><tr><td>vpc_cidr</td><td>VPC CIDR block</td><td>string</td><td>"10.0.0.0/16"</td><td>no</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="outputs">Outputs<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#outputs" class="hash-link" aria-label="Direct link to Outputs" title="Direct link to Outputs" translate="no">​</a></h2>

















<table><thead><tr><th>Name</th><th>Description</th></tr></thead><tbody><tr><td>vpc_id</td><td>ID of the VPC</td></tr><tr><td>subnet_ids</td><td>List of subnet IDs</td></tr></tbody></table>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">### 5.8 Testing Strategy</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">```mermaid</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">graph TD</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    A[Testing Levels] --&gt; B[Unit Tests]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    A --&gt; C[Integration Tests]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    A --&gt; D[End-to-End Tests]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    B --&gt; B1[terraform validate]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    B --&gt; B2[terraform plan]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    B --&gt; B3[Static Analysis]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    C --&gt; C1[Deploy to Test Env]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    C --&gt; C2[Verify Resources]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    C --&gt; C3[Connectivity Tests]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    D --&gt; D1[Full Application Stack]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    D --&gt; D2[User Acceptance Tests]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    D --&gt; D3[Performance Tests]</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="59-dependency-management">5.9 Dependency Management<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#59-dependency-management" class="hash-link" aria-label="Direct link to 5.9 Dependency Management" title="Direct link to 5.9 Dependency Management" translate="no">​</a></h3>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Use depends_on sparingly - Terraform usually handles dependencies automatically</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Explicit dependency (when needed)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">resource "aws_instance" "web" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  ami           = data.aws_ami.ubuntu.id</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  instance_type = "t2.micro"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  subnet_id     = aws_subnet.public.id  # Implicit dependency - Preferred!</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Use depends_on only for non-obvious dependencies</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">resource "aws_iam_role_policy" "example" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  # ... configuration ...</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  depends_on = [aws_iam_role.example]  # When Terraform can't detect automatically</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="510-performance-optimization">5.10 Performance Optimization<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#510-performance-optimization" class="hash-link" aria-label="Direct link to 5.10 Performance Optimization" title="Direct link to 5.10 Performance Optimization" translate="no">​</a></h3>



































<table><thead><tr><th>Technique</th><th>Description</th><th>When to Use</th></tr></thead><tbody><tr><td><code>-parallelism=n</code></td><td>Run operations in parallel</td><td>Large infrastructures</td></tr><tr><td><code>-target=resource</code></td><td>Apply to specific resources</td><td>Debugging or partial updates</td></tr><tr><td><code>-refresh=false</code></td><td>Skip state refresh</td><td>When state is known to be current</td></tr><tr><td>Workspaces</td><td>Separate environments</td><td>Multiple environments in same config</td></tr><tr><td>Remote State Data Source</td><td>Reference other state files</td><td>Sharing data between projects</td></tr></tbody></table>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Speed up large deployments</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">terraform apply -parallelism=20</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Target specific resource</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">terraform apply -target=aws_instance.web</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Skip refresh</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">terraform plan -refresh=false</span><br></div></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-hands-on-examples">6. Hands-On Examples<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#6-hands-on-examples" class="hash-link" aria-label="Direct link to 6. Hands-On Examples" title="Direct link to 6. Hands-On Examples" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="61-example-1-simple-aws-web-server">6.1 Example 1: Simple AWS Web Server<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#61-example-1-simple-aws-web-server" class="hash-link" aria-label="Direct link to 6.1 Example 1: Simple AWS Web Server" title="Direct link to 6.1 Example 1: Simple AWS Web Server" translate="no">​</a></h3>
<p>This example creates a complete AWS infrastructure with a web server.</p>
<p><strong>Step 1: Create Project Structure</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">mkdir terraform-aws-webserver</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">cd terraform-aws-webserver</span><br></div></code></pre></div></div>
<p><strong>main.tf</strong></p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">terraform {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  required_version = "&gt;= 1.9.0"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  required_providers {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    aws = {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      source  = "hashicorp/aws"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      version = "~&gt; 5.0"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">provider "aws" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  region = var.aws_region</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Get latest Ubuntu AMI</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">data "aws_ami" "ubuntu" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  most_recent = true</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  owners      = ["099720109477"] # Canonical</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  filter {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    name   = "name"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    values = ["ubuntu/images/hvm-ssd/ubuntu-jammy-22.04-amd64-server-*"]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  filter {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    name   = "virtualization-type"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    values = ["hvm"]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Create VPC</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">resource "aws_vpc" "main" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  cidr_block           = var.vpc_cidr</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  enable_dns_hostnames = true</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  enable_dns_support   = true</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  tags = {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Name = "${var.project_name}-vpc"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Create Internet Gateway</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">resource "aws_internet_gateway" "main" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  vpc_id = aws_vpc.main.id</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  tags = {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Name = "${var.project_name}-igw"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Create Public Subnet</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">resource "aws_subnet" "public" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  vpc_id                  = aws_vpc.main.id</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  cidr_block              = var.public_subnet_cidr</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  availability_zone       = data.aws_availability_zones.available.names[0]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  map_public_ip_on_launch = true</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  tags = {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Name = "${var.project_name}-public-subnet"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Get available AZs</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">data "aws_availability_zones" "available" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  state = "available"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Create Route Table</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">resource "aws_route_table" "public" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  vpc_id = aws_vpc.main.id</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  route {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    cidr_block = "0.0.0.0/0"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    gateway_id = aws_internet_gateway.main.id</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  tags = {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Name = "${var.project_name}-public-rt"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Associate Route Table with Subnet</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">resource "aws_route_table_association" "public" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  subnet_id      = aws_subnet.public.id</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  route_table_id = aws_route_table.public.id</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Create Security Group</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">resource "aws_security_group" "web" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  name        = "${var.project_name}-web-sg"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  description = "Security group for web server"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  vpc_id      = aws_vpc.main.id</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  ingress {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    description = "HTTP from anywhere"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    from_port   = 80</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    to_port     = 80</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    protocol    = "tcp"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    cidr_blocks = ["0.0.0.0/0"]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  ingress {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    description = "HTTPS from anywhere"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    from_port   = 443</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    to_port     = 443</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    protocol    = "tcp"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    cidr_blocks = ["0.0.0.0/0"]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  ingress {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    description = "SSH from anywhere (restrict this in production!)"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    from_port   = 22</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    to_port     = 22</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    protocol    = "tcp"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    cidr_blocks = ["0.0.0.0/0"]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  egress {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    description = "Allow all outbound traffic"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    from_port   = 0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    to_port     = 0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    protocol    = "-1"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    cidr_blocks = ["0.0.0.0/0"]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  tags = {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Name = "${var.project_name}-web-sg"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Create EC2 Instance</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">resource "aws_instance" "web" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  ami                    = data.aws_ami.ubuntu.id</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  instance_type          = var.instance_type</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  subnet_id              = aws_subnet.public.id</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  vpc_security_group_ids = [aws_security_group.web.id]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  user_data = &lt;&lt;-EOF</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              #!/bin/bash</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              apt-get update</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              apt-get install -y nginx</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              echo "&lt;h1&gt;Hello from Terraform!&lt;/h1&gt;" &gt; /var/www/html/index.html</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              systemctl start nginx</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              systemctl enable nginx</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              EOF</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  tags = {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Name = "${var.project_name}-web-server"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div>
<p><strong>variables.tf</strong></p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">variable "aws_region" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  description = "AWS region to deploy resources"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  type        = string</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  default     = "us-east-1"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">variable "project_name" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  description = "Project name for resource naming"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  type        = string</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  default     = "terraform-demo"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">variable "vpc_cidr" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  description = "CIDR block for VPC"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  type        = string</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  default     = "10.0.0.0/16"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">variable "public_subnet_cidr" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  description = "CIDR block for public subnet"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  type        = string</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  default     = "10.0.1.0/24"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">variable "instance_type" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  description = "EC2 instance type"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  type        = string</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  default     = "t2.micro"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div>
<p><strong>outputs.tf</strong></p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">output "vpc_id" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  description = "ID of the VPC"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  value       = aws_vpc.main.id</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">output "web_server_public_ip" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  description = "Public IP address of web server"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  value       = aws_instance.web.public_ip</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">output "web_server_url" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  description = "URL to access the web server"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  value       = "http://${aws_instance.web.public_ip}"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">output "instance_id" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  description = "ID of the EC2 instance"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  value       = aws_instance.web.id</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div>
<p><strong>terraform.tfvars</strong> (optional - for custom values)</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">aws_region     = "us-east-1"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">project_name   = "my-web-app"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">instance_type  = "t2.micro"</span><br></div></code></pre></div></div>
<p><strong>Commands to Run:</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Initialize Terraform</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">terraform init</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Format code</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">terraform fmt</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Validate configuration</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">terraform validate</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Preview changes</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">terraform plan</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Apply changes (creates infrastructure)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">terraform apply</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Access your web server (use the output URL)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># http://&lt;public_ip&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Destroy infrastructure when done</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">terraform destroy</span><br></div></code></pre></div></div>
<p><strong>Architecture Diagram:</strong></p>
<!-- -->
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="62-example-2-azure-web-application">6.2 Example 2: Azure Web Application<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#62-example-2-azure-web-application" class="hash-link" aria-label="Direct link to 6.2 Example 2: Azure Web Application" title="Direct link to 6.2 Example 2: Azure Web Application" translate="no">​</a></h3>
<p>This example creates a complete Azure infrastructure with a web application.</p>
<p><strong>main.tf</strong></p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">terraform {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  required_version = "&gt;= 1.9.0"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  required_providers {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    azurerm = {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      source  = "hashicorp/azurerm"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      version = "~&gt; 3.0"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">provider "azurerm" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  features {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    resource_group {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      prevent_deletion_if_contains_resources = false</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Create Resource Group</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">resource "azurerm_resource_group" "main" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  name     = "${var.project_name}-rg"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  location = var.location</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  tags = {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Environment = var.environment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Project     = var.project_name</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Create Virtual Network</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">resource "azurerm_virtual_network" "main" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  name                = "${var.project_name}-vnet"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  address_space       = ["10.0.0.0/16"]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  location            = azurerm_resource_group.main.location</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  resource_group_name = azurerm_resource_group.main.name</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  tags = {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Environment = var.environment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Create Subnet</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">resource "azurerm_subnet" "web" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  name                 = "${var.project_name}-subnet"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  resource_group_name  = azurerm_resource_group.main.name</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  virtual_network_name = azurerm_virtual_network.main.name</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  address_prefixes     = ["10.0.1.0/24"]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Create Public IP</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">resource "azurerm_public_ip" "web" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  name                = "${var.project_name}-public-ip"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  location            = azurerm_resource_group.main.location</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  resource_group_name = azurerm_resource_group.main.name</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  allocation_method   = "Static"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  sku                 = "Standard"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  tags = {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Environment = var.environment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Create Network Security Group</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">resource "azurerm_network_security_group" "web" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  name                = "${var.project_name}-nsg"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  location            = azurerm_resource_group.main.location</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  resource_group_name = azurerm_resource_group.main.name</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  security_rule {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    name                       = "AllowHTTP"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    priority                   = 100</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    direction                  = "Inbound"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    access                     = "Allow"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    protocol                   = "Tcp"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    source_port_range          = "*"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    destination_port_range     = "80"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    source_address_prefix      = "*"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    destination_address_prefix = "*"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  security_rule {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    name                       = "AllowHTTPS"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    priority                   = 110</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    direction                  = "Inbound"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    access                     = "Allow"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    protocol                   = "Tcp"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    source_port_range          = "*"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    destination_port_range     = "443"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    source_address_prefix      = "*"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    destination_address_prefix = "*"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  security_rule {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    name                       = "AllowSSH"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    priority                   = 120</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    direction                  = "Inbound"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    access                     = "Allow"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    protocol                   = "Tcp"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    source_port_range          = "*"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    destination_port_range     = "22"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    source_address_prefix      = "*"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    destination_address_prefix = "*"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  tags = {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Environment = var.environment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Create Network Interface</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">resource "azurerm_network_interface" "web" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  name                = "${var.project_name}-nic"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  location            = azurerm_resource_group.main.location</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  resource_group_name = azurerm_resource_group.main.name</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  ip_configuration {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    name                          = "internal"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    subnet_id                     = azurerm_subnet.web.id</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    private_ip_address_allocation = "Dynamic"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    public_ip_address_id          = azurerm_public_ip.web.id</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  tags = {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Environment = var.environment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Associate NSG with Network Interface</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">resource "azurerm_network_interface_security_group_association" "web" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  network_interface_id      = azurerm_network_interface.web.id</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  network_security_group_id = azurerm_network_security_group.web.id</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Create Virtual Machine</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">resource "azurerm_linux_virtual_machine" "web" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  name                = "${var.project_name}-vm"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  location            = azurerm_resource_group.main.location</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  resource_group_name = azurerm_resource_group.main.name</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  size                = var.vm_size</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  admin_username      = var.admin_username</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  network_interface_ids = [</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    azurerm_network_interface.web.id,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  ]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  admin_ssh_key {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    username   = var.admin_username</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    public_key = file("~/.ssh/id_rsa.pub")  # Update this path</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  os_disk {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    caching              = "ReadWrite"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    storage_account_type = "Standard_LRS"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  source_image_reference {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    publisher = "Canonical"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    offer     = "0001-com-ubuntu-server-jammy"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    sku       = "22_04-lts-gen2"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    version   = "latest"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  custom_data = base64encode(&lt;&lt;-EOF</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              #!/bin/bash</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              apt-get update</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              apt-get install -y nginx</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              echo "&lt;h1&gt;Hello from Azure with Terraform!&lt;/h1&gt;" &gt; /var/www/html/index.html</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              systemctl start nginx</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              systemctl enable nginx</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              EOF</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  )</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  tags = {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Environment = var.environment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div>
<p><strong>variables.tf</strong></p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">variable "project_name" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  description = "Project name for resource naming"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  type        = string</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  default     = "terraform-azure-demo"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">variable "location" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  description = "Azure region"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  type        = string</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  default     = "East US"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">variable "environment" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  description = "Environment name"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  type        = string</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  default     = "dev"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">variable "vm_size" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  description = "Size of the VM"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  type        = string</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  default     = "Standard_B1s"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">variable "admin_username" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  description = "Admin username for VM"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  type        = string</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  default     = "azureuser"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div>
<p><strong>outputs.tf</strong></p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">output "resource_group_name" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  description = "Name of the resource group"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  value       = azurerm_resource_group.main.name</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">output "public_ip_address" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  description = "Public IP address of the VM"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  value       = azurerm_public_ip.web.ip_address</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">output "vm_url" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  description = "URL to access the web server"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  value       = "http://${azurerm_public_ip.web.ip_address}"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">output "vm_name" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  description = "Name of the virtual machine"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  value       = azurerm_linux_virtual_machine.web.name</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">output "ssh_command" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  description = "SSH command to connect to VM"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  value       = "ssh ${var.admin_username}@${azurerm_public_ip.web.ip_address}"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div>
<p><strong>Commands to Run:</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Login to Azure</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">az login</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Initialize Terraform</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">terraform init</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Format and validate</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">terraform fmt</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">terraform validate</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Preview changes</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">terraform plan</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Apply changes</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">terraform apply</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Access your web server (use output URL)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># http://&lt;public_ip&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Connect via SSH</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># ssh azureuser@&lt;public_ip&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Destroy infrastructure</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">terraform destroy</span><br></div></code></pre></div></div>
<p><strong>Architecture Diagram:</strong></p>
<!-- -->
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="63-example-3-multi-environment-setup-with-modules">6.3 Example 3: Multi-Environment Setup with Modules<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#63-example-3-multi-environment-setup-with-modules" class="hash-link" aria-label="Direct link to 6.3 Example 3: Multi-Environment Setup with Modules" title="Direct link to 6.3 Example 3: Multi-Environment Setup with Modules" translate="no">​</a></h3>
<p>This example shows how to structure a project for multiple environments using modules.</p>
<p><strong>Project Structure:</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">multi-env-project/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── main.tf</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── variables.tf</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── outputs.tf</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── terraform.tfvars</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── modules/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   └── web-server/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│       ├── main.tf</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│       ├── variables.tf</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│       └── outputs.tf</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">└── environments/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    ├── dev/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    │   ├── main.tf</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    │   └── terraform.tfvars</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    ├── staging/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    │   ├── main.tf</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    │   └── terraform.tfvars</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    └── prod/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        ├── main.tf</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        └── terraform.tfvars</span><br></div></code></pre></div></div>
<p><strong>modules/web-server/main.tf</strong></p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Reusable web server module</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">data "aws_ami" "ubuntu" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  most_recent = true</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  owners      = ["099720109477"]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  filter {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    name   = "name"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    values = ["ubuntu/images/hvm-ssd/ubuntu-jammy-22.04-amd64-server-*"]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">resource "aws_instance" "web" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  ami                    = data.aws_ami.ubuntu.id</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  instance_type          = var.instance_type</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  subnet_id              = var.subnet_id</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  vpc_security_group_ids = [aws_security_group.web.id]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  user_data = &lt;&lt;-EOF</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              #!/bin/bash</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              apt-get update</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              apt-get install -y nginx</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              echo "&lt;h1&gt;${var.environment} Environment - Hello from Terraform!&lt;/h1&gt;" &gt; /var/www/html/index.html</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              systemctl start nginx</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              systemctl enable nginx</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              EOF</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  tags = merge(</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    var.tags,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      Name = "${var.environment}-web-server"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  )</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">resource "aws_security_group" "web" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  name        = "${var.environment}-web-sg"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  description = "Security group for ${var.environment} web server"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  vpc_id      = var.vpc_id</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  ingress {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    from_port   = 80</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    to_port     = 80</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    protocol    = "tcp"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    cidr_blocks = ["0.0.0.0/0"]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  ingress {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    from_port   = 443</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    to_port     = 443</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    protocol    = "tcp"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    cidr_blocks = ["0.0.0.0/0"]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  ingress {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    from_port   = 22</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    to_port     = 22</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    protocol    = "tcp"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    cidr_blocks = var.ssh_cidr_blocks</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  egress {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    from_port   = 0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    to_port     = 0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    protocol    = "-1"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    cidr_blocks = ["0.0.0.0/0"]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  tags = merge(</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    var.tags,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      Name = "${var.environment}-web-sg"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  )</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div>
<p><strong>modules/web-server/variables.tf</strong></p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">variable "environment" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  description = "Environment name"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  type        = string</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">variable "instance_type" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  description = "EC2 instance type"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  type        = string</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">variable "vpc_id" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  description = "VPC ID"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  type        = string</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">variable "subnet_id" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  description = "Subnet ID"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  type        = string</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">variable "ssh_cidr_blocks" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  description = "CIDR blocks allowed for SSH"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  type        = list(string)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  default     = ["0.0.0.0/0"]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">variable "tags" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  description = "Tags to apply to resources"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  type        = map(string)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  default     = {}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div>
<p><strong>modules/web-server/outputs.tf</strong></p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">output "instance_id" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  description = "ID of the EC2 instance"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  value       = aws_instance.web.id</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">output "public_ip" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  description = "Public IP of the instance"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  value       = aws_instance.web.public_ip</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">output "security_group_id" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  description = "ID of the security group"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  value       = aws_security_group.web.id</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div>
<p><strong>environments/dev/main.tf</strong></p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">terraform {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  required_version = "&gt;= 1.9.0"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  required_providers {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    aws = {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      source  = "hashicorp/aws"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      version = "~&gt; 5.0"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  backend "s3" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    bucket         = "my-terraform-states"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    key            = "dev/terraform.tfstate"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    region         = "us-east-1"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    encrypt        = true</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    dynamodb_table = "terraform-state-lock"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">provider "aws" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  region = "us-east-1"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Use existing VPC (or create one)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">data "aws_vpc" "selected" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  default = true</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">data "aws_subnets" "public" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  filter {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    name   = "vpc-id"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    values = [data.aws_vpc.selected.id]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">module "web_server" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  source = "../../modules/web-server"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  environment       = "dev"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  instance_type     = "t2.micro"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  vpc_id            = data.aws_vpc.selected.id</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  subnet_id         = data.aws_subnets.public.ids[0]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  ssh_cidr_blocks   = ["0.0.0.0/0"]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  tags = {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Environment = "dev"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    ManagedBy   = "Terraform"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Team        = "DevOps"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">output "dev_server_ip" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  value = module.web_server.public_ip</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div>
<p><strong>environments/dev/terraform.tfvars</strong></p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Development environment specific values</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># (All configuration is in main.tf for this simple example)</span><br></div></code></pre></div></div>
<p><strong>environments/prod/main.tf</strong></p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">terraform {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  required_version = "&gt;= 1.9.0"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  required_providers {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    aws = {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      source  = "hashicorp/aws"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      version = "~&gt; 5.0"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  backend "s3" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    bucket         = "my-terraform-states"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    key            = "prod/terraform.tfstate"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    region         = "us-east-1"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    encrypt        = true</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    dynamodb_table = "terraform-state-lock"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">provider "aws" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  region = "us-east-1"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">data "aws_vpc" "selected" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  default = true</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">data "aws_subnets" "public" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  filter {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    name   = "vpc-id"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    values = [data.aws_vpc.selected.id]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">module "web_server" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  source = "../../modules/web-server"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  environment     = "prod"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  instance_type   = "t3.medium"  # Larger instance for production</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  vpc_id          = data.aws_vpc.selected.id</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  subnet_id       = data.aws_subnets.public.ids[0]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  ssh_cidr_blocks = ["10.0.0.0/8"]  # Restricted SSH access</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  tags = {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Environment = "prod"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    ManagedBy   = "Terraform"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Team        = "DevOps"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Critical    = "true"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">output "prod_server_ip" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  value = module.web_server.public_ip</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div>
<p><strong>Usage:</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Deploy to development</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">cd environments/dev</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">terraform init</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">terraform plan</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">terraform apply</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Deploy to production</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">cd ../prod</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">terraform init</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">terraform plan</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">terraform apply</span><br></div></code></pre></div></div>
<p><strong>Comparison Table:</strong></p>



































<table><thead><tr><th>Aspect</th><th>Development</th><th>Production</th></tr></thead><tbody><tr><td>Instance Type</td><td>t2.micro</td><td>t3.medium</td></tr><tr><td>SSH Access</td><td>Open (0.0.0.0/0)</td><td>Restricted (10.0.0.0/8)</td></tr><tr><td>State File</td><td>dev/terraform.tfstate</td><td>prod/terraform.tfstate</td></tr><tr><td>Cost</td><td>Low</td><td>Higher</td></tr><tr><td>High Availability</td><td>No</td><td>Yes (can add)</td></tr></tbody></table>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="64-example-4-aws-s3-website-hosting">6.4 Example 4: AWS S3 Website Hosting<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#64-example-4-aws-s3-website-hosting" class="hash-link" aria-label="Direct link to 6.4 Example 4: AWS S3 Website Hosting" title="Direct link to 6.4 Example 4: AWS S3 Website Hosting" translate="no">​</a></h3>
<p><strong>main.tf</strong></p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">terraform {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  required_version = "&gt;= 1.9.0"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  required_providers {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    aws = {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      source  = "hashicorp/aws"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      version = "~&gt; 5.0"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">provider "aws" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  region = var.aws_region</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Create S3 bucket</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">resource "aws_s3_bucket" "website" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  bucket = var.bucket_name</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  tags = {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Name        = var.bucket_name</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Environment = var.environment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Configure bucket for website hosting</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">resource "aws_s3_bucket_website_configuration" "website" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  bucket = aws_s3_bucket.website.id</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  index_document {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    suffix = "index.html"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  error_document {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    key = "error.html"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Make bucket public</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">resource "aws_s3_bucket_public_access_block" "website" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  bucket = aws_s3_bucket.website.id</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  block_public_acls       = false</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  block_public_policy     = false</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  ignore_public_acls      = false</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  restrict_public_buckets = false</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Bucket policy for public read access</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">resource "aws_s3_bucket_policy" "website" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  bucket = aws_s3_bucket.website.id</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  policy = jsonencode({</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Version = "2012-10-17"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Statement = [</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        Sid       = "PublicReadGetObject"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        Effect    = "Allow"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        Principal = "*"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        Action    = "s3:GetObject"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        Resource  = "${aws_s3_bucket.website.arn}/*"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    ]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  })</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  depends_on = [aws_s3_bucket_public_access_block.website]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Upload index.html</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">resource "aws_s3_object" "index" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  bucket       = aws_s3_bucket.website.id</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  key          = "index.html"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  content_type = "text/html"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  content      = &lt;&lt;-EOF</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    &lt;!DOCTYPE html&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    &lt;html&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    &lt;head&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        &lt;title&gt;My Terraform Website&lt;/title&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        &lt;style&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            body {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                font-family: Arial, sans-serif;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                max-width: 800px;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                margin: 50px auto;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                padding: 20px;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                color: white;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            h1 {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                text-align: center;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            .container {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                background: rgba(255, 255, 255, 0.1);</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                padding: 30px;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                border-radius: 10px;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        &lt;/style&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    &lt;/head&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    &lt;body&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        &lt;div class="container"&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            &lt;h1&gt;🚀 Welcome to My Terraform Website!&lt;/h1&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            &lt;p&gt;This website is hosted on AWS S3 and deployed using Terraform.&lt;/p&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            &lt;p&gt;&lt;strong&gt;Environment:&lt;/strong&gt; ${var.environment}&lt;/p&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            &lt;p&gt;&lt;strong&gt;Deployed on:&lt;/strong&gt; ${timestamp()}&lt;/p&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        &lt;/div&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    &lt;/body&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    &lt;/html&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  EOF</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Upload error.html</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">resource "aws_s3_object" "error" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  bucket       = aws_s3_bucket.website.id</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  key          = "error.html"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  content_type = "text/html"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  content      = &lt;&lt;-EOF</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    &lt;!DOCTYPE html&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    &lt;html&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    &lt;head&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        &lt;title&gt;Error&lt;/title&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    &lt;/head&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    &lt;body&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        &lt;h1&gt;404 - Page Not Found&lt;/h1&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        &lt;p&gt;The page you're looking for doesn't exist.&lt;/p&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    &lt;/body&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    &lt;/html&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  EOF</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div>
<p><strong>variables.tf</strong></p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">variable "aws_region" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  description = "AWS region"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  type        = string</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  default     = "us-east-1"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">variable "bucket_name" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  description = "Name of the S3 bucket (must be globally unique)"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  type        = string</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">variable "environment" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  description = "Environment name"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  type        = string</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  default     = "dev"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div>
<p><strong>outputs.tf</strong></p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">output "website_url" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  description = "URL of the website"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  value       = "http://${aws_s3_bucket_website_configuration.website.website_endpoint}"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">output "bucket_name" {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  description = "Name of the S3 bucket"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  value       = aws_s3_bucket.website.id</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div>
<p><strong>terraform.tfvars</strong></p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">bucket_name  = "my-terraform-website-12345"  # Must be globally unique!</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">aws_region   = "us-east-1"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">environment  = "production"</span><br></div></code></pre></div></div>
<p><strong>Commands:</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">terraform init</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">terraform apply</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Visit the website URL from output</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># http://my-terraform-website-12345.s3-website-us-east-1.amazonaws.com</span><br></div></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="7-additional-resources">7. Additional Resources<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#7-additional-resources" class="hash-link" aria-label="Direct link to 7. Additional Resources" title="Direct link to 7. Additional Resources" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="71-official-documentation">7.1 Official Documentation<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#71-official-documentation" class="hash-link" aria-label="Direct link to 7.1 Official Documentation" title="Direct link to 7.1 Official Documentation" translate="no">​</a></h3>



































<table><thead><tr><th>Resource</th><th>URL</th><th>Description</th></tr></thead><tbody><tr><td>Terraform Docs</td><td><a href="https://www.terraform.io/docs" target="_blank" rel="noopener noreferrer" class="">https://www.terraform.io/docs</a></td><td>Official documentation</td></tr><tr><td>Terraform Registry</td><td><a href="https://registry.terraform.io/" target="_blank" rel="noopener noreferrer" class="">https://registry.terraform.io</a></td><td>Provider and module registry</td></tr><tr><td>Terraform Tutorials</td><td><a href="https://learn.hashicorp.com/terraform" target="_blank" rel="noopener noreferrer" class="">https://learn.hashicorp.com/terraform</a></td><td>Interactive learning</td></tr><tr><td>AWS Provider</td><td><a href="https://registry.terraform.io/providers/hashicorp/aws" target="_blank" rel="noopener noreferrer" class="">https://registry.terraform.io/providers/hashicorp/aws</a></td><td>AWS provider docs</td></tr><tr><td>Azure Provider</td><td><a href="https://registry.terraform.io/providers/hashicorp/azurerm" target="_blank" rel="noopener noreferrer" class="">https://registry.terraform.io/providers/hashicorp/azurerm</a></td><td>Azure provider docs</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="72-useful-tools">7.2 Useful Tools<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#72-useful-tools" class="hash-link" aria-label="Direct link to 7.2 Useful Tools" title="Direct link to 7.2 Useful Tools" translate="no">​</a></h3>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="73-common-terraform-commands-reference">7.3 Common Terraform Commands Reference<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#73-common-terraform-commands-reference" class="hash-link" aria-label="Direct link to 7.3 Common Terraform Commands Reference" title="Direct link to 7.3 Common Terraform Commands Reference" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Initialization</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">terraform init                    # Initialize working directory</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">terraform init -upgrade           # Upgrade providers</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Planning</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">terraform plan                    # Show execution plan</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">terraform plan -out=tfplan        # Save plan to file</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">terraform plan -target=resource   # Plan for specific resource</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Applying</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">terraform apply                   # Apply changes</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">terraform apply tfplan            # Apply saved plan</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">terraform apply -auto-approve     # Apply without confirmation</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Destroying</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">terraform destroy                 # Destroy all resources</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">terraform destroy -target=resource # Destroy specific resource</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># State Management</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">terraform state list              # List resources in state</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">terraform state show resource     # Show resource details</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">terraform state rm resource       # Remove resource from state</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">terraform state pull              # Download remote state</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Workspace</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">terraform workspace list          # List workspaces</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">terraform workspace new dev       # Create new workspace</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">terraform workspace select dev    # Switch workspace</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Formatting &amp; Validation</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">terraform fmt                     # Format code</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">terraform fmt -recursive          # Format recursively</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">terraform validate                # Validate configuration</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Other</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">terraform output                  # Show outputs</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">terraform show                    # Show current state</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">terraform graph                   # Generate dependency graph</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">terraform import                  # Import existing resource</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="74-troubleshooting-guide">7.4 Troubleshooting Guide<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#74-troubleshooting-guide" class="hash-link" aria-label="Direct link to 7.4 Troubleshooting Guide" title="Direct link to 7.4 Troubleshooting Guide" translate="no">​</a></h3>

































<table><thead><tr><th>Problem</th><th>Solution</th></tr></thead><tbody><tr><td>State lock error</td><td><code>terraform force-unlock &lt;LOCK_ID&gt;</code></td></tr><tr><td>Provider plugin issues</td><td><code>terraform init -upgrade</code></td></tr><tr><td>Resource already exists</td><td><code>terraform import</code> the resource</td></tr><tr><td>State file corrupted</td><td>Restore from backup</td></tr><tr><td>Dependency cycle</td><td>Review <code>depends_on</code> usage</td></tr><tr><td>Plan shows unexpected changes</td><td>Check for drift with <code>terraform refresh</code></td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="75-learning-path">7.5 Learning Path<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#75-learning-path" class="hash-link" aria-label="Direct link to 7.5 Learning Path" title="Direct link to 7.5 Learning Path" translate="no">​</a></h3>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="76-next-steps">7.6 Next Steps<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#76-next-steps" class="hash-link" aria-label="Direct link to 7.6 Next Steps" title="Direct link to 7.6 Next Steps" translate="no">​</a></h3>
<ol>
<li class=""><strong>Practice with Examples</strong>: Run all examples in this guide</li>
<li class=""><strong>Build a Real Project</strong>: Start with a simple 3-tier application</li>
<li class=""><strong>Explore Modules</strong>: Browse Terraform Registry for useful modules</li>
<li class=""><strong>Join Community</strong>:
<ul>
<li class="">Terraform Forum: <a href="https://discuss.hashicorp.com/c/terraform" target="_blank" rel="noopener noreferrer" class="">https://discuss.hashicorp.com/c/terraform</a></li>
<li class="">Reddit: r/terraform</li>
<li class="">Discord: HashiCorp Community</li>
</ul>
</li>
<li class=""><strong>Certification</strong>: Consider HashiCorp Terraform Associate certification</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="77-quick-reference---file-extensions">7.7 Quick Reference - File Extensions<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#77-quick-reference---file-extensions" class="hash-link" aria-label="Direct link to 7.7 Quick Reference - File Extensions" title="Direct link to 7.7 Quick Reference - File Extensions" translate="no">​</a></h3>

































<table><thead><tr><th>Extension</th><th>Purpose</th></tr></thead><tbody><tr><td>.tf</td><td>Terraform configuration files</td></tr><tr><td>.tfvars</td><td>Variable value files</td></tr><tr><td>.tfstate</td><td>State file (never edit manually!)</td></tr><tr><td>.tfplan</td><td>Saved execution plan</td></tr><tr><td>.terraform/</td><td>Directory with providers and modules</td></tr><tr><td>.terraform.lock.hcl</td><td>Dependency lock file</td></tr></tbody></table>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-summary">🎓 Summary<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#-summary" class="hash-link" aria-label="Direct link to 🎓 Summary" title="Direct link to 🎓 Summary" translate="no">​</a></h2>
<p>You've learned:</p>
<p>✅ <strong>What Terraform is</strong>: Infrastructure as Code tool<br>
✅ <strong>Core Components</strong>: Providers, Resources, State, Variables, Outputs<br>
✅ <strong>Modules</strong>: Reusable infrastructure components<br>
✅ <strong>Project Strategy</strong>: How to structure real-world projects<br>
✅ <strong>Best Practices</strong>: Code quality, security, and maintainability<br>
✅ <strong>Hands-on Examples</strong>: AWS and Azure implementations</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="remember">Remember<a href="https://www.ashikmostofa.com/writing/terraform-complete-guide#remember" class="hash-link" aria-label="Direct link to Remember" title="Direct link to Remember" translate="no">​</a></h3>
<ol>
<li class=""><strong>Start Small</strong>: Begin with simple infrastructure</li>
<li class=""><strong>Use Version Control</strong>: Always use Git</li>
<li class=""><strong>Remote State</strong>: Never use local state for production</li>
<li class=""><strong>Modules</strong>: Reuse code with modules</li>
<li class=""><strong>Documentation</strong>: Document everything</li>
<li class=""><strong>Security</strong>: Never commit secrets</li>
<li class=""><strong>Test</strong>: Always run <code>terraform plan</code> before <code>apply</code></li>
</ol>
<p><strong>Happy Terraforming! 🚀</strong></p>
<hr>
<p><em>Terraform Version: 1.9.x</em><br>
<em>AWS Provider: 5.x</em><br>
<em>Azure Provider: 3.x</em></p>
<hr>
<p><em>Written while teaching DevOps to 800+ engineers across 12 cohorts.</em></p>]]></content>
        <author>
            <name>Ashik Mostofa Tonmoy</name>
            <email>tonmoy.ashik@gmail.com</email>
            <uri>https://ashikmostofa.com</uri>
        </author>
        <category label="guide" term="guide"/>
        <category label="terraform" term="terraform"/>
        <category label="iac" term="iac"/>
        <category label="aws" term="aws"/>
        <category label="devops" term="devops"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[HPA, VPA and cluster-autoscaler, together]]></title>
        <id>https://www.ashikmostofa.com/writing/kubernetes-smart-scaling</id>
        <link href="https://www.ashikmostofa.com/writing/kubernetes-smart-scaling"/>
        <updated>2026-07-02T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Three controllers acting at three speeds on one workload. Run HPA and VPA on the same metric and they fight - here is the arrangement that does not.]]></summary>
        <content type="html"><![CDATA[<p>Horizontal Pod Autoscaler is table stakes. But HPA only knows what it observes — CPU, memory, or a custom metric — and it has no opinion about whether a pod was the right size to begin with. That is a different question, answered by a different controller, and the two can be made to work against each other.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="three-decisions-at-three-speeds">Three decisions at three speeds<a href="https://www.ashikmostofa.com/writing/kubernetes-smart-scaling#three-decisions-at-three-speeds" class="hash-link" aria-label="Direct link to Three decisions at three speeds" title="Direct link to Three decisions at three speeds" translate="no">​</a></h2>
<p>Kubernetes scaling is not one feature. It is three independent control loops:</p>





























<table><thead><tr><th>Layer</th><th>Acts in</th><th>Changes</th><th>Question it answers</th></tr></thead><tbody><tr><td><strong>HPA</strong></td><td>Seconds</td><td>Replica count</td><td>"Do we need more copies?"</td></tr><tr><td><strong>VPA</strong></td><td>Minutes to hours</td><td>Requests and limits</td><td>"Was each copy the right size?"</td></tr><tr><td><strong>cluster-autoscaler</strong></td><td>Minutes</td><td>Node count</td><td>"Is there anywhere to put them?"</td></tr></tbody></table>
<p>They only compose if each has a distinct input. Give two of them the same input and you get oscillation.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-conflict-nobody-warns-you-about">The conflict nobody warns you about<a href="https://www.ashikmostofa.com/writing/kubernetes-smart-scaling#the-conflict-nobody-warns-you-about" class="hash-link" aria-label="Direct link to The conflict nobody warns you about" title="Direct link to The conflict nobody warns you about" translate="no">​</a></h2>
<p><strong>Do not run HPA and VPA on the same metric for the same workload.</strong></p>
<p>HPA on CPU adds replicas when CPU utilization — measured <em>as a percentage of the request</em> — rises. VPA in <code>Auto</code> mode raises the CPU request when usage is high. Raising the request lowers the utilization percentage. HPA now sees a workload comfortably under target and scales replicas back down. Load has not changed; the denominator did.</p>
<p>The result is a workload that thrashes, with neither controller wrong on its own terms.</p>
<p>Three safe arrangements:</p>
<ol>
<li class=""><strong>HPA on a custom or external metric, VPA on resources.</strong> HPA scales on requests-per-second or queue depth; VPA owns sizing. No shared input, no fight.</li>
<li class=""><strong>HPA on CPU, VPA in <code>Off</code> mode.</strong> VPA still computes and publishes recommendations, and you apply them deliberately. Slower, and considerably easier to reason about.</li>
<li class=""><strong>VPA in <code>Auto</code>, no HPA.</strong> Correct for workloads that scale vertically — a single-writer database, a queue consumer whose concurrency is fixed.</li>
</ol>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> autoscaling.k8s.io/v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> VerticalPodAutoscaler</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> api</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">targetRef</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> apps/v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Deployment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> api</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">updatePolicy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">updateMode</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Off"</span><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># recommend only; nothing is mutated</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">resourcePolicy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">containerPolicies</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">containerName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"*"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">controlledResources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"cpu"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"memory"</span><span class="token punctuation" style="color:#393A34">]</span><br></div></code></pre></div></div>
<p>Read what it would have done:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">kubectl describe vpa api | grep -A6 'Recommendation'</span><br></div></code></pre></div></div>
<p>Start every workload here. <code>Auto</code> on a legacy service with no startup probes will evict pods to resize them, and a pod that takes 90 seconds to warm up does not enjoy being restarted for a 50Mi adjustment.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="hpa-the-target-is-a-ratio-not-a-ceiling">HPA: the target is a ratio, not a ceiling<a href="https://www.ashikmostofa.com/writing/kubernetes-smart-scaling#hpa-the-target-is-a-ratio-not-a-ceiling" class="hash-link" aria-label="Direct link to HPA: the target is a ratio, not a ceiling" title="Direct link to HPA: the target is a ratio, not a ceiling" translate="no">​</a></h2>
<p>The most common HPA mistake is treating <code>averageUtilization: 50</code> as "scale at 50% CPU". It is a <em>steady-state target</em> — HPA adds replicas until average utilization across the fleet returns to 50%.</p>
<p>Which means the number depends entirely on how fast your load moves. A workload that jumps from 10% to 80% in seconds needs headroom, so a 50% target is right. A workload that climbs gradually reaches equilibrium fine at 70%, and a 50% target simply runs 40% more pods than it needs, permanently.</p>
<p>Stabilization windows matter more than the target:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> autoscaling/v2</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> HorizontalPodAutoscaler</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> api</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">scaleTargetRef</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> apps/v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Deployment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> api</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">minReplicas</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">maxReplicas</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">40</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">metrics</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Resource</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">resource</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> cpu</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">target</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Utilization</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">averageUtilization</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">70</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">behavior</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">scaleUp</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">stabilizationWindowSeconds</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain">     </span><span class="token comment" style="color:#999988;font-style:italic"># react immediately</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">policies</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Percent</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">value</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100</span><span class="token plain">                     </span><span class="token comment" style="color:#999988;font-style:italic"># at most double per interval</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">periodSeconds</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">30</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">scaleDown</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">stabilizationWindowSeconds</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">300</span><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># wait 5 min before shrinking</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">policies</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Percent</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">value</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">periodSeconds</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">60</span><br></div></code></pre></div></div>
<p>Asymmetry is the point. Scaling up late costs you an outage; scaling down early costs you a re-scale two minutes later. Be quick to add and slow to remove.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cluster-autoscaler-why-nodes-do-not-go-away">cluster-autoscaler: why nodes do not go away<a href="https://www.ashikmostofa.com/writing/kubernetes-smart-scaling#cluster-autoscaler-why-nodes-do-not-go-away" class="hash-link" aria-label="Direct link to cluster-autoscaler: why nodes do not go away" title="Direct link to cluster-autoscaler: why nodes do not go away" translate="no">​</a></h2>
<p>Scale-up is the easy direction — pods go <code>Pending</code>, the autoscaler adds a node. Scale-down is where the surprises live, and a node that will not drain is nearly always one of these:</p>
<ul>
<li class=""><strong>A PodDisruptionBudget that cannot be satisfied.</strong> <code>minAvailable: 100%</code>, or a single-replica deployment with <code>minAvailable: 1</code>, means no pod may ever be evicted. The node stays forever.</li>
<li class=""><strong>Pods with local storage.</strong> <code>emptyDir</code> blocks eviction by default, because the data cannot be moved.</li>
<li class=""><strong>Pods with no controller.</strong> A bare pod has nothing to recreate it, so it is not evicted.</li>
<li class=""><strong>kube-system pods without a PDB.</strong> Common on self-managed clusters.</li>
</ul>
<p>Ask the autoscaler directly rather than inferring:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">kubectl -n kube-system logs deploy/cluster-autoscaler | grep -i 'scale.down\|unremovable'</span><br></div></code></pre></div></div>
<p>It names the node and the blocking pod.</p>
<p>The other half is bin packing. Ten nodes at 40% utilization cannot be consolidated if every workload demands anti-affinity across nodes. Scheduling constraints and node reclamation are the same problem viewed from two directions, and topology spread constraints are usually a better tool than hard anti-affinity:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">topologySpreadConstraints</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">maxSkew</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">topologyKey</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> topology.kubernetes.io/zone</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">whenUnsatisfiable</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ScheduleAnyway    </span><span class="token comment" style="color:#999988;font-style:italic"># a preference, not a wall</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">labelSelector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">matchLabels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">app</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> api</span><br></div></code></pre></div></div>
<p><code>ScheduleAnyway</code> keeps spread as a goal without making it a reason a node can never empty.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-smart-scaling-is-not">What "smart scaling" is not<a href="https://www.ashikmostofa.com/writing/kubernetes-smart-scaling#what-smart-scaling-is-not" class="hash-link" aria-label="Direct link to What &quot;smart scaling&quot; is not" title="Direct link to What &quot;smart scaling&quot; is not" translate="no">​</a></h2>
<p>It is not <code>maxReplicas: 1000</code> and hope. It is not <code>updateMode: Auto</code> on a legacy monolith with no startup probes. It is not ignoring the bill because uptime is fine.</p>
<p>It is each layer having a distinct input and a distinct speed: pods request what they actually use, HPA scales on a signal a user would notice, and the cluster grows only when pods genuinely cannot fit. Get that arrangement right and the hourly cost graph goes flat and boring — which is the best news it can carry.</p>
<p>The cost side of this — requests set from guesswork, non-production billing overnight, baseline load at on-demand rates — is <a class="" href="https://www.ashikmostofa.com/writing/kubernetes-cluster-cost-3x">a separate post</a>.</p>]]></content>
        <author>
            <name>Ashik Mostofa Tonmoy</name>
            <email>tonmoy.ashik@gmail.com</email>
            <uri>https://ashikmostofa.com</uri>
        </author>
        <category label="kubernetes" term="kubernetes"/>
        <category label="autoscaling" term="autoscaling"/>
        <category label="hpa" term="hpa"/>
        <category label="vpa" term="vpa"/>
        <category label="cost-optimization" term="cost-optimization"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Docker networking: bridges, iptables and UFW]]></title>
        <id>https://www.ashikmostofa.com/writing/docker-network-deep-dive</id>
        <link href="https://www.ashikmostofa.com/writing/docker-network-deep-dive"/>
        <updated>2026-06-25T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Docker networking is Linux networking with an API on top. Find the veth pair, read the NAT chains, and learn why -p 5432:5432 walks straight past UFW.]]></summary>
        <content type="html"><![CDATA[<p>Most sessions that start with <em>"the container can't reach the database"</em> end at one of four or five misunderstandings. Docker networking is not magic — it is Linux bridges, veth pairs and iptables with a convenient API on top. Once you can see those three things directly, the guessing stops.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-default-bridge-is-rarely-what-you-want">The default bridge is rarely what you want<a href="https://www.ashikmostofa.com/writing/docker-network-deep-dive#the-default-bridge-is-rarely-what-you-want" class="hash-link" aria-label="Direct link to The default bridge is rarely what you want" title="Direct link to The default bridge is rarely what you want" translate="no">​</a></h2>
<p>A container started with no <code>--network</code> attaches to <code>docker0</code>. It works, and it costs you the one feature you will miss immediately: <strong>name resolution</strong>.</p>
<p>On the default bridge, containers find each other by IP only. On a user-defined bridge, Docker runs an embedded DNS resolver and container names work:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">docker network create app-net</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">docker run -d --name api --network app-net my-api</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">docker run -d --name db  --network app-net my-db</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># api can now reach db:5432 by name</span><br></div></code></pre></div></div>
<p>User-defined bridges also isolate: containers on separate bridges cannot reach each other without explicit routing, which is a useful default rather than an obstacle.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="finding-the-veth-pair">Finding the veth pair<a href="https://www.ashikmostofa.com/writing/docker-network-deep-dive#finding-the-veth-pair" class="hash-link" aria-label="Direct link to Finding the veth pair" title="Direct link to Finding the veth pair" translate="no">​</a></h2>
<p>Every container interface is one end of a veth pair. The other end sits on the host bridge. Being able to match them turns "it should be connected" into "it is connected, to this".</p>
<p>Inside the container:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">docker exec api cat /sys/class/net/eth0/iflink</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 42</span><br></div></code></pre></div></div>
<p>That number is the host-side interface index:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">ip link | grep '^42:'</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 42: veth9c3f1a@if41: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; master br-8f2e1c ...</span><br></div></code></pre></div></div>
<p><code>master br-8f2e1c</code> is the bridge it is attached to. Confirm that matches the network you meant:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">docker network inspect app-net --format '{{.Id}}'</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 8f2e1c...  — the bridge name is br- plus the first 12 chars</span><br></div></code></pre></div></div>
<p>If the bridge does not match, the container is on a different network and nothing else you check matters.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-firewall-gotcha--p-goes-around-ufw">The firewall gotcha: <code>-p</code> goes around UFW<a href="https://www.ashikmostofa.com/writing/docker-network-deep-dive#the-firewall-gotcha--p-goes-around-ufw" class="hash-link" aria-label="Direct link to the-firewall-gotcha--p-goes-around-ufw" title="Direct link to the-firewall-gotcha--p-goes-around-ufw" translate="no">​</a></h2>
<p>This is the one worth knowing even if you skip everything else.</p>
<p>You configure a default-deny firewall. You publish a port:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">docker run -d -p 5432:5432 postgres</span><br></div></code></pre></div></div>
<p>Your database is now reachable from the internet, and <code>ufw status</code> still says <code>deny (incoming)</code>.</p>
<p>UFW manages rules in the <strong>filter</strong> table's <code>INPUT</code> chain. Docker inserts its own rules into the <strong>nat</strong> table's <code>PREROUTING</code> chain, which runs first, and then into <code>FORWARD</code> — neither of which UFW is looking at. Traffic is DNAT'd to the container before UFW's rules are ever consulted.</p>
<p>See it directly:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">sudo iptables -t nat -L DOCKER -n --line-numbers</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># DNAT  tcp -- 0.0.0.0/0  0.0.0.0/0  tcp dpt:5432 to:172.18.0.2:5432</span><br></div></code></pre></div></div>
<p>Two ways to fix it:</p>
<p><strong>Bind to the interface you actually mean.</strong> The most reliable fix, and it needs no firewall knowledge:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">docker run -d -p 127.0.0.1:5432:5432 postgres</span><br></div></code></pre></div></div>
<p>An unqualified <code>-p 5432:5432</code> means <code>0.0.0.0</code> — every interface on the host.</p>
<p><strong>Use the <code>DOCKER-USER</code> chain.</strong> Docker jumps to it before its own rules and never flushes it, so it survives daemon restarts:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">sudo iptables -I DOCKER-USER -i eth0 ! -s 10.0.0.0/8 -j DROP</span><br></div></code></pre></div></div>
<p>Note this filters on the <strong>host's external interface</strong>, not the bridge. Rules you add to <code>INPUT</code> will not be consulted for published ports, no matter how correct they look.</p>
<p>On nodes with no private network between them — where every host sits on a shared public segment — this is not a hardening nicety. A published port is a port on the public internet, and the host firewall you configured is not in the path.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="dns-1270011-and-what-breaks-it">DNS: <code>127.0.0.11</code>, and what breaks it<a href="https://www.ashikmostofa.com/writing/docker-network-deep-dive#dns-1270011-and-what-breaks-it" class="hash-link" aria-label="Direct link to dns-1270011-and-what-breaks-it" title="Direct link to dns-1270011-and-what-breaks-it" translate="no">​</a></h2>
<p>Docker's embedded resolver listens on <code>127.0.0.11</code> inside the container namespace. The classic symptom is: <em>from the host I can curl the service by IP, but from another container the hostname does not resolve.</em></p>
<p>Check the three things that cause it:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">docker exec api cat /etc/resolv.conf    # is 127.0.0.11 still the nameserver?</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">docker inspect api --format '{{json .NetworkSettings.Networks}}' | jq keys</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">docker exec api getent hosts db</span><br></div></code></pre></div></div>
<ol>
<li class=""><strong>Different networks.</strong> Name resolution only works within a user-defined bridge.</li>
<li class=""><strong>The default bridge.</strong> No embedded DNS, so names never resolve there.</li>
<li class=""><strong>An overridden <code>resolv.conf</code>.</strong> A <code>--dns</code> flag or a base image that writes its own file removes the path to <code>127.0.0.11</code>.</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="listening-on-127001-inside-a-container">Listening on 127.0.0.1 inside a container<a href="https://www.ashikmostofa.com/writing/docker-network-deep-dive#listening-on-127001-inside-a-container" class="hash-link" aria-label="Direct link to Listening on 127.0.0.1 inside a container" title="Direct link to Listening on 127.0.0.1 inside a container" translate="no">​</a></h2>
<p>A service bound to <code>127.0.0.1</code> inside a container is bound to <em>that container's</em> loopback. Nothing outside the namespace can reach it, including the published port — the DNAT rule delivers traffic to the container's <code>eth0</code> address, where nothing is listening.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">docker exec api ss -tlnp</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># LISTEN 0 128 127.0.0.1:8080   ← unreachable</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># LISTEN 0 128   0.0.0.0:8080   ← correct</span><br></div></code></pre></div></div>
<p>Connection refused on a correctly published port is almost always this.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-mental-model-that-holds-up">A mental model that holds up<a href="https://www.ashikmostofa.com/writing/docker-network-deep-dive#a-mental-model-that-holds-up" class="hash-link" aria-label="Direct link to A mental model that holds up" title="Direct link to A mental model that holds up" translate="no">​</a></h2>
<p>Each Docker bridge is a virtual switch with its own subnet. A veth pair is a cable: one end in the container's network namespace, one end plugged into that switch. Published ports are DNAT rules that rewrite the destination before routing.</p>
<p>Cross-host overlay networking extends the same model with VXLAN tunnels between hosts. Under Kubernetes you are not using Docker bridge networking at all — a CNI plugin owns the pod network, and the debugging moves to that layer.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="checklist">Checklist<a href="https://www.ashikmostofa.com/writing/docker-network-deep-dive#checklist" class="hash-link" aria-label="Direct link to Checklist" title="Direct link to Checklist" translate="no">​</a></h2>
<ul>
<li class="">Same <code>docker network</code>? <code>docker network inspect</code> on both.</li>
<li class="">Ping by IP works but name fails? DNS — check <code>resolv.conf</code> and whether it is the default bridge.</li>
<li class="">Connection refused on a published port? The process is bound to <code>127.0.0.1</code> inside the container.</li>
<li class="">Port reachable that should not be? <code>iptables -t nat -L DOCKER</code>, then bind to an explicit interface.</li>
<li class="">Cross-bridge traffic failing? That is intended isolation, not a bug.</li>
</ul>]]></content>
        <author>
            <name>Ashik Mostofa Tonmoy</name>
            <email>tonmoy.ashik@gmail.com</email>
            <uri>https://ashikmostofa.com</uri>
        </author>
        <category label="docker" term="docker"/>
        <category label="networking" term="networking"/>
        <category label="containers" term="containers"/>
        <category label="linux" term="linux"/>
        <category label="security" term="security"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Gateway API: what I use instead of Ingress]]></title>
        <id>https://www.ashikmostofa.com/writing/kubernetes-gateway-api</id>
        <link href="https://www.ashikmostofa.com/writing/kubernetes-gateway-api"/>
        <updated>2026-06-18T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Ingress makes one object the negotiation table for three teams. Gateway API splits it along ownership lines, and allowedRoutes is what makes it real.]]></summary>
        <content type="html"><![CDATA[<p>Ingress controllers got most of us started, and Ingress is not deprecated. But on a multi-tenant platform it fails in a specific, predictable way: one object ends up owning TLS, routing and rate limits, which means three teams edit the same YAML and none of them owns it.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-failure-mode">The failure mode<a href="https://www.ashikmostofa.com/writing/kubernetes-gateway-api#the-failure-mode" class="hash-link" aria-label="Direct link to The failure mode" title="Direct link to The failure mode" translate="no">​</a></h2>
<p>Ingress is fine when one team owns the cluster. The problems start when platform, application and security teams share one.</p>
<ul>
<li class=""><strong>One object, three owners.</strong> TLS config, path routing and rate limits all live on the same resource. Every change is a negotiation conducted through <code>kubectl edit</code>.</li>
<li class=""><strong>Route delegation is convention, not API.</strong> <code>ingressClassName</code> and controller annotations get you partway. There is no first-class boundary that says <em>platform owns the listener, app teams own their routes</em>.</li>
<li class=""><strong>Cross-namespace routing needs shared secrets.</strong> Most implementations either do not support it or require copying the TLS Secret into each namespace — which multiplies the number of places a wildcard certificate exists.</li>
</ul>
<p>On a multi-tenant PaaS with dozens of services across several tenants and ten clusters, that last one is disqualifying. A wildcard cert copied per namespace is a wildcard cert you can no longer rotate in one place.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-gateway-api-changes">What Gateway API changes<a href="https://www.ashikmostofa.com/writing/kubernetes-gateway-api#what-gateway-api-changes" class="hash-link" aria-label="Direct link to What Gateway API changes" title="Direct link to What Gateway API changes" translate="no">​</a></h2>
<p>Three resources, split along the lines the org is already split:</p>

























<table><thead><tr><th>Resource</th><th>Owner</th><th>Says</th></tr></thead><tbody><tr><td><code>GatewayClass</code></td><td>Platform</td><td>"This is the controller we run."</td></tr><tr><td><code>Gateway</code></td><td>Platform</td><td>"These listeners, these ports, this TLS."</td></tr><tr><td><code>HTTPRoute</code></td><td>App team</td><td>"Traffic for <code>/api</code> goes to our Service."</td></tr></tbody></table>
<p>An app team creates an <code>HTTPRoute</code> in its own namespace and attaches it to a Gateway it does not own. The platform team never hands over the certificate or the public IP.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-platform-side">The platform side<a href="https://www.ashikmostofa.com/writing/kubernetes-gateway-api#the-platform-side" class="hash-link" aria-label="Direct link to The platform side" title="Direct link to The platform side" translate="no">​</a></h2>
<p>The Gateway is where the delegation policy lives, and <code>allowedRoutes</code> is the field that makes it enforceable rather than advisory:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> gateway.networking.k8s.io/v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> GatewayClass</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nginx</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">controllerName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> gateway.nginxinc.io/nginx</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">gateway</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">controller</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> gateway.networking.k8s.io/v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Gateway</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> public</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> platform</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">gatewayClassName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nginx</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">listeners</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> https</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">protocol</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> HTTPS</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">443</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">hostname</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"*.example.com"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">tls</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">certificateRefs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> wildcard</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">cert      </span><span class="token comment" style="color:#999988;font-style:italic"># stays in the platform namespace</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">allowedRoutes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">namespaces</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">from</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Selector</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">selector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">matchLabels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">gateway-access</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"true"</span><br></div></code></pre></div></div>
<p><code>from: Selector</code> is the part worth stopping on. The alternatives are <code>Same</code> (only the Gateway's own namespace) and <code>All</code> — and <code>All</code> on a public listener means any namespace in the cluster can publish a route on your production hostname. Label the namespaces you intend to allow and let the selector enforce it.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-tenant-side">The tenant side<a href="https://www.ashikmostofa.com/writing/kubernetes-gateway-api#the-tenant-side" class="hash-link" aria-label="Direct link to The tenant side" title="Direct link to The tenant side" translate="no">​</a></h2>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> gateway.networking.k8s.io/v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> HTTPRoute</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> app</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">route</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> payments</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">parentRefs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> public</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> platform</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">hostnames</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> payments.example.com</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">rules</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">matches</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">path</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> PathPrefix</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">value</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /api</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">backendRefs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> payments</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">service</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">8080</span><br></div></code></pre></div></div>
<p>The <code>parentRefs</code> namespace reference is the whole mechanism: the route attaches upward to a Gateway in another namespace, and the Gateway's <code>allowedRoutes</code> decides whether that attachment is permitted.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="referencegrant-and-why-cross-namespace-backends-fail-closed">ReferenceGrant, and why cross-namespace backends fail closed<a href="https://www.ashikmostofa.com/writing/kubernetes-gateway-api#referencegrant-and-why-cross-namespace-backends-fail-closed" class="hash-link" aria-label="Direct link to ReferenceGrant, and why cross-namespace backends fail closed" title="Direct link to ReferenceGrant, and why cross-namespace backends fail closed" translate="no">​</a></h2>
<p>A route in one namespace cannot reach a Service in another by default. That is deliberate — otherwise any namespace could route traffic to any Service in the cluster.</p>
<p>The target namespace has to consent, explicitly:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> gateway.networking.k8s.io/v1beta1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ReferenceGrant</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> allow</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">payments</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">routes</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> billing          </span><span class="token comment" style="color:#999988;font-style:italic"># lives with the TARGET, not the route</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">from</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">group</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> gateway.networking.k8s.io</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> HTTPRoute</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> payments</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">to</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">group</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Service</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> billing</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">service</span><br></div></code></pre></div></div>
<p>Two things catch people here. The grant lives in the <strong>target</strong> namespace, because consent belongs to the party being referenced. And without it the route does not error loudly — it reports a <code>ResolvedRefs: False</code> condition and quietly serves nothing:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">kubectl get httproute app-route -n payments -o jsonpath='{.status.parents[*].conditions}' | jq</span><br></div></code></pre></div></div>
<p>Check that status field first on any route that attaches cleanly but returns 404.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-genuinely-better">What is genuinely better<a href="https://www.ashikmostofa.com/writing/kubernetes-gateway-api#what-is-genuinely-better" class="hash-link" aria-label="Direct link to What is genuinely better" title="Direct link to What is genuinely better" translate="no">​</a></h2>
<ul>
<li class=""><strong>Portable filters.</strong> Header manipulation, redirects and URL rewrites are API fields, not controller-specific annotations. Migrating between implementations stops being a rewrite.</li>
<li class=""><strong>Traffic splitting is native.</strong> Weighted <code>backendRefs</code> give you canary releases without a service mesh.</li>
<li class=""><strong>Policy attachment</strong> hangs timeouts, retries and rate limits off routes through a standard extension point.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="when-i-still-use-ingress">When I still use Ingress<a href="https://www.ashikmostofa.com/writing/kubernetes-gateway-api#when-i-still-use-ingress" class="hash-link" aria-label="Direct link to When I still use Ingress" title="Direct link to When I still use Ingress" translate="no">​</a></h2>
<p>Internal clusters where one team owns everything. Ingress is simpler, the tooling is mature, and the ownership problem Gateway API solves does not exist there.</p>
<p>I do not migrate working clusters on principle either — the cost is real and the payoff is proportional to how many teams share the ingress path.</p>
<p>The signal to move is specific: <strong>more than one team edits the same Ingress object.</strong> If that is happening, the object has become a negotiation table, and Gateway API will pay for itself quickly. If it is not, stay where you are.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="resources">Resources<a href="https://www.ashikmostofa.com/writing/kubernetes-gateway-api#resources" class="hash-link" aria-label="Direct link to Resources" title="Direct link to Resources" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://gateway-api.sigs.k8s.io/" target="_blank" rel="noopener noreferrer" class="">Gateway API overview</a></li>
<li class=""><a href="https://github.com/nginxinc/nginx-gateway-fabric" target="_blank" rel="noopener noreferrer" class="">NGINX Gateway Fabric</a></li>
<li class=""><a href="https://gateway-api.sigs.k8s.io/implementations/" target="_blank" rel="noopener noreferrer" class="">Implementation list</a></li>
</ul>]]></content>
        <author>
            <name>Ashik Mostofa Tonmoy</name>
            <email>tonmoy.ashik@gmail.com</email>
            <uri>https://ashikmostofa.com</uri>
        </author>
        <category label="kubernetes" term="kubernetes"/>
        <category label="gateway-api" term="gateway-api"/>
        <category label="networking" term="networking"/>
        <category label="ingress" term="ingress"/>
        <category label="multi-tenancy" term="multi-tenancy"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Why I started writing]]></title>
        <id>https://www.ashikmostofa.com/writing/hello-world</id>
        <link href="https://www.ashikmostofa.com/writing/hello-world"/>
        <updated>2026-05-18T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Why I started writing publicly about platform engineering, and what I plan to put here.]]></summary>
        <content type="html"><![CDATA[<p>I've been doing DevOps and Platform Engineering work for years. Most of what I've learned, I learned by doing — and a lot of the specific, useful knowledge is scattered across Slack threads, internal wikis, and conversations that never made it anywhere public.</p>
<p>This is where that changes.</p>
<p>I'm not going to write broad overviews. There are enough of those. I'm going to write the things I wish existed when I was solving a specific problem: the precise reason a Kubernetes cluster was costing 3x more than it needed to, the exact step that breaks CI/CD pipelines when you move to OIDC, the non-obvious consequence of a cost optimisation that looks good in a dashboard but moves the problem somewhere harder to see.</p>
<p>Narrow, specific, useful. That's the plan.</p>
<p>If you have a specific problem you'd like me to write about, <a href="mailto:tonmoy.ashik@gmail.com" target="_blank" rel="noopener noreferrer" class="">send me a message</a>.</p>]]></content>
        <author>
            <name>Ashik Mostofa Tonmoy</name>
            <email>tonmoy.ashik@gmail.com</email>
            <uri>https://ashikmostofa.com</uri>
        </author>
        <category label="meta" term="meta"/>
    </entry>
</feed>