<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[J.A.I]]></title><description><![CDATA[From localhost chaos to prod glory -- this blog cooks DevOps tighter than Heisenberg’s batch. Subscribe, or the Blinders won’t be kind.]]></description><link>https://blog.jaivardhan.online</link><generator>RSS for Node</generator><lastBuildDate>Wed, 15 Apr 2026 20:38:21 GMT</lastBuildDate><atom:link href="https://blog.jaivardhan.online/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[The Security Journey (HTTP --> HTTPS)]]></title><description><![CDATA[When I bought my domain jaivardhan.online, I thought the story ended there — just point the name to a server and boom, a website. But when I moved it to Cloudflare, a new word kept coming up: SSL/TLS.
I had heard of HTTPS before, but I didn’t really ...]]></description><link>https://blog.jaivardhan.online/http-to-https</link><guid isPermaLink="true">https://blog.jaivardhan.online/http-to-https</guid><category><![CDATA[http]]></category><category><![CDATA[https]]></category><category><![CDATA[SSL]]></category><category><![CDATA[SSL/TLS]]></category><category><![CDATA[ssh-keys]]></category><category><![CDATA[SSL Certificate]]></category><category><![CDATA[Devops]]></category><category><![CDATA[Cloud]]></category><category><![CDATA[Cloud Computing]]></category><category><![CDATA[cloudflare]]></category><dc:creator><![CDATA[Jai Vardhan Narayana]]></dc:creator><pubDate>Tue, 02 Sep 2025 17:54:34 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1756835301760/4549fc0e-e1d7-4017-8efb-477cc82be973.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>When I bought my domain <a target="_blank" href="http://jaivardhan.online"><code>jaivardhan.online</code></a>, I thought the story ended there — just point the name to a server and boom, a website. But when I moved it to Cloudflare, a new word kept coming up: <strong>SSL/TLS</strong>.</p>
<p>I had heard of HTTPS before, but I didn’t really know what happens behind the scenes. So I went deep, step by step. This is what I learned</p>
<hr />
<h2 id="heading-the-traffic-path-user-cloudflare-my-domain">The Traffic Path: User → Cloudflare → My Domain</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1756834611903/047a9318-d8d3-4297-b9fe-40cb65ba5727.png" alt class="image--center mx-auto" /></p>
<p>Let’s start with the big picture.</p>
<ul>
<li><p><strong>User/Visitor (Browser)</strong> → opens my website (<a target="_blank" href="https://jaivardhan.online"><code>https://jaivardhan.online</code></a>)</p>
</li>
<li><p><strong>Cloudflare</strong> → sits in the middle, protects my site, and handles a lot of stuff (security, caching, SSL).</p>
</li>
<li><p><strong>My Domain Host (Hostinger)</strong> → actually stores the site files.</p>
</li>
</ul>
<p>So the path is:<br /><strong>Client/User ↔ Cloudflare ↔ Domain (Hostinger)</strong></p>
<p>SSL/TLS decides <strong>how secure</strong> each leg of this journey is.</p>
<hr />
<h2 id="heading-cloudflares-role-in-ssl">Cloudflare’s Role in SSL</h2>
<p>When I added my domain to Cloudflare, I noticed something cool:</p>
<ul>
<li><p>Cloudflare automatically gave me a <strong>Universal SSL certificate</strong> for free.</p>
</li>
<li><p>That certificate covers the first half of the path: <strong>User ↔ Cloudflare</strong>.</p>
</li>
</ul>
<p>That’s why, even though I hadn’t installed anything on Hostinger, my site was already showing as <strong>Secure</strong> in the browser!<br />Because Cloudflare was handling HTTPS for visitors.</p>
<p>So basically, Cloudflare acted like:</p>
<blockquote>
<p>“Don’t worry, I’ll take care of the visitors. Even if your server is plain old HTTP, I’ll still show them HTTPS.”</p>
</blockquote>
<hr />
<h2 id="heading-encryption-modes-in-cloudflare">Encryption Modes in Cloudflare</h2>
<p>In Cloudflare’s <strong>SSL/TLS settings</strong>, there are different modes:</p>
<ol>
<li><p><strong>Off</strong> (not secure)</p>
<ul>
<li>No HTTPS at all. Browsers will warn visitors.</li>
</ul>
</li>
<li><p><strong>Flexible</strong></p>
<ul>
<li><p><strong>User ↔ Cloudflare</strong> = HTTPS</p>
</li>
<li><p><strong>Cloudflare ↔ Hostinger (origin)</strong> = HTTP</p>
</li>
<li><p>Safer than nothing, but origin side is still plain and vulnerable.</p>
</li>
</ul>
</li>
<li><p><strong>Full</strong></p>
<ul>
<li><p><strong>User ↔ Cloudflare</strong> = HTTPS</p>
</li>
<li><p><strong>Cloudflare ↔ Hostinger</strong> = HTTPS (but Cloudflare doesn’t check if the origin’s certificate is valid).</p>
</li>
<li><p>Works if your host has SSL (even self-signed).</p>
</li>
</ul>
</li>
<li><p><strong>Full (Strict)</strong> —&gt; (the best)</p>
<ul>
<li><p><strong>User ↔ Cloudflare</strong> = HTTPS</p>
</li>
<li><p><strong>Cloudflare ↔ Hostinger</strong> = HTTPS (and the certificate must be valid &amp; trusted).</p>
</li>
<li><p>Ensures true end-to-end encryption.</p>
</li>
</ul>
</li>
<li><p><strong>Strict (SSL-Only Origin Pull)</strong></p>
<ul>
<li><p>Forces encryption with origin no matter what.</p>
</li>
<li><p>Useful for locked-down setups.</p>
</li>
</ul>
</li>
</ol>
<p>So the key takeaway for me:</p>
<ul>
<li><p>Cloudflare always covers <strong>User ↔ Cloudflare</strong> with its Universal SSL.</p>
</li>
<li><p>But for <strong>Cloudflare ↔ Hostinger</strong>, I need SSL installed at my host if I want Full Strict security.</p>
</li>
</ul>
<hr />
<h2 id="heading-free-ssl-at-hostinger-cloudflare-domain">Free SSL at Hostinger (Cloudflare — Domain)</h2>
<p>Good news: I didn’t have to buy anything. Hostinger automatically provides a free SSL certificate (via Let’s Encrypt) for domains that are bought using Hostinger.</p>
<p>This means:</p>
<ul>
<li><p>Cloudflare ↔ Hostinger is also encrypted (when set to Full Strict).</p>
</li>
<li><p>My site has true <strong>end-to-end HTTPS</strong>.</p>
</li>
</ul>
<hr />
<h2 id="heading-big-question-if-hostinger-already-gives-ssl-why-still-use-cloudflare">Big Question: If Hostinger already gives SSL, why still use Cloudflare?</h2>
<p>At this point, I thought:</p>
<blockquote>
<p>“Hostinger already gave me a free SSL certificate. So why do I even need Cloudflare? Isn’t SSL the main goal?”</p>
</blockquote>
<p>Here’s the reality</p>
<p>Cloudflare ≠ just SSL. It’s much more:</p>
<ul>
<li><p><strong>Extra Layer of SSL</strong> → Even if Hostinger handles SSL, Cloudflare ensures your visitors get HTTPS instantly without waiting for setup.</p>
</li>
<li><p><strong>DDoS Protection</strong> → Shields your site if someone floods it with fake traffic.</p>
</li>
<li><p><strong>CDN (Content Delivery Network)</strong> → Cloudflare has servers worldwide. Visitors get your site from the nearest Cloudflare location, so it loads faster.</p>
</li>
<li><p><strong>Firewall &amp; Security</strong> → Blocks bots, attackers, and suspicious requests before they even hit your Hostinger server.</p>
</li>
<li><p><strong>Free Extras</strong> → Like Always Online (shows cached version if your site is down).</p>
</li>
</ul>
<p>So think of it this way:</p>
<ul>
<li><p><strong>Hostinger SSL</strong> = Your server has a lock on its door.</p>
</li>
<li><p><strong>Cloudflare SSL + Features</strong> = A security guard at the gate + faster delivery service + backup plan.</p>
</li>
</ul>
<p>That’s why we can keep Cloudflare even though Hostinger already provides SSL.</p>
<hr />
<h2 id="heading-testing-my-ssl">Testing My SSL</h2>
<p>I ran my domain on <strong>SSL Labs Test</strong> and got a <strong>B rating</strong>.<br />That means my setup works, but there are still optimizations I can do later (A+ is the best)</p>
]]></content:encoded></item><item><title><![CDATA[WTH is DNS ???]]></title><description><![CDATA[I’ve always heard words like DNS, SSL, and Cloudflare, but honestly, I didn’t really know what they meant. Recently, I bought my first domain jaivardhan.online from Hostinger, and I decided to try connecting it to Cloudflare.
It turned into a fun lea...]]></description><link>https://blog.jaivardhan.online/dns</link><guid isPermaLink="true">https://blog.jaivardhan.online/dns</guid><category><![CDATA[dns]]></category><category><![CDATA[dns resolver]]></category><category><![CDATA[dns-records]]></category><category><![CDATA[Devops]]></category><category><![CDATA[website]]></category><category><![CDATA[deployment]]></category><dc:creator><![CDATA[Jai Vardhan Narayana]]></dc:creator><pubDate>Tue, 02 Sep 2025 17:26:33 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1756833706706/691157f4-a4e5-489f-83d2-a9a33769f355.avif" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I’ve always heard words like <em>DNS</em>, <em>SSL</em>, and <em>Cloudflare</em>, but honestly, I didn’t really know what they meant. Recently, I bought my first domain <code>jaivardhan.online</code> from <a target="_blank" href="https://www.hostinger.com/1">Hostinger</a>, and I decided to try connecting it to <a target="_blank" href="https://www.cloudflare.com/en-in/">Cloudflare</a>.</p>
<p>It turned into a fun learning journey where I not only connected my domain but also finally understood what all these “DNS records” mean. Here’s the full story — step by step, just like I did it.</p>
<hr />
<h2 id="heading-step-1-buying-the-domain">Step 1: Buying the Domain</h2>
<p>I started with Hostinger because it had cheap domains. I bought <a target="_blank" href="https://jaivardhan.online"><code>jaivardhan.online</code></a>. At this point, I thought, “Okay, cool, I own a website name.” But I soon realized: a domain is just a <strong>name</strong> — it doesn’t do anything by itself.</p>
<p>If I wanted to connect it to a server, add SSL, or protect it, I needed to manage its DNS (Domain Name System). And that’s where Cloudflare came in.</p>
<hr />
<h2 id="heading-step-2-adding-my-domain-to-cloudflare">Step 2: Adding My Domain to Cloudflare</h2>
<p>I created a free account on Cloudflare. The first thing Cloudflare asked was: <strong>What’s your domain?</strong><br />So I typed in <code>jaivardhan.online</code>.</p>
<p>Cloudflare then gave me three options:</p>
<ol>
<li><p>Scan existing DNS records automatically</p>
</li>
<li><p>Enter them manually</p>
</li>
<li><p>Upload a DNS file</p>
</li>
</ol>
<p>I picked <strong>automatic scan</strong>, because why make life harder?</p>
<p>Within a few seconds, Cloudflare pulled in all the DNS records that were already on Hostinger. I was surprised at how many things were there.</p>
<hr />
<h2 id="heading-step-3-understanding-the-dns-records">Step 3: Understanding the DNS Records</h2>
<p>When Cloudflare scanned my domain, here’s what I saw:</p>
<ul>
<li><p><strong>1 A Record</strong> → This was the main one pointing to my server’s IP (the “home address” of my website).</p>
</li>
<li><p><strong>1 AAAA Record</strong> → Same as the A record, but for IPv6.</p>
</li>
<li><p><strong>12 CAA Records</strong> → These were for SSL certificate providers. I didn’t know why there were so many.</p>
</li>
<li><p><strong>1 CNAME Record</strong> → This pointed <code>www.jaivardhan.online</code> to <code>jaivardhan.online</code>.</p>
</li>
<li><p><strong>2 NS Records</strong> → These were Hostinger’s default nameservers.</p>
</li>
</ul>
<p>At first, this looked scary. But step by step, I figured them out:</p>
<ul>
<li><p>The <strong>A Record</strong> is the most important — it connects your domain to your server.</p>
</li>
<li><p>The <strong>CNAME</strong> is just an alias (www → main domain).</p>
</li>
<li><p>The <strong>CAA Records</strong> tell which companies are allowed to issue SSL certificates for your domain. But since Cloudflare provides its own SSL for free, I didn’t need them.</p>
</li>
<li><p>The <strong>NS Records</strong> (name servers) were Hostinger’s. But soon, I’d have to replace them with Cloudflare’s.</p>
</li>
</ul>
<hr />
<h2 id="heading-step-4-cleaning-up">Step 4: Cleaning Up</h2>
<p>I went back to Hostinger’s DNS panel and deleted all the <strong>CAA records</strong>, because they were unnecessary once I moved to Cloudflare.</p>
<p>Then I noticed something interesting: even after deleting them in Hostinger, Cloudflare’s dashboard was still showing those old records. That’s because Cloudflare had copied them during the scan.</p>
<p>So I deleted them from Cloudflare too. I also saw some yellow warning icons on the AAAA and CNAME records saying “not covered by SSL yet.” I didn’t panic — Cloudflare was just waiting for me to finish setup.</p>
<hr />
<h2 id="heading-step-5-switching-name-servers-to-cloudflare">Step 5: Switching Name Servers to Cloudflare</h2>
<p>Now came the big moment: actually giving Cloudflare control of my domain.</p>
<p>Cloudflare gave me <strong>two new name servers</strong>:</p>
<ul>
<li><p><code>noor.ns.cloudflare.com</code></p>
</li>
<li><p><code>chase.ns.cloudflare.com</code></p>
</li>
</ul>
<p>I went back to Hostinger → “Domain” → “Nameservers” → and replaced Hostinger’s default ones with these two.</p>
<p>This basically told the internet: “Hey, from now on, Cloudflare is the manager of my domain.”</p>
<p>After saving, Cloudflare showed me a message: <em>“Waiting for nameserver changes… this can take up to 24 hours.”</em><br />That was a little disappointing, but I learned it’s normal. DNS takes time to update all over the world.</p>
<hr />
<h2 id="heading-step-6-checking-propagation">Step 6: Checking Propagation</h2>
<p>While waiting, I got curious: how do I know if the change is working?</p>
<p>That’s when I found <a target="_blank" href="https://www.whatsmydns.net/?utm_source=chatgpt.com">WhatsMyDNS.net</a> . This site lets you check if your domain is pointing to the right IP across different countries.</p>
<p>When I entered <code>jaivardhan.online</code>, I saw <strong>green ticks</strong> all over the map with the IP . That number was my domain’s server IP address. (Honestly, I was so happy seeing that. It felt like my domain was alive across the globe!)</p>
<p>I also checked on <a target="_blank" href="https://lookup.icann.org/?utm_source=chatgpt.com">ICANN Lookup</a> . and it confirmed my domain was now using Cloudflare’s nameservers (<code>noor</code> and <code>chase</code>). Success!</p>
<hr />
<p>At the start, I thought moving my domain would just be clicking a few buttons. But it turned into a really useful exercise. I not only connected my Hostinger domain to Cloudflare but also learned the meaning of DNS records, what name servers do, and why SSL matters.</p>
]]></content:encoded></item><item><title><![CDATA[Implementing K8s Architecture: minikube v/s kubeadm v/s Managed Services (EKS/AKS/GKE)]]></title><description><![CDATA[Before we implement, you need to know the different ways to set up a Kubernetes cluster. There are 3 types in which we can create a K8s cluster , 1) Minikube 2) kubectl(the most famous and common) 3) Cloud Managed Service which is through various clo...]]></description><link>https://blog.jaivardhan.online/implementing-k8s-architecture</link><guid isPermaLink="true">https://blog.jaivardhan.online/implementing-k8s-architecture</guid><category><![CDATA[Kubernetes]]></category><category><![CDATA[k8s]]></category><category><![CDATA[Devops]]></category><category><![CDATA[Devops articles]]></category><category><![CDATA[ci-cd]]></category><category><![CDATA[ansible]]></category><category><![CDATA[Terraform]]></category><category><![CDATA[AWS]]></category><category><![CDATA[aks]]></category><category><![CDATA[AKS,Azure kubernetes services]]></category><category><![CDATA[EKS]]></category><category><![CDATA[EKS cluster]]></category><category><![CDATA[GCP]]></category><category><![CDATA[Google]]></category><dc:creator><![CDATA[Jai Vardhan Narayana]]></dc:creator><pubDate>Thu, 21 Aug 2025 10:56:48 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/9cXMJHaViTM/upload/2eef553f8dd5aabd4513094e91e40302.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Before we implement, you need to know the <strong>different ways to set up a Kubernetes cluster</strong>. There are 3 types in which we can create a K8s cluster , 1) Minikube 2) kubectl(the most famous and common) 3) Cloud Managed Service which is through various cloud service providers They all give you the <em>same Kubernetes</em>, but the <strong>responsibilities differ</strong> (who manages what).</p>
<h2 id="heading-minikube-local-setup"><strong>Minikube (Local Setup)</strong></h2>
<p>Best for <strong>beginners / local testing</strong>.</p>
<ul>
<li><p>Runs Kubernetes <strong>on your laptop</strong> (inside VM or Docker).</p>
</li>
<li><p>Designed for <strong>learning and experimenting</strong>.</p>
</li>
<li><p>You get <strong>1 Node cluster</strong> (Control Plane + Worker on same machine).</p>
</li>
<li><p>Very easy setup:</p>
</li>
<li><p>But not production-grade.</p>
</li>
</ul>
<p><strong>Use case:</strong></p>
<ul>
<li><p>Learning</p>
</li>
<li><p>Running sample apps</p>
</li>
<li><p>Small dev environment</p>
</li>
</ul>
<h2 id="heading-kubeadm-self-hosted-setup"><strong>Kubeadm (Self-Hosted Setup)</strong></h2>
<p>Best for <strong>hands-on understanding of real cluster setup</strong>.</p>
<ul>
<li><p>You provision <strong>real servers/VMs</strong> (on-prem or cloud, e.g., EC2).</p>
</li>
<li><p>One machine = <strong>Control Plane (master)</strong></p>
</li>
<li><p>Other machines = <strong>Worker Nodes</strong></p>
</li>
<li><p>You run <code>kubeadm init</code> on master, and <code>kubeadm join</code> on workers.</p>
</li>
<li><p>You manage <strong>everything yourself</strong>:</p>
<ul>
<li><p>Installing Kubernetes components</p>
</li>
<li><p>Networking (CNI plugin like Flannel, Weave, Calico)</p>
</li>
<li><p>Upgrades</p>
</li>
<li><p>Security patches</p>
</li>
</ul>
</li>
</ul>
<p><strong>Use case:</strong></p>
<ul>
<li><p>Learning <strong>production-like setup</strong></p>
</li>
<li><p>Lab environments for deep understanding</p>
</li>
<li><p>When you want <strong>full control</strong></p>
</li>
</ul>
<h2 id="heading-cloud-managed-kubernetes-eks-aks-gke"><strong>Cloud Managed Kubernetes (EKS, AKS, GKE)</strong></h2>
<p>Best for <strong>production</strong>.</p>
<ul>
<li><p>Here, cloud providers manage the <strong>Control Plane (master)</strong>.</p>
</li>
<li><p>You only manage <strong>Worker Nodes and Pods</strong>.</p>
</li>
<li><p>Example:</p>
<ul>
<li><p><strong>EKS</strong> = Amazon Elastic Kubernetes Service</p>
</li>
<li><p><strong>AKS</strong> = Azure Kubernetes Service</p>
</li>
<li><p><strong>GKE</strong> = Google Kubernetes Engine</p>
</li>
</ul>
</li>
<li><p>Provider handles:</p>
<ul>
<li><p>Control Plane HA &amp; upgrades</p>
</li>
<li><p>etcd database backups</p>
</li>
<li><p>API server scaling</p>
</li>
</ul>
</li>
<li><p>You handle:</p>
<ul>
<li><p>Worker nodes (sometimes even these can be auto-managed)</p>
</li>
<li><p>Deployments, Services, Ingress, monitoring</p>
</li>
</ul>
</li>
</ul>
<p><strong>Use case:</strong></p>
<ul>
<li><p>Enterprise production clusters</p>
</li>
<li><p>High availability, scalability, security</p>
</li>
<li><p>Teams who don’t want to babysit the Control Plane</p>
</li>
</ul>
<h2 id="heading-how-to-implement-kubeadm-on-your-cloudlocal">How to implement kubeadm on your cloud/local</h2>
<p>Just open any cloud provider you use whether it maybe AWS/Azure/GCP be it anything, All you need to do is Just launch 3 Virtual Machines, In those 3 three machines one should be bigger and the rest should be smaller in configuration wise, The bigger one will be used for Master machine and the rest two will be used for node machines</p>
<p>In <strong>Master machine</strong> you need to setup the following things</p>
<ol>
<li><p><strong>Root User Validation</strong> – Ensures the script runs as root.</p>
</li>
<li><p><strong>Swap Disable</strong> – Disable swap (K8s requirement).</p>
</li>
<li><p><strong>Kernel Modules</strong> – Load <code>overlay</code> and <code>br_netfilter</code>.</p>
</li>
<li><p><strong>Sysctl Configuration</strong> – Enable packet forwarding and bridge network rules.</p>
</li>
<li><p><strong>Containerd Installation</strong> – Set <code>SystemdCgroup = true</code> for Kubernetes compatibility.</p>
</li>
<li><p><strong>Kubernetes Installation</strong> – Install <code>kubeadm</code>, <code>kubelet</code>, and <code>kubectl</code>.</p>
</li>
<li><p><strong>Cluster Initialization</strong> – Run <code>kubeadm init</code>.</p>
</li>
<li><p><strong>Kubeconfig Setup</strong> – Configure kubeconfig for both root and a non-root user (default: <code>ubuntu</code>).</p>
</li>
<li><p><strong>CNI Installation</strong> – Install Weave Net for pod networking.</p>
</li>
<li><p><strong>Join Command Display</strong> – Print the command for workers to join the cluster.</p>
</li>
</ol>
<p>In <strong>Node machine</strong> you need to do the following things</p>
<ol>
<li><p><strong>Root User Check</strong></p>
</li>
<li><p><strong>Swap Disable</strong></p>
</li>
<li><p><strong>Kernel Modules Load</strong></p>
</li>
<li><p><strong>Sysctl Setup</strong></p>
</li>
<li><p><strong>Containerd Installation</strong></p>
</li>
<li><p><strong>Kubernetes Installation</strong></p>
</li>
<li><p><strong>Join Cluster</strong> – Use the join command from the master node output.</p>
</li>
</ol>
<p>You don’t need to worry about doing all these manually, There is a <a target="_blank" href="https://github.com/jaya-vardhan-9/K8-s-Architecture-Shell-Script">repository</a> named <a target="_blank" href="https://github.com/jaya-vardhan-9/K8-s-Architecture-Shell-Script"><strong>K8-s-Architecture-Shell-Script</strong></a> in my <a target="_blank" href="https://github.com/jaya-vardhan-9/">Github</a> where you can see the shell script and see the required instructions to be follow and setup your first k8s cluster</p>
]]></content:encoded></item><item><title><![CDATA[Kuberenetes(k8s) Architecture]]></title><description><![CDATA[Before you deep dive into the article go visit docker first !
Kubernetes is just an orchestrator of containers, If you don’t know what are containers, you might feel nothing
With Docker you learn:

How to package an app into a container (Dockerfile)....]]></description><link>https://blog.jaivardhan.online/k8s-architecture</link><guid isPermaLink="true">https://blog.jaivardhan.online/k8s-architecture</guid><category><![CDATA[Kubernetes]]></category><category><![CDATA[Devops]]></category><category><![CDATA[k8s]]></category><category><![CDATA[CI/CD]]></category><category><![CDATA[containerization]]></category><category><![CDATA[automation]]></category><category><![CDATA[Microservices]]></category><category><![CDATA[#IaC]]></category><category><![CDATA[GitHub]]></category><category><![CDATA[Git]]></category><category><![CDATA[Docker]]></category><category><![CDATA[Jenkins]]></category><category><![CDATA[Helm]]></category><category><![CDATA[#prometheus]]></category><category><![CDATA[ArgoCD]]></category><dc:creator><![CDATA[Jai Vardhan Narayana]]></dc:creator><pubDate>Tue, 19 Aug 2025 11:51:15 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1755602288636/ce24815a-73b2-4768-b0bf-dfba19c505b3.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Before you deep dive into the article go visit docker first !</p>
<p>Kubernetes is just an orchestrator of containers, If you don’t know what are containers, you might feel nothing</p>
<p>With Docker you learn:</p>
<ul>
<li><p>How to package an app into a container (<code>Dockerfile</code>).</p>
</li>
<li><p>How to run and manage containers (<code>docker run</code>, <code>docker ps</code>, <code>docker exec</code>).</p>
</li>
<li><p>How to expose ports, map volumes, and define multiple services (<code>docker-compose</code>).</p>
</li>
</ul>
<p>Once you’re comfortable with that, you’re ready to explore how Kubernetes scales this idea to hundreds or thousands of containers running across many machines.</p>
<h2 id="heading-what-is-kubernetes">What is Kubernetes?</h2>
<p>Kubernetes (often called <strong>K8s</strong>) is a <strong>container orchestration platform</strong>.</p>
<p>It answers real-world questions like:</p>
<ul>
<li><p>How do I run containers across multiple machines?</p>
</li>
<li><p>How do I restart containers automatically if they fail?</p>
</li>
<li><p>How do I balance traffic between multiple container replicas?</p>
</li>
<li><p>How do I update apps without downtime?</p>
</li>
</ul>
<p>In short: <strong>Docker runs containers, Kubernetes manages them at scale.</strong></p>
<h2 id="heading-kubernetes-architecture-deep-dive">🏛 Kubernetes Architecture (Deep Dive)</h2>
<p>Let’s break the architecture into <strong>two sides</strong>:</p>
<ul>
<li><p><strong>Control Plane</strong> → the brain of the cluster</p>
</li>
<li><p><strong>Worker Nodes/Nodes</strong> → the muscle that actually runs your containers in the form of Pods which are controlled by Control Place/Master Machine</p>
</li>
</ul>
<hr />
<h2 id="heading-pod-the-smallest-unit">Pod — The Smallest Unit</h2>
<ul>
<li><p>A <strong>Pod</strong> is the smallest deployable object in Kubernetes.</p>
</li>
<li><p>Think of a pod as a <strong>wrapper around one or more containers</strong>.</p>
</li>
<li><p>Every pod gets:</p>
<ul>
<li><p>A <strong>unique IP address</strong> in the cluster.</p>
</li>
<li><p>Optionally shared <strong>storage volumes</strong>.</p>
</li>
<li><p>Shared lifecycle (if pod dies, all containers inside die).</p>
</li>
</ul>
</li>
</ul>
<p>Example:<br />If you deploy an app in Tomcat container , then that container here can be referred to as pod, Most of the pods contains single container and at some times there might be multiple containers in a single pod</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755602672288/bf618054-00a4-4e0a-898c-cd08b075463b.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-node-the-worker-machine">Node — The Worker Machine</h2>
<ul>
<li><p>A <strong>Node</strong> is a physical or virtual machine in your cluster, like a VM in local cloud, or an EC2 instance in AWS or a Azure VM in Azure</p>
</li>
<li><p>It runs <strong>pods</strong> assigned by the control plane(Master Machine).</p>
</li>
<li><p>Each Node has three main components:</p>
<ul>
<li><p><strong>Kubelet</strong> → agent that talks to control plane and manages pods(receives instruction from Master Machine and implement them in Nodes)</p>
</li>
<li><p><strong>Container Runtime</strong> (Docker, containerd, CRI-O) → actually runs the containers.</p>
</li>
<li><p><strong>Kube-proxy</strong> → handles pod-to-pod networking and load balancing.</p>
</li>
</ul>
</li>
</ul>
<p>Example:<br />A Node could run 5 Nginx pods + 3 Redis pods.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755602771977/599421a0-e430-4573-b658-340b2fb45960.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-cluster-group-of-nodes">Cluster — Group of Nodes</h2>
<ul>
<li><p>A <strong>Cluster</strong> = control plane + worker nodes.</p>
</li>
<li><p>From your perspective, you don’t care which specific machine your app runs on — you just tell Kubernetes “I want 5 replicas” and the cluster ensures it happens.</p>
</li>
</ul>
<p>Example:<br />Your cluster may have 3 Nodes. Kubernetes decides how to spread 10 Pods across them.</p>
<h2 id="heading-control-plane-the-brain">Control Plane — The Brain</h2>
<p>The <strong>Control Plane</strong> makes global decisions about the cluster. It ensures the actual state matches your desired state.</p>
<p>Components of the control plane:</p>
<ul>
<li><p><strong>API Server</strong></p>
<ul>
<li><p>The front door.</p>
</li>
<li><p>Every request (<code>kubectl apply</code>, <code>kubectl get pods</code>) goes here.</p>
</li>
<li><p>Exposes Kubernetes API.</p>
</li>
</ul>
</li>
<li><p><strong>etcd</strong></p>
<ul>
<li><p>A distributed key-value store.</p>
</li>
<li><p>Stores the cluster’s state (which pods exist, which nodes are alive, configs, etc.).</p>
</li>
</ul>
</li>
<li><p><strong>Scheduler</strong></p>
<ul>
<li><p>Decides where new Pods should run.</p>
</li>
<li><p>Example: If Node A is overloaded, it sends new Pods to Node B.</p>
</li>
</ul>
</li>
<li><p><strong>Controller Manager</strong></p>
<ul>
<li><p>Ensures the cluster state matches what you declared.</p>
</li>
<li><p>Example: If you said “3 replicas” and 1 pod dies, the controller recreates it.</p>
</li>
</ul>
</li>
</ul>
<p>Together, these components form the <strong>city government</strong> of Kubernetes, while worker nodes are the <strong>buildings</strong> running your workloads.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755603022608/4647fc68-c09e-43cc-830e-28aeb7c89c54.jpeg" alt="Whole k8s cluster describing k8s architecture" class="image--center mx-auto" /></p>
<h2 id="heading-namespace-logical-separation">Namespace — Logical Separation</h2>
<ul>
<li><p>A Namespace is like a folder inside your cluster. There will be multiple pods across multiple nodes so it is difficult to organise them, so namespace comes handy here</p>
</li>
<li><p>Helps organize resources (dev, staging, prod). You can distribute you pods across these namespaces</p>
</li>
<li><p>These namespaces are irrespective of nodes,</p>
</li>
<li><p>You create pods in the <code>dev</code> namespace asking for 4 pods of various application containers.</p>
<ul>
<li><p>Pod 1 → scheduled on <strong>Node 1</strong></p>
</li>
<li><p>Pod 2 → scheduled on <strong>Node 2</strong></p>
</li>
<li><p>Pod 3 → also on <strong>Node 2</strong></p>
</li>
<li><p>Pod 4 → back on <strong>Node 1</strong></p>
</li>
</ul>
</li>
</ul>
<p>    All 4 Pods belong to the <strong>dev namespace</strong>, but they are spread across multiple Nodes.</p>
]]></content:encoded></item><item><title><![CDATA[How Docker Containers Really Talk to Each Other with Networks : My First Real DevOps Lesson]]></title><description><![CDATA[When I started learning Docker with a simple Spring Boot + MongoDB project, the tutor gave us two commands:
# Run the Spring Boot app
docker run -d -p 8080:8080 --name springapp \
  --network jionetwork \
  -e MONGO_DB_HOSTNAME=mongo \
  -e MONGO_DB_...]]></description><link>https://blog.jaivardhan.online/docker-networks-00</link><guid isPermaLink="true">https://blog.jaivardhan.online/docker-networks-00</guid><category><![CDATA[Docker]]></category><category><![CDATA[docker images]]></category><category><![CDATA[docker-network]]></category><category><![CDATA[Devops]]></category><category><![CDATA[DevOps Journey]]></category><dc:creator><![CDATA[Jai Vardhan Narayana]]></dc:creator><pubDate>Sun, 17 Aug 2025 16:21:56 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1755481665281/420fb1ed-9928-48b8-8372-4d403f16dcd1.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>When I started learning Docker with a simple <strong>Spring Boot + MongoDB</strong> project, the tutor gave us two commands:</p>
<pre><code class="lang-bash"><span class="hljs-comment"># Run the Spring Boot app</span>
docker run -d -p 8080:8080 --name springapp \
  --network jionetwork \
  -e MONGO_DB_HOSTNAME=mongo \
  -e MONGO_DB_USERNAME=devdb \
  -e MONGO_DB_PASSWORD=dev@123 \
  kkdevopsb5/springwebapp:1.0.0

<span class="hljs-comment"># Run the MongoDB database</span>
docker run -d --name mongo \
  --network jionetwork \
  -e MONGO_INITDB_ROOT_USERNAME=devdb \
  -e MONGO_INITDB_ROOT_PASSWORD=dev@123 \
  mongo
</code></pre>
<p>The app worked fine after running these. But inside my head, one big question popped up:</p>
<p>👉 <strong>Why exactly are we running these commands in this way?</strong><br />How did the Spring Boot container <em>know</em> that the <code>mongo</code> container is the database?</p>
<p>At first, I thought it was magic. Later, after some digging, it made complete sense. Let me share what I discovered.</p>
<hr />
<h2 id="heading-step-1-spring-boot-doesnt-hardcode-db-configs">Step 1: Spring Boot Doesn’t Hardcode DB Configs</h2>
<p>In the source code, I found this <code>application.yaml</code>:</p>
<pre><code class="lang-yaml"><span class="hljs-attr">spring:</span>
  <span class="hljs-attr">data:</span>
    <span class="hljs-attr">mongodb:</span>
      <span class="hljs-attr">host:</span> <span class="hljs-string">${MONGO_DB_HOSTNAME}</span>
      <span class="hljs-attr">port:</span> <span class="hljs-number">27017</span>
      <span class="hljs-attr">username:</span> <span class="hljs-string">${MONGO_DB_USERNAME}</span>
      <span class="hljs-attr">password:</span> <span class="hljs-string">${MONGO_DB_PASSWORD}</span>
      <span class="hljs-attr">database:</span> <span class="hljs-string">users</span>
      <span class="hljs-attr">authentication-database:</span> <span class="hljs-string">admin</span>
</code></pre>
<p>Notice the <code>${...}</code> placeholders.<br />Spring Boot expects <strong>environment variables</strong> to fill these values at runtime.</p>
<p>That’s why the tutor passed:</p>
<ul>
<li><p><code>-e MONGO_DB_HOSTNAME=mongo</code></p>
</li>
<li><p><code>-e MONGO_DB_USERNAME=devdb</code></p>
</li>
<li><p><code>-e MONGO_DB_PASSWORD=dev@123</code></p>
</li>
</ul>
<p>Without these, the app wouldn’t know where the database lives or how to log in.</p>
<p>👉 <strong>Learning point</strong>: As DevOps, our job is not to code the app, but to <em>read the config files</em> (like <code>application.yaml</code>) and know what environment variables the app expects.</p>
<hr />
<h2 id="heading-step-2-why-mongo-instead-of-an-ip-address">Step 2: Why <code>mongo</code> Instead of an IP Address?</h2>
<p>This is where <strong>Docker networks</strong> come in.<br />Both containers were attached to the same custom network <code>jionetwork</code>.</p>
<p>In Docker, when you create a custom network:</p>
<ul>
<li><p>Every container in that network can talk to others <strong>by name</strong>, not IP.</p>
</li>
<li><p>Docker runs an internal DNS resolver that maps names → container IPs.</p>
</li>
</ul>
<p>So when Spring Boot tries to connect to <code>mongo:27017</code>, Docker resolves <code>mongo</code> to the real container IP behind the scenes.</p>
<h3 id="heading-analogy-calling-a-friend">Analogy: Calling a Friend</h3>
<p>Think of it like calling a friend:</p>
<ul>
<li><p>Without Docker network → you must remember your friend’s phone number (IP address).</p>
</li>
<li><p>With Docker network → you just say their <strong>name</strong> (e.g., “Call <em>mongo</em>”), and your phone (Docker DNS) automatically finds the correct number.</p>
</li>
</ul>
<p>This makes things stable: even if MongoDB container restarts and gets a new IP, the name <code>mongo</code> still works.</p>
<p><strong>Learning point</strong>: The whole purpose of Docker networks is to allow containers to communicate using <strong>names instead of IPs</strong>.</p>
<hr />
<h2 id="heading-step-3-separation-of-build-vs-runtime">Step 3: Separation of Build vs Runtime</h2>
<p>Another thing that confused me:<br />“Why doesn’t the Dockerfile mention Mongo anywhere?”</p>
<p>Then I realized:</p>
<ul>
<li><p><strong>Dockerfile</strong> = build instructions (package the JAR, set workdir, expose port)</p>
</li>
<li><p><strong>docker run with -e</strong> = runtime instructions (which DB host, which credentials)</p>
</li>
</ul>
<p>This separation is good practice. It means the same app image can be reused for:</p>
<ul>
<li><p>Local environment → maybe DB host = <a target="_blank" href="http://localhost"><code>localhost</code></a></p>
</li>
<li><p>Staging → DB host = <code>mongo-staging</code></p>
</li>
<li><p>Production → DB host = <code>mongo-prod</code></p>
</li>
</ul>
<p>All without rebuilding the image.</p>
<hr />
<h2 id="heading-what-i-wish-i-knew-earlier">What I Wish I Knew Earlier</h2>
<ul>
<li><p>Every framework has its own config system:</p>
<ul>
<li><p>Spring Boot → <code>application.yaml</code></p>
</li>
<li><p>Node.js → <code>.env</code></p>
</li>
<li><p>Python Django/Flask → <a target="_blank" href="http://settings.py"><code>settings.py</code></a> or <code>.env</code></p>
</li>
</ul>
</li>
<li><p>As DevOps, you don’t need to write app logic, but you must know <strong>where to look for DB configs, ports, and credentials</strong>.</p>
</li>
<li><p>Docker custom networks give you <strong>name-based communication</strong>, powered by Docker’s built-in DNS.</p>
</li>
</ul>
<hr />
<h2 id="heading-final-takeaway">Final Takeaway</h2>
<p>At first, I thought my tutor skipped details. But later I realized this is <strong>real-world learning</strong>:<br />In companies, no one explains every line. You get a repo and some commands, and it’s your job to <strong>retrospect</strong> and figure out:</p>
<ul>
<li><p>Why these environment variables?</p>
</li>
<li><p>How do containers find each other?</p>
</li>
<li><p>What’s handled at build time vs runtime?</p>
</li>
</ul>
<p>And that reflection — the “why” behind the command — is what transforms you from just running Docker to actually understanding DevOps.</p>
<hr />
<p><strong>Tip for beginners like me</strong>:<br />Whenever you see <code>docker run</code> with <code>-e</code> flags, pause and check the app’s config files.<br />That’s where the missing link hides — and once you see it, the whole flow makes sense.</p>
<hr />
<p>✨ That’s the story of how I learned that <code>docker run</code> isn’t just about starting a container — it’s about passing the right environment and letting Docker networking + DNS do the magic.</p>
<hr />
]]></content:encoded></item><item><title><![CDATA[Install SonarQube  RIGHT NOW !!]]></title><description><![CDATA[Prerequisites
You have a fresh Ubuntu instance (e.g., 22.04).  
You have sudo access as your normal user.
Step 1: Install required software
sudo apt update
sudo apt install openjdk-17-jdk wget unzip ntp -y
Why:

openjdk-17-jdk → Java 17, required by ...]]></description><link>https://blog.jaivardhan.online/install-sonarqube-right-now</link><guid isPermaLink="true">https://blog.jaivardhan.online/install-sonarqube-right-now</guid><category><![CDATA[Linux]]></category><category><![CDATA[Devops]]></category><category><![CDATA[DevSecOps]]></category><category><![CDATA[Programming Blogs]]></category><category><![CDATA[Programming Tips]]></category><dc:creator><![CDATA[Jai Vardhan Narayana]]></dc:creator><pubDate>Thu, 03 Jul 2025 06:52:38 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1751524986560/54c6727d-0bc4-4ca9-a042-364e2326178e.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-prerequisites"><strong>Prerequisites</strong></h2>
<p>You have a fresh Ubuntu instance (e.g., 22.04).  </p>
<p>You have sudo access as your normal user.</p>
<h2 id="heading-step-1-install-required-software"><strong>Step 1: Install required software</strong></h2>
<p><code>sudo apt update</code></p>
<p><code>sudo apt install openjdk-17-jdk wget unzip ntp -y</code></p>
<p><strong>Why:</strong></p>
<ul>
<li><p>openjdk-17-jdk → Java 17, required by SonarQube.</p>
</li>
<li><p>wget → to download SonarQube.</p>
</li>
<li><p>unzip → to extract the .zip.</p>
</li>
<li><p>ntp → keeps system clock synced (very important for token expiry, JWT, Elasticsearch timing).</p>
</li>
</ul>
<h2 id="heading-step-2-find-and-confirm-java-path-javahome"><strong>Step 2: Find and confirm Java path (JAVA_HOME)</strong></h2>
<p><strong>Find which Java was installed:</strong></p>
<p><code>update-java-alternatives -l</code></p>
<p>Output looks like:</p>
<p>java-1.17.0-openjdk-amd64 1711 /usr/lib/jvm/java-1.17.0-openjdk-amd64</p>
<p><strong>Use the part /usr/lib/jvm/java-1.17.0-openjdk-amd64 as JAVA_HOME.</strong></p>
<p><em>(In most Ubuntu systems installed from apt, it usually is /usr/lib/jvm/java-17-openjdk-amd64.)</em></p>
<p><strong>Verify Java works:</strong></p>
<p><code>java -version</code></p>
<p>Should show:</p>
<p>openjdk version "17.x.x"</p>
<h2 id="heading-step-3-create-a-dedicated-sonar-user"><strong>Step 3: Create a dedicated sonar user</strong></h2>
<p><code>sudo useradd -m -d /opt/sonarqube -U -r -s /bin/bash sonar</code></p>
<p><strong>Why:</strong></p>
<table><tbody><tr><td><p><strong>Command/Option</strong></p></td><td><p><strong>Meaning</strong></p></td></tr><tr><td><p>useradd</p></td><td><p>create a new user</p></td></tr><tr><td><p>-m</p></td><td><p>create home directory</p></td></tr><tr><td><p>-d /opt/sonarqube</p></td><td><p>set /opt/sonarqube as home directory</p></td></tr><tr><td><p>-U</p></td><td><p>create a group named sonar</p></td></tr><tr><td><p>-r</p></td><td><p>make this a system user (non-login user usually, but we’ll give shell)</p></td></tr><tr><td><p>-s /bin/bash</p></td><td><p>assign Bash shell (so we can log in)</p></td></tr></tbody></table>

<hr />
<h2 id="heading-step-4-give-sonar-user-sudo-access-without-password"><strong>Step 4: Give sonar user sudo access without password</strong></h2>
<p><code>sudo visudo</code></p>
<p>At the end of the file, add:</p>
<p>sonar ALL=(ALL) NOPASSWD:ALL</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1751524412166/c817f39c-2063-4616-82b0-ca2d65935847.png" alt class="image--center mx-auto" /></p>
<p><strong>Why:</strong></p>
<ul>
<li><p>Allows sonar user to run <strong>any sudo command</strong> on any host.</p>
</li>
<li><p>NOPASSWD → no password prompt.<br />  <em>(handy in dev; risky in prod).</em></p>
</li>
</ul>
<h2 id="heading-step-5-download-and-extract-sonarqube"><strong>Step 5: Download and extract SonarQube</strong></h2>
<p><code>cd /opt</code></p>
<p><code>sudo wget</code> <a target="_blank" href="https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-10.6.0.8109.zip"><code>https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-10.6.0.8109.zip</code></a></p>
<p><code>sudo unzip</code> <a target="_blank" href="http://sonarqube-10.6.0.8109.zip"><code>sonarqube-10.6.0.8109.zip</code></a></p>
<p><code>sudo mv sonarqube-10.6.0.8109/* /opt/sonarqube/</code></p>
<p><strong>Why:</strong></p>
<ul>
<li><p>/opt is standard for optional/3rd party apps.</p>
</li>
<li><p>We move everything into /opt/sonarqube so it’s clean.</p>
</li>
</ul>
<h2 id="heading-step-6-change-ownership-to-sonar-user"><strong>Step 6: Change ownership to sonar user</strong></h2>
<p><code>sudo chown -R sonar:sonar /opt/sonarqube</code></p>
<p><strong>Why:</strong></p>
<ul>
<li><p>Make sure sonar user can read/write all files.</p>
</li>
<li><p>-R → recursive.</p>
</li>
</ul>
<h2 id="heading-step-7-configure-javahome-and-path-for-sonar-user"><strong>Step 7: Configure JAVA_HOME and PATH for sonar user</strong></h2>
<p>Switch to sonar user:</p>
<p><code>sudo su - sonar</code></p>
<p>Edit .bashrc:</p>
<p><code>echo 'export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64' &gt;&gt; ~/.bashrc</code></p>
<p><code>echo 'export PATH=$JAVA_HOME/bin:$PATH' &gt;&gt; ~/.bashrc</code>  </p>
<p>Then apply immediately:</p>
<p><code>source ~/.bashrc</code></p>
<p><strong>Why:</strong></p>
<ul>
<li><p>SonarQube scripts use Java.</p>
</li>
<li><p>sonar user must know where Java is installed.</p>
</li>
</ul>
<p><strong>Verify:</strong></p>
<p>java -version</p>
<h2 id="heading-step-8-set-kernel-and-system-parameters-important"><strong>Step 8: Set kernel and system parameters (important)</strong></h2>
<p><strong>As your main sudo user (not sonar):</strong></p>
<h3 id="heading-81-increase-max-map-count-needed-by-elasticsearch-inside-sonarqube"><strong>8.1 Increase max map count (needed by Elasticsearch inside SonarQube):</strong></h3>
<p><code>sudo nano /etc/sysctl.conf</code></p>
<p>Add:</p>
<p><code>vm.max_map_count=262144</code></p>
<p><code>fs.file-max=65536</code></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1751524467945/34b18ae7-6ade-496f-9ee6-bab2f31a0654.png" alt class="image--center mx-auto" /></p>
<p>Apply:</p>
<p><code>sudo sysctl -p</code></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1751524509005/8ac0bf7d-ee75-49b7-be20-89108a88ca32.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-82-increase-user-limits-number-of-open-files-and-processes"><strong>8.2 Increase user limits (number of open files and processes):</strong></h3>
<p><code>sudo nano /etc/security/limits.conf</code></p>
<p>Add:</p>
<p><code>sonar   -   nofile   65536</code></p>
<p><code>sonar   -   nproc    4096</code></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1751524537707/7b3e90d6-be61-4956-84c3-f23d6b058bfe.png" alt class="image--center mx-auto" /></p>
<p><strong>Why:</strong></p>
<table><tbody><tr><td><p><strong>Setting</strong></p></td><td><p><strong>Why</strong></p></td></tr><tr><td><p>vm.max_map_count</p></td><td><p>Elasticsearch needs it; prevents memory map errors</p></td></tr><tr><td><p>fs.file-max</p></td><td><p>total max open files</p></td></tr><tr><td><p>nofile</p></td><td><p>max open files per user</p></td></tr><tr><td><p>nproc</p></td><td><p>max processes per user</p></td></tr></tbody></table>

<h2 id="heading-step-9-enable-and-start-ntp-time-sync"><strong>Step 9: Enable and start NTP (time sync)</strong></h2>
<p><strong>Why:</strong> Elasticsearch uses tokens with expiry; time drift can break login or cause cluster errors.</p>
<p><code>sudo systemctl enable ntp</code></p>
<p><code>sudo systemctl start ntp</code></p>
<p><code>timedatectl status</code></p>
<p>Make sure it says NTP synchronized: yes.(if you find some error and this line means just leave that error its due to some depreciated packages)</p>
<h2 id="heading-step-10-start-sonarqube"><strong>Step 10: Start SonarQube</strong></h2>
<p>Switch to sonar user:</p>
<p><code>sudo su - sonar</code></p>
<p>Start:</p>
<p><code>cd /opt/sonarqube/bin/linux-x86-64</code></p>
<p><code>./</code><a target="_blank" href="http://sonar.sh"><code>sonar.sh</code></a> <code>start</code></p>
<p><strong>Check status:</strong></p>
<p><code>./</code><a target="_blank" href="http://sonar.sh"><code>sonar.sh</code></a> <code>status</code></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1751524697313/46f2282d-7cb9-474e-a26b-316ee5c71873.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-step-11-access-sonarqube-ui"><strong>Step 11: Access SonarQube UI</strong></h2>
<ul>
<li>Open browser:</li>
</ul>
<p><code>http://&lt;your-server-ip&gt;:9000</code></p>
<p>Default login:</p>
<ul>
<li><p>Username: admin</p>
</li>
<li><p>Password: admin (you’ll be asked to change).</p>
<p>  <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1751524764073/13f4dfd4-89b7-4323-b634-0cabaa502887.png" alt class="image--center mx-auto" /></p>
<p>  After Successful Login It prompts you to change the default password, Change it and you are good to go !</p>
<p>  <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1751524930029/53973182-51d0-4ce1-87bc-f049a0e9ea86.png" alt class="image--center mx-auto" /></p>
</li>
</ul>
]]></content:encoded></item></channel></rss>