<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Krisha Arya</title>
    <description>The latest articles on Forem by Krisha Arya (@krisha_arya_55).</description>
    <link>https://forem.com/krisha_arya_55</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2029071%2F7a03a7eb-aa7a-4240-8c25-71c3437c04bb.jpg</url>
      <title>Forem: Krisha Arya</title>
      <link>https://forem.com/krisha_arya_55</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/krisha_arya_55"/>
    <language>en</language>
    <item>
      <title>Deploying NGINX on Minikube Using Helm</title>
      <dc:creator>Krisha Arya</dc:creator>
      <pubDate>Fri, 06 Feb 2026 19:50:00 +0000</pubDate>
      <link>https://forem.com/krisha_arya_55/deploying-nginx-on-minikube-using-helm-1lh3</link>
      <guid>https://forem.com/krisha_arya_55/deploying-nginx-on-minikube-using-helm-1lh3</guid>
      <description>&lt;h2&gt;
  
  
  Environment Details
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;OS: Windows 11&lt;/li&gt;
&lt;li&gt;Container Runtime: Docker Desktop (Linux containers)&lt;/li&gt;
&lt;li&gt;Kubernetes: Minikube&lt;/li&gt;
&lt;li&gt;Package Manager: Helm&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Objective
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Install Helm on Windows&lt;/li&gt;
&lt;li&gt;Start Minikube cluster&lt;/li&gt;
&lt;li&gt;Create a Helm chart&lt;/li&gt;
&lt;li&gt;Deploy NGINX using Helm&lt;/li&gt;
&lt;li&gt;Expose the application using NodePort&lt;/li&gt;
&lt;li&gt;Verify application internally and externally&lt;/li&gt;
&lt;li&gt;Understand why some commands fail and alternatives are used&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Installing Helm on Windows
&lt;/h2&gt;

&lt;p&gt;Helm is a &lt;strong&gt;package manager for Kubernetes&lt;/strong&gt;, used to deploy applications using reusable charts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Method 1: Install using Winget
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;winget&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Helm.Helm&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📌 &lt;strong&gt;Why this method?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Simplest and fastest&lt;/li&gt;
&lt;li&gt;Automatically adds Helm to PATH&lt;/li&gt;
&lt;li&gt;Recommended for beginners&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Method 2: Manual Installation (Alternative)
&lt;/h3&gt;

&lt;p&gt;Download Helm binary:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://get.helm.sh/helm-v4.1.0-windows-amd64.zip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Extract it and place in:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;C:\helm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add Helm to PATH:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;";C:\helm"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Verify Helm Installation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;helm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;version&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✔ Confirms Helm is installed and accessible&lt;/p&gt;

&lt;h2&gt;
  
  
  Starting Minikube Cluster
&lt;/h2&gt;

&lt;p&gt;Helm works &lt;strong&gt;on top of Kubernetes&lt;/strong&gt;, so Minikube must be running first.&lt;/p&gt;

&lt;h3&gt;
  
  
  Start Minikube
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;minikube&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;start&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--driver&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📌 &lt;strong&gt;Why Docker driver?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Best supported on Windows&lt;/li&gt;
&lt;li&gt;Lightweight and stable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Possible Errors are:&lt;br&gt;
1) Starting Minikube — Initial Failure&lt;br&gt;
❌ Command&lt;br&gt;
minikube start&lt;/p&gt;

&lt;p&gt;❌ Error&lt;br&gt;
PROVIDER_DOCKER_NOT_RUNNING&lt;br&gt;
deadline exceeded running "docker version"&lt;/p&gt;

&lt;p&gt;📌 Reason&lt;/p&gt;

&lt;p&gt;Minikube is configured to use the Docker driver, but:&lt;br&gt;
Docker Engine was not running.&lt;br&gt;
OR Docker context was incorrect.&lt;br&gt;
Minikube cannot create a Kubernetes cluster without Docker running.&lt;/p&gt;

&lt;p&gt;2) Fixing Docker Environment&lt;br&gt;
✅ Step 1: Remove incorrect Docker host variable&lt;br&gt;
Remove-Item Env:DOCKER_HOST&lt;/p&gt;

&lt;p&gt;📌 Why?&lt;br&gt;
Sometimes Docker tools inherit a stale DOCKER_HOST variable, which breaks communication with Docker Desktop.&lt;/p&gt;

&lt;p&gt;✅ Step 2: Verify variable is removed&lt;br&gt;
echo $Env:DOCKER_HOST&lt;/p&gt;

&lt;p&gt;Expected output:&lt;br&gt;
(empty)&lt;/p&gt;

&lt;p&gt;✅ Step 3: Switch Docker context&lt;br&gt;
docker context use desktop-linux&lt;/p&gt;

&lt;p&gt;📌 Why?&lt;br&gt;
Minikube on Windows requires Linux containers, not Windows containers.&lt;/p&gt;

&lt;p&gt;3) Pulling Kubernetes Images (Optional but Used Here)&lt;/p&gt;

&lt;p&gt;You manually pulled Kubernetes images:&lt;/p&gt;

&lt;p&gt;docker pull registry.k8s.io/kube-apiserver:v1.34.0&lt;br&gt;
docker pull registry.k8s.io/kube-controller-manager:v1.34.0&lt;br&gt;
docker pull registry.k8s.io/kube-scheduler:v1.34.0&lt;br&gt;
docker pull registry.k8s.io/kube-proxy:v1.34.0&lt;br&gt;
docker pull registry.k8s.io/coredns/coredns:v1.12.1&lt;br&gt;
docker pull registry.k8s.io/etcd:3.6.4-0&lt;br&gt;
docker pull registry.k8s.io/pause:3.10.1&lt;br&gt;
docker pull docker.io/kicbase/stable:v0.0.48&lt;/p&gt;

&lt;p&gt;📌 Why this was done&lt;/p&gt;

&lt;p&gt;Minikube had network trouble reaching registry.k8s.io&lt;br&gt;
Pre-pulling images avoids download failure inside the Minikube container&lt;/p&gt;
&lt;h3&gt;
  
  
  Check Cluster Status
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;kubectl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;get&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;nodes&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Expected:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;STATUS: Ready
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;4) Starting Minikube Successfully&lt;br&gt;
✅ Command Used&lt;br&gt;
minikube start --driver=docker --force&lt;/p&gt;

&lt;p&gt;📌 Why --force?&lt;/p&gt;

&lt;p&gt;Skips some validations&lt;br&gt;
Useful when Docker/network warnings exist&lt;br&gt;
Allows Minikube to fall back to alternative image sources&lt;/p&gt;
&lt;h2&gt;
  
  
  Creating a Helm Chart
&lt;/h2&gt;

&lt;p&gt;Helm charts provide a &lt;strong&gt;template-based way&lt;/strong&gt; to deploy applications.&lt;/p&gt;


&lt;h3&gt;
  
  
  Create Chart
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;helm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;create&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;my-first-chart&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;📌 &lt;strong&gt;What this does&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creates a complete application structure&lt;/li&gt;
&lt;li&gt;Includes Deployment, Service, and configuration templates&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Chart Structure
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my-first-chart/
├── charts/
├── templates/
├── Chart.yaml
├── values.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Editing &lt;code&gt;values.yaml&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;values.yaml&lt;/code&gt; contains &lt;strong&gt;default configuration values&lt;/strong&gt; for the chart.&lt;/p&gt;
&lt;h3&gt;
  
  
  ✅ Open file
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;notepad&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;values.yaml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  ✅ Replace content with below one.
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;replicaCount&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;

&lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;repository&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx&lt;/span&gt;
  &lt;span class="na"&gt;pullPolicy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;IfNotPresent&lt;/span&gt;
  &lt;span class="na"&gt;tag&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;latest"&lt;/span&gt;

&lt;span class="na"&gt;imagePullSecrets&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[]&lt;/span&gt;

&lt;span class="na"&gt;nameOverride&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;
&lt;span class="na"&gt;fullnameOverride&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;

&lt;span class="na"&gt;serviceAccount&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;create&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="na"&gt;automount&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="na"&gt;annotations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{}&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;

&lt;span class="na"&gt;podAnnotations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{}&lt;/span&gt;
&lt;span class="na"&gt;podLabels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{}&lt;/span&gt;

&lt;span class="na"&gt;podSecurityContext&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{}&lt;/span&gt;
&lt;span class="na"&gt;securityContext&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{}&lt;/span&gt;

&lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;NodePort&lt;/span&gt;
  &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;

&lt;span class="na"&gt;ingress&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
  &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;
  &lt;span class="na"&gt;annotations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{}&lt;/span&gt;
  &lt;span class="na"&gt;hosts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[]&lt;/span&gt;
  &lt;span class="na"&gt;tls&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[]&lt;/span&gt;

&lt;span class="c1"&gt;# THIS BLOCK FIXES YOUR ERROR&lt;/span&gt;
&lt;span class="na"&gt;httpRoute&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
  &lt;span class="na"&gt;annotations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{}&lt;/span&gt;
  &lt;span class="na"&gt;parentRefs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[]&lt;/span&gt;
  &lt;span class="na"&gt;hostnames&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[]&lt;/span&gt;
  &lt;span class="na"&gt;rules&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[]&lt;/span&gt;

&lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{}&lt;/span&gt;

&lt;span class="na"&gt;livenessProbe&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;httpGet&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/&lt;/span&gt;
    &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;http&lt;/span&gt;

&lt;span class="na"&gt;readinessProbe&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;httpGet&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/&lt;/span&gt;
    &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;http&lt;/span&gt;

&lt;span class="na"&gt;autoscaling&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
  &lt;span class="na"&gt;minReplicas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
  &lt;span class="na"&gt;maxReplicas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;
  &lt;span class="na"&gt;targetCPUUtilizationPercentage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;

&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[]&lt;/span&gt;
&lt;span class="na"&gt;volumeMounts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[]&lt;/span&gt;

&lt;span class="na"&gt;nodeSelector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{}&lt;/span&gt;
&lt;span class="na"&gt;tolerations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[]&lt;/span&gt;
&lt;span class="na"&gt;affinity&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;📌 &lt;strong&gt;Why NodePort?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Easy exposure in Minikube&lt;/li&gt;
&lt;li&gt;No Ingress needed initially&lt;/li&gt;
&lt;li&gt;Suitable for learning/testing&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Installing the Helm Chart
&lt;/h2&gt;
&lt;h3&gt;
  
  
  ✅ Install Command
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;helm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;nginx-release&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;📌 &lt;strong&gt;What happens&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Helm renders templates&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Kubernetes objects are created:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deployment&lt;/li&gt;
&lt;li&gt;Service&lt;/li&gt;
&lt;li&gt;Pod&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Verifying Deployment
&lt;/h2&gt;
&lt;h3&gt;
  
  
  🔍 Check Pods
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;kubectl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;get&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;pods&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Expected:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;STATUS: Running
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🔍 Check Service
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;kubectl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;get&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;svc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;nginx-release-my-first-chart&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TYPE: NodePort
PORT: 80:&amp;lt;nodePort&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Getting Node IP &amp;amp; NodePort (Manual Way)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;NODEIP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;kubectl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;get&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;nodes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-o&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;jsonpath&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"{.items[0].status.addresses[0].address}"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;NODEPORT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;kubectl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;get&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;svc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;nginx-release-my-first-chart&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-o&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;jsonpath&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"{.spec.ports[0].nodePort}"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://&lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;NODEIP&lt;/span&gt;&lt;span class="se"&gt;`:&lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;NODEPORT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📌 &lt;strong&gt;Why this is done&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;NodePort services are accessed via:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  http://&amp;lt;NodeIP&amp;gt;:&amp;lt;NodePort&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Internal Connectivity Test (From Inside Cluster)
&lt;/h2&gt;

&lt;p&gt;Possible errors are:&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ BusyBox Test (May Fail)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;kubectl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--rm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-it&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--image&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;busybox&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;wget&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-qO&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;nginx-release-my-first-chart&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;❌ Sometimes fails due to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Limited networking tools&lt;/li&gt;
&lt;li&gt;DNS issues in BusyBox&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ✅ Correct Alternative (Curl Image)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;kubectl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--rm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-it&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--image&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;curlimages/curl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--restart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;Never&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;curl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;http://nginx-release-my-first-chart&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✔ Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Welcome to nginx!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📌 &lt;strong&gt;Why curl image works&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Built specifically for HTTP testing&lt;/li&gt;
&lt;li&gt;Reliable DNS + networking&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Accessing Service Using Minikube (Recommended Way)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ✅ Command
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;minikube&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;nginx-release-my-first-chart&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📌 &lt;strong&gt;What this does&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automatically fetches NodePort&lt;/li&gt;
&lt;li&gt;Creates a tunnel (required for Docker driver on Windows)&lt;/li&gt;
&lt;li&gt;Opens browser with correct URL&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Summary of Errors &amp;amp; Fixes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Error&lt;/th&gt;
&lt;th&gt;Reason&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Docker not running&lt;/td&gt;
&lt;td&gt;Docker Desktop stopped&lt;/td&gt;
&lt;td&gt;Restart Docker&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BusyBox timeout&lt;/td&gt;
&lt;td&gt;Image limitations&lt;/td&gt;
&lt;td&gt;Use curl image&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PowerShell &lt;code&gt;--&lt;/code&gt; error&lt;/td&gt;
&lt;td&gt;Linux syntax used&lt;/td&gt;
&lt;td&gt;Use single-line command&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NodePort not opening&lt;/td&gt;
&lt;td&gt;Docker driver limitation&lt;/td&gt;
&lt;td&gt;Use &lt;code&gt;minikube service&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Key Learnings (Beginner Friendly)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Helm simplifies Kubernetes deployments&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;values.yaml&lt;/code&gt; controls app behavior&lt;/li&gt;
&lt;li&gt;NodePort is easiest exposure method in Minikube&lt;/li&gt;
&lt;li&gt;Docker driver needs tunnel for service access&lt;/li&gt;
&lt;li&gt;Not all test images behave the same&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;You successfully:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Installed Helm&lt;/li&gt;
&lt;li&gt;Created a Helm chart&lt;/li&gt;
&lt;li&gt;Deployed NGINX using Helm&lt;/li&gt;
&lt;li&gt;Exposed it via NodePort&lt;/li&gt;
&lt;li&gt;Verified access internally and externally&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Stay tuned for next kubernetes topic ! 😊&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>devops</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>EKS Cluster Setup, Deployment &amp; LoadBalancer Exposure (Using eksctl) in Kubernetes</title>
      <dc:creator>Krisha Arya</dc:creator>
      <pubDate>Tue, 03 Feb 2026 17:30:08 +0000</pubDate>
      <link>https://forem.com/krisha_arya_55/eks-cluster-setup-deployment-loadbalancer-exposure-using-eksctl-in-kubernetes-4k8b</link>
      <guid>https://forem.com/krisha_arya_55/eks-cluster-setup-deployment-loadbalancer-exposure-using-eksctl-in-kubernetes-4k8b</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;This practical demonstrates a &lt;strong&gt;complete end-to-end Kubernetes workflow on AWS EKS&lt;/strong&gt; using &lt;code&gt;eksctl&lt;/code&gt; from a &lt;strong&gt;Windows PowerShell environment&lt;/strong&gt;.&lt;br&gt;
The goal is to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a new EKS cluster&lt;/li&gt;
&lt;li&gt;Provision worker nodes&lt;/li&gt;
&lt;li&gt;Deploy applications on Kubernetes&lt;/li&gt;
&lt;li&gt;Expose the application to the outside world using a &lt;strong&gt;LoadBalancer&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Perform complete cleanup to avoid AWS charges&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This documentation is based on &lt;strong&gt;real execution logs and troubleshooting&lt;/strong&gt;, not theoretical steps.&lt;/p&gt;
&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Windows OS&lt;/li&gt;
&lt;li&gt;PowerShell&lt;/li&gt;
&lt;li&gt;AWS Account&lt;/li&gt;
&lt;li&gt;AWS CLI installed&lt;/li&gt;
&lt;li&gt;kubectl installed&lt;/li&gt;
&lt;li&gt;eksctl installed&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  STEP 1: Verify eksctl Installation
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;eksctl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;version&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0.221.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Confirms eksctl is installed and ready.&lt;/p&gt;

&lt;h2&gt;
  
  
  STEP 2: Configure AWS Credentials
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;aws&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;configure&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Entered details:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AWS Access Key ID&lt;/li&gt;
&lt;li&gt;AWS Secret Access Key&lt;/li&gt;
&lt;li&gt;Default region: &lt;code&gt;us-east-1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Output format: &lt;code&gt;json&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sure 👍 here’s a &lt;strong&gt;clear, step-by-step guide&lt;/strong&gt; to get &lt;strong&gt;AWS Access Key ID&lt;/strong&gt; and &lt;strong&gt;Secret Access Key&lt;/strong&gt; from the &lt;strong&gt;AWS Security (IAM) section&lt;/strong&gt;.&lt;br&gt;
This is &lt;strong&gt;exactly what you should write in documentation / practical files&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  🔐 How to Get AWS Access Key ID &amp;amp; Secret Access Key (IAM)
&lt;/h2&gt;
&lt;h2&gt;
  
  
  Login to AWS Console
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Go to 👉 &lt;a href="https://aws.amazon.com/console/" rel="noopener noreferrer"&gt;https://aws.amazon.com/console/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Sign in to the Console&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Login using your &lt;strong&gt;AWS root account&lt;/strong&gt; or &lt;strong&gt;IAM user&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  Open IAM (Security Service)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;In the AWS Console search bar, type &lt;strong&gt;IAM&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Open &lt;strong&gt;IAM – Identity and Access Management&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;👉 IAM is used to manage &lt;strong&gt;users, permissions, and access keys&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Go to Users
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;In the left sidebar, click &lt;strong&gt;Users&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click on your &lt;strong&gt;IAM User name&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;⚠️ &lt;strong&gt;Best practice:&lt;/strong&gt;&lt;br&gt;
Use an &lt;strong&gt;IAM user&lt;/strong&gt;, not the root account, for CLI access.&lt;/p&gt;
&lt;h2&gt;
  
  
  Open Security Credentials
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Inside the user page, go to the &lt;strong&gt;Security credentials&lt;/strong&gt; tab&lt;/li&gt;
&lt;li&gt;Scroll down to &lt;strong&gt;Access keys&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  Create Access Key
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Click &lt;strong&gt;Create access key&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Command Line Interface (CLI)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Check the confirmation box&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Next&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;(Optional) Add a tag&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Create access key&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  Copy Access Keys (VERY IMPORTANT)
&lt;/h2&gt;

&lt;p&gt;You will see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Access Key ID&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Secret Access Key&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;⚠️ &lt;strong&gt;IMPORTANT RULES&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Secret Access Key is shown &lt;strong&gt;ONLY ONCE&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Copy and store it safely&lt;/li&gt;
&lt;li&gt;If lost, you must create a &lt;strong&gt;new key&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Access Key ID     : AKIAxxxxxxxxxxxx
Secret Access Key : xxxxxxxxxxxxxxxxxxxxxxxxx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  STEP 3: Verify AWS Identity
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;aws&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sts&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;get-caller-identity&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"UserId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"198961699878"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Account"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"198961699878"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Arn"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"arn:aws:iam::198961699878:root"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Confirms AWS authentication is working.&lt;/p&gt;

&lt;h2&gt;
  
  
  STEP 4: Verify Configured Region
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;aws&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;configure&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;get&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;region&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;us-east-1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  STEP 5: Create EKS Cluster with Managed Node Group
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;eksctl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;create&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;cluster&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;--name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;my-cluster&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;--region&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;us-east-1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;--nodegroup-name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;standard-workers&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;--node-type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;t3.medium&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;--nodes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  What this does:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Creates an EKS cluster named &lt;code&gt;my-cluster&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Uses Kubernetes version &lt;code&gt;1.32&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Provisions &lt;strong&gt;3 EC2 worker nodes&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Installs core add-ons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;kube-proxy&lt;/li&gt;
&lt;li&gt;CoreDNS&lt;/li&gt;
&lt;li&gt;VPC CNI&lt;/li&gt;
&lt;li&gt;metrics-server&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;⏱️ Cluster creation took ~15 minutes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Final Status:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;EKS cluster "my-cluster" in "us-east-1" region is ready
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  STEP 6: Update kubeconfig for kubectl
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;aws&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;eks&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;update-kubeconfig&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;my-cluster&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--region&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;us-east-1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Added new context arn:aws:eks:us-east-1:198961799878:cluster/my-cluster
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  STEP 7: Verify Worker Nodes
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;kubectl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;get&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;nodes&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ip-192-168-21-14.ec2.internal   Ready
ip-192-168-28-52.ec2.internal   Ready
ip-192-168-49-76.ec2.internal   Ready
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ All worker nodes are in &lt;code&gt;Ready&lt;/code&gt; state.&lt;/p&gt;

&lt;h2&gt;
  
  
  STEP 8: Create ConfigMap (Application Configuration)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Initial PowerShell Multiline Error
&lt;/h3&gt;

&lt;p&gt;Linux-style &lt;code&gt;\&lt;/code&gt; caused parsing errors in PowerShell.&lt;/p&gt;

&lt;h3&gt;
  
  
  Correct Command (Single Line)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;kubectl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;create&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;configmap&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;app-config&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--from-literal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;APPENV&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;production&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--from-literal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;LOGLEVEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;configmap/app-config created
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Verify ConfigMap
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;kubectl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;get&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;configmap&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;kubectl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;describe&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;configmap&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;app-config&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  STEP 9: Create Pod Using ConfigMap
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Create YAML File
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;notepad&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;config-pod.yaml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;config-pod.yaml&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Pod&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;config-pod&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx&lt;/span&gt;
    &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;APPENV&lt;/span&gt;
      &lt;span class="na"&gt;valueFrom&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;configMapKeyRef&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app-config&lt;/span&gt;
          &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;APPENV&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Apply Pod
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;kubectl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;apply&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-f&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;config-pod.yaml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Verify Pod
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;kubectl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;get&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;pods&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;kubectl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;exec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-it&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;config-pod&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;printenv&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;APPENV&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;production
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  STEP 10: Create Deployment (Multiple Replicas)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Create Deployment YAML
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;notepad&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;nginx-deployment.yaml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;nginx-deployment.yaml&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apps/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deployment&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx-deployment&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;replicas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;matchLabels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx&lt;/span&gt;
  &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx&lt;/span&gt;
    &lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx&lt;/span&gt;
        &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx:1.25&lt;/span&gt;
        &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;containerPort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Apply Deployment
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;kubectl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;apply&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-f&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;nginx-deployment.yaml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Verify
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;kubectl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;get&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;deployments&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;kubectl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;get&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;pods&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  STEP 11: Expose Deployment Using LoadBalancer
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;kubectl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;expose&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;deployment&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;nginx-deployment&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;LoadBalancer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Verify Service
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;kubectl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;get&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;svc&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nginx-deployment   LoadBalancer   a26036e6e746042178d8b53a365c218b.us-east-1.elb.amazonaws.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ AWS Elastic Load Balancer was created automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  STEP 12: Cleanup Kubernetes Resources
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;kubectl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;delete&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;deployment&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;nginx-deployment&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;kubectl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;delete&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;svc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;nginx-deployment&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;kubectl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;delete&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;pod&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;config-pod&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;kubectl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;delete&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;configmap&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;app-config&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Verify Cleanup
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;kubectl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;get&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;all&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;service/kubernetes (default system service only)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  STEP 13: Delete EKS Cluster (MOST IMPORTANT)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;eksctl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;delete&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;cluster&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;my-cluster&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--region&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;us-east-1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  What this deletes:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Worker nodes&lt;/li&gt;
&lt;li&gt;EKS control plane&lt;/li&gt;
&lt;li&gt;Load balancers&lt;/li&gt;
&lt;li&gt;CloudFormation stacks&lt;/li&gt;
&lt;li&gt;Networking resources&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Final Status:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;all cluster resources were deleted
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;This practical successfully demonstrated:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;EKS cluster creation using &lt;code&gt;eksctl&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Managed worker node provisioning&lt;/li&gt;
&lt;li&gt;ConfigMap creation and usage&lt;/li&gt;
&lt;li&gt;Pod and Deployment lifecycle&lt;/li&gt;
&lt;li&gt;External access using LoadBalancer&lt;/li&gt;
&lt;li&gt;Complete and safe cleanup to avoid AWS charges&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Stay connected for next kubernetes tutorial! 😊&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>devops</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Manual Kubernetes Cluster Setup on AWS (kubeadm + Flannel)</title>
      <dc:creator>Krisha Arya</dc:creator>
      <pubDate>Tue, 03 Feb 2026 16:45:16 +0000</pubDate>
      <link>https://forem.com/krisha_arya_55/manual-kubernetes-cluster-setup-on-aws-kubeadm-flannel-4aoh</link>
      <guid>https://forem.com/krisha_arya_55/manual-kubernetes-cluster-setup-on-aws-kubeadm-flannel-4aoh</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Setting up a Kubernetes cluster manually is the best way to understand how Kubernetes works internally.&lt;br&gt;
In this guide, we set up a &lt;strong&gt;2-node Kubernetes cluster on AWS EC2&lt;/strong&gt;, where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One instance acts as the &lt;strong&gt;Master Node&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;One instance acts as a &lt;strong&gt;Worker Node&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This documentation is based on &lt;strong&gt;real troubleshooting&lt;/strong&gt;, not just ideal steps. It includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Correct setup steps&lt;/li&gt;
&lt;li&gt;Common beginner mistakes&lt;/li&gt;
&lt;li&gt;Real errors faced during setup&lt;/li&gt;
&lt;li&gt;Why those errors happened&lt;/li&gt;
&lt;li&gt;Exact commands used to fix them&lt;/li&gt;
&lt;li&gt;AWS Security Group configuration&lt;/li&gt;
&lt;li&gt;Final NGINX deployment and access&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By the end, you will have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A working Kubernetes cluster&lt;/li&gt;
&lt;li&gt;Clear understanding of &lt;strong&gt;pod networking&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Knowledge of &lt;strong&gt;CNI (Flannel)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Practical exposure to &lt;strong&gt;NodePort services&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Cluster Components
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Master Node&lt;/td&gt;
&lt;td&gt;Kubernetes control plane&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Worker Node&lt;/td&gt;
&lt;td&gt;Runs application pods&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Runtime&lt;/td&gt;
&lt;td&gt;containerd&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CNI&lt;/td&gt;
&lt;td&gt;Flannel (VXLAN)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Exposure&lt;/td&gt;
&lt;td&gt;NodePort&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h2&gt;
  
  
  🔹 STEP A: Create AWS EC2 Instances
&lt;/h2&gt;

&lt;p&gt;Create &lt;strong&gt;2 EC2 instances&lt;/strong&gt; in AWS.&lt;/p&gt;
&lt;h3&gt;
  
  
  Instance Details
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OS:&lt;/strong&gt; Ubuntu 22.04 / 24.04 LTS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instance Type:&lt;/strong&gt; t2.medium (minimum)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VPC/Subnet:&lt;/strong&gt; Same for both instances&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Key Pair:&lt;/strong&gt; &lt;code&gt;k8s.pem&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Instance Names
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Master Node:&lt;/strong&gt; &lt;code&gt;master-node&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Worker Node:&lt;/strong&gt; &lt;code&gt;worker-node-1&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  🔹 STEP B: Configure Security Group (IMPORTANT)
&lt;/h2&gt;

&lt;p&gt;Attach the &lt;strong&gt;same Security Group&lt;/strong&gt; to both instances.&lt;/p&gt;
&lt;h3&gt;
  
  
  Inbound Rules
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Protocol&lt;/th&gt;
&lt;th&gt;Port&lt;/th&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SSH&lt;/td&gt;
&lt;td&gt;TCP&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;Your IP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kubernetes API&lt;/td&gt;
&lt;td&gt;TCP&lt;/td&gt;
&lt;td&gt;6443&lt;/td&gt;
&lt;td&gt;VPC CIDR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NodePort&lt;/td&gt;
&lt;td&gt;TCP&lt;/td&gt;
&lt;td&gt;30080&lt;/td&gt;
&lt;td&gt;0.0.0.0/0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;⚠️ &lt;strong&gt;Without port 30080 open, NodePort will not work in the browser.&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  🔹 STEP C: Get Public IPs
&lt;/h2&gt;

&lt;p&gt;After instances start, note:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Master Public IP&lt;/li&gt;
&lt;li&gt;Worker Public IP&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Worker Node Public IP: 65.0.4.177
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔹 STEP D: Prepare SSH Key on Windows (PowerShell)
&lt;/h2&gt;

&lt;p&gt;Open &lt;strong&gt;PowerShell as Administrator&lt;/strong&gt; in the folder containing &lt;code&gt;k8s.pem&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fix permission issues (VERY IMPORTANT on Windows)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;icacls&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;k8s.pem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/inheritance:r&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;icacls&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;k8s.pem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/grant:r&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;USERNAME&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;:(R)"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This avoids:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bad permissions&lt;/li&gt;
&lt;li&gt;Permission denied (publickey)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔹 STEP E: SSH into EC2 Instances
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Connect to Master Node
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh &lt;span class="nt"&gt;-i&lt;/span&gt; k8s.pem ubuntu@&amp;lt;MASTER_PUBLIC_IP&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Connect to Worker Node
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh &lt;span class="nt"&gt;-i&lt;/span&gt; k8s.pem ubuntu@65.0.4.177
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 You are now inside the Linux terminal of your EC2 instance.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔹 STEP F: Verify Connection
&lt;/h2&gt;

&lt;p&gt;Run on &lt;strong&gt;both nodes&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;whoami
hostname&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Expected Output
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ubuntu
master-node / worker-node-1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  STEP 1: Set Hostnames &amp;amp; Hosts File
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Master Node
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;hostnamectl set-hostname master-node
&lt;span class="nb"&gt;hostname&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Worker Node
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;hostnamectl set-hostname worker-node-1
&lt;span class="nb"&gt;hostname&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Update &lt;code&gt;/etc/hosts&lt;/code&gt; on BOTH nodes
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/hosts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;172.31.xx.xx master-node
172.31.yy.yy worker-node-1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  STEP 2: Disable Swap &amp;amp; Enable Kernel Networking
&lt;/h2&gt;

&lt;p&gt;Run on &lt;strong&gt;BOTH nodes&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Disable Swap
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;swapoff &lt;span class="nt"&gt;-a&lt;/span&gt;
&lt;span class="nb"&gt;sudo sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'/ swap / s/^/#/'&lt;/span&gt; /etc/fstab
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Load Required Kernel Modules
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;modprobe overlay
&lt;span class="nb"&gt;sudo &lt;/span&gt;modprobe br_netfilter
&lt;span class="nb"&gt;sudo &lt;/span&gt;modprobe vxlan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Persist Modules
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt; | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
vxlan
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Enable sysctl Settings
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt; | sudo tee /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;sysctl &lt;span class="nt"&gt;--system&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  STEP 3: Install containerd Runtime
&lt;/h2&gt;

&lt;p&gt;Run on &lt;strong&gt;BOTH nodes&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; containerd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Generate Default Config
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /etc/containerd
containerd config default | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /etc/containerd/config.toml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Enable systemd Cgroup
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'s/SystemdCgroup = false/SystemdCgroup = true/'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
/etc/containerd/config.toml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Restart &amp;amp; Enable
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart containerd
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;containerd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  STEP 4: Install Kubernetes Components
&lt;/h2&gt;

&lt;p&gt;Run on &lt;strong&gt;BOTH nodes&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; apt-transport-https ca-certificates curl gpg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Add Kubernetes Repository
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;gpg &lt;span class="nt"&gt;--dearmor&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /etc/apt/keyrings/kubernetes-apt-keyring.gpg

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /"&lt;/span&gt; | &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nb"&gt;sudo tee&lt;/span&gt; /etc/apt/sources.list.d/kubernetes.list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Install Components
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; kubelet kubeadm kubectl
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-mark hold kubelet kubeadm kubectl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  STEP 5: Initialize Master Node
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;kubeadm init &lt;span class="nt"&gt;--pod-network-cidr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;10.244.0.0/16
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note: Above IP is fixed. Use same IP.&lt;/p&gt;

&lt;h2&gt;
  
  
  STEP 6: Configure kubectl (Master Node)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="nv"&gt;$HOME&lt;/span&gt;/.kube
&lt;span class="nb"&gt;sudo cp&lt;/span&gt; /etc/kubernetes/admin.conf &lt;span class="nv"&gt;$HOME&lt;/span&gt;/.kube/config
&lt;span class="nb"&gt;sudo chown&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;:&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;$HOME&lt;/span&gt;/.kube/config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  STEP 7: Install Flannel CNI
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Initial Confusion
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get pods &lt;span class="nt"&gt;-n&lt;/span&gt; kube-system | &lt;span class="nb"&gt;grep &lt;/span&gt;flannel
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;➡️ Output was empty (Flannel does &lt;strong&gt;not&lt;/strong&gt; run in kube-system)&lt;/p&gt;

&lt;h3&gt;
  
  
  Correct Installation Command
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Correct Namespace Check
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get ds &lt;span class="nt"&gt;-n&lt;/span&gt; kube-flannel
kubectl get pods &lt;span class="nt"&gt;-n&lt;/span&gt; kube-flannel
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ❌ Errors Faced &amp;amp; How They Were Fixed
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ❌ Error 1: Flannel CrashLoopBackOff
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Cause&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;br_netfilter&lt;/code&gt; not loaded&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;vxlan&lt;/code&gt; missing&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/proc/sys/net/bridge&lt;/code&gt; not present&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Fix&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;modprobe br_netfilter
&lt;span class="nb"&gt;sudo &lt;/span&gt;modprobe vxlan
lsmod | egrep &lt;span class="s1"&gt;'vxlan|br_netfilter'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  ❌ Error 2: sysctl bridge error
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cannot stat /proc/sys/net/bridge/bridge-nf-call-iptables
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Cause&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;br_netfilter&lt;/code&gt; not loaded on worker&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Fix (Worker Node)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;modprobe br_netfilter
&lt;span class="nb"&gt;sudo &lt;/span&gt;sysctl &lt;span class="nt"&gt;-w&lt;/span&gt; net.bridge.bridge-nf-call-iptables&lt;span class="o"&gt;=&lt;/span&gt;1
&lt;span class="nb"&gt;sudo &lt;/span&gt;sysctl &lt;span class="nt"&gt;-w&lt;/span&gt; net.bridge.bridge-nf-call-ip6tables&lt;span class="o"&gt;=&lt;/span&gt;1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Persist Settings&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt; | sudo tee /etc/sysctl.d/99-kubernetes.conf
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;sysctl &lt;span class="nt"&gt;--system&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  ❌ Error 3: CoreDNS stuck in ContainerCreating
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Cause&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Flannel networking not ready&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Fix&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl delete pod &lt;span class="nt"&gt;-n&lt;/span&gt; kube-flannel &lt;span class="nt"&gt;-l&lt;/span&gt; &lt;span class="nv"&gt;app&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;flannel
kubectl get pods &lt;span class="nt"&gt;-n&lt;/span&gt; kube-flannel
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once Flannel became &lt;code&gt;Running&lt;/code&gt;, &lt;strong&gt;CoreDNS automatically turned Running&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  STEP 8: Join Worker Node
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;kubeadm &lt;span class="nb"&gt;join&lt;/span&gt; &amp;lt;MASTER-IP&amp;gt;:6443 &lt;span class="nt"&gt;--token&lt;/span&gt; &amp;lt;TOKEN&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--discovery-token-ca-cert-hash&lt;/span&gt; sha256:&amp;lt;HASH&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  STEP 9: Validate Cluster
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get nodes
kubectl get pods &lt;span class="nt"&gt;-n&lt;/span&gt; kube-system
kubectl get pods &lt;span class="nt"&gt;-n&lt;/span&gt; kube-flannel
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All components must be &lt;strong&gt;Running&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Deploy NGINX Application
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;nginx-deployment.yaml&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apps/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deployment&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx-deploy&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;replicas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;matchLabels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx&lt;/span&gt;
  &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx&lt;/span&gt;
    &lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx&lt;/span&gt;
        &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx:latest&lt;/span&gt;
        &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;containerPort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; nginx-deployment.yaml
kubectl get pods
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  &lt;code&gt;nginx-service.yaml&lt;/code&gt; (NodePort)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Service&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx-service&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;NodePort&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx&lt;/span&gt;
  &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;
    &lt;span class="na"&gt;targetPort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;
    &lt;span class="na"&gt;nodePort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;30080&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; nginx-service.yaml
kubectl get svc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Access Application
&lt;/h2&gt;

&lt;h3&gt;
  
  
  From Worker Node
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl http://localhost:30080
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  From Browser
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://&amp;lt;WORKER_PUBLIC_IP&amp;gt;:30080
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;⚠️ Requires &lt;strong&gt;AWS Security Group port 30080 open&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;This setup demonstrated:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Kubernetes cluster creation using &lt;code&gt;kubeadm&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Real CNI networking issues and fixes&lt;/li&gt;
&lt;li&gt;Importance of kernel modules for Flannel&lt;/li&gt;
&lt;li&gt;AWS networking &amp;amp; NodePort behavior&lt;/li&gt;
&lt;li&gt;End-to-end deployment of an application&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>devops</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Minikube + Kubernetes Complete Installation &amp; Setup Guide (Windows)</title>
      <dc:creator>Krisha Arya</dc:creator>
      <pubDate>Tue, 03 Feb 2026 11:00:29 +0000</pubDate>
      <link>https://forem.com/krisha_arya_55/minikube-kubernetes-complete-installation-setup-guide-windows-1hl2</link>
      <guid>https://forem.com/krisha_arya_55/minikube-kubernetes-complete-installation-setup-guide-windows-1hl2</guid>
      <description>&lt;p&gt;This document explains Minikube installation, setup, common errors, fixes, and Kubernetes basics step‑by‑step. It is written for absolute beginners, especially those running Windows 11 + Docker Desktop.&lt;/p&gt;

&lt;p&gt;&lt;u&gt;What is Minikube?&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;Minikube allows you to run a single‑node Kubernetes cluster locally on your system.&lt;br&gt;
It is mainly used for: - Learning Kubernetes - Testing deployments locally - Practicing kubectl commands.&lt;br&gt;
Minikube needs a driver to run Kubernetes, such as: - Docker (recommended on Windows) - Hyper‑V / VirtualBox (optional).&lt;/p&gt;

&lt;p&gt;&lt;u&gt;Prerequisites (IMPORTANT)&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;Before starting, make sure you have:&lt;br&gt;
✅ Windows Requirements&lt;br&gt;
• Windows 10/11 (64‑bit)&lt;br&gt;
• Virtualization enabled in BIOS&lt;br&gt;
✅ Software to Install&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Docker Desktop (Required)
o   Enable WSL2 backend during installation
o   After installation, open Docker Desktop and ensure it is Running&lt;/li&gt;
&lt;li&gt; Minikube
o   Download from: &lt;a href="https://minikube.sigs.k8s.io/docs/start/" rel="noopener noreferrer"&gt;https://minikube.sigs.k8s.io/docs/start/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;kubectl (Kubernetes CLI)&lt;br&gt;
o   Usually installed automatically with Minikube&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Verify Installation&lt;br&gt;
Open PowerShell and run:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;minikube version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl version --client
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;If both commands work → installation is successful.&lt;/p&gt;

&lt;p&gt;&lt;u&gt;📝 NOTE: Minikube Installation Path &amp;amp; PATH Environment Variable (Common Beginner Confusion)&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;Many beginners think that since Minikube is downloaded from the Downloads folder, the minikube start command must also be run from the Downloads directory.&lt;br&gt;
👉 This is a misconception.&lt;br&gt;
On Windows, when you install Minikube using the official installer, the setup process automatically handles everything for you.&lt;br&gt;
• The minikube.exe file is copied into a bin folder, usually:&lt;br&gt;
• C:\Program Files\Kubernetes\Minikube\&lt;br&gt;
• This bin folder path is automatically added to Windows Environment Variables (PATH) during installation.&lt;br&gt;
Because the PATH variable is already configured:&lt;br&gt;
• Windows knows where minikube.exe is located.&lt;br&gt;
• You do NOT need to go to the installation folder.&lt;br&gt;
• You do NOT need to stay in the Downloads folder.&lt;br&gt;
• You can run minikube start from any directory in PowerShell or Command Prompt.&lt;br&gt;
In simple terms:&lt;br&gt;
Minikube works from anywhere because its bin path is saved in the PATH environment variable automatically during installation.&lt;br&gt;
This behavior is normal, expected, and handled automatically, so no manual path configuration is required from the user.&lt;/p&gt;

&lt;p&gt;&lt;u&gt;Starting Minikube (Docker Driver)&lt;/u&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;minikube start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What Happened Internally&lt;br&gt;
• Minikube detected Docker driver&lt;br&gt;
• Pulled Kubernetes base image&lt;br&gt;
• Created a control‑plane container&lt;br&gt;
• Configured networking (CNI)&lt;br&gt;
Common Warning You Faced&lt;br&gt;
Failing to connect to &lt;a href="https://registry.k8s.io/" rel="noopener noreferrer"&gt;https://registry.k8s.io/&lt;/a&gt;&lt;br&gt;
👉 This happens due to: - Network restriction - Proxy - DNS issue&lt;br&gt;
Important: Even with this warning, Minikube can still start if images are cached or later loaded manually.&lt;/p&gt;

&lt;p&gt;&lt;u&gt;Verify Cluster Status&lt;/u&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;minikube status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected Output: - host: Running - kubelet: Running - apiserver: Running&lt;br&gt;
Also verify Kubernetes access:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl cluster-info
kubectl get nodes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;u&gt;Fix for Docker Context &amp;amp; Environment Issue (VERY IMPORTANT)&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;Sometimes Minikube fails due to wrong Docker context.&lt;br&gt;
Run these commands in every new terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Remove-Item Env:DOCKER_HOST
echo $Env:DOCKER_HOST
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;docker context use desktop-linux&lt;br&gt;
This ensures Minikube uses Docker Desktop correctly.&lt;/p&gt;

&lt;p&gt;Manual Image Pull Fix (Registry Access Issue)&lt;br&gt;
If Minikube cannot pull images automatically, do this manually.&lt;br&gt;
Pull Kubernetes Images Using Docker&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker pull registry.k8s.io/kube-apiserver:v1.34.0
docker pull registry.k8s.io/kube-controller-manager:v1.34.0
docker pull registry.k8s.io/kube-scheduler:v1.34.0
docker pull registry.k8s.io/kube-proxy:v1.34.0
docker pull registry.k8s.io/coredns/coredns:v1.12.1
docker pull registry.k8s.io/etcd:3.6.4-0
docker pull registry.k8s.io/pause:3.10.1
docker pull registry.k8s.io/k8s-minikube/storage-provisioner:v5
docker pull docker.io/kicbase/stable:v0.0.48
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Load Images into Minikube&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;minikube image load registry.k8s.io/kube-apiserver:v1.34.0
minikube image load registry.k8s.io/kube-controller-manager:v1.34.0
minikube image load registry.k8s.io/kube-scheduler:v1.34.0
minikube image load registry.k8s.io/kube-proxy:v1.34.0
minikube image load registry.k8s.io/coredns/coredns:v1.12.1
minikube image load registry.k8s.io/etcd:3.6.4-0
minikube image load registry.k8s.io/pause:3.10.1
minikube image load registry.k8s.io/k8s-minikube/storage-provisioner:v5
minikube image load docker.io/kicbase/stable:v0.0.48
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;u&gt;Restart Minikube Cleanly&lt;/u&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;minikube delete
minikube start --driver=docker --force
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;u&gt;Creating Your First Pod (YAML Way)&lt;/u&gt;&lt;br&gt;
Apply Nginx Pod&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl apply -f nginx-pod.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;u&gt;Check Pod Status&lt;/u&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl get pods
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected flow: - ContainerCreating → Running&lt;/p&gt;

&lt;p&gt;&lt;u&gt;Access Pod Using Port Forwarding&lt;/u&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl port-forward pod/nginx-pod 8080:80
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now open browser:&lt;br&gt;
&lt;a href="http://localhost:8080" rel="noopener noreferrer"&gt;http://localhost:8080&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pod Lifecycle Commands&lt;br&gt;
Describe Pod (Debugging)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl describe pod nginx-pod
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;u&gt;Delete Pod&lt;/u&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl delete pod nginx-pod
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Deployment (Recommended Way)&lt;br&gt;
Create Deployment&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl create deployment web --image=nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;u&gt;Check Status&lt;/u&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl get deployments
kubectl get pods
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;u&gt;Scaling Application&lt;/u&gt;&lt;br&gt;
Scale Up&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl scale deployment web --replicas=3
kubectl get pods
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;u&gt;Scale Down&lt;/u&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl scale deployment web --replicas=1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Self‑Healing Demo&lt;br&gt;
Delete any pod manually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl delete pod &amp;lt;pod-name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;u&gt;Expose Application (Service)&lt;/u&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl expose deployment web --type=NodePort --port=80
kubectl get services
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;u&gt;Access Application&lt;/u&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;minikube service web
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;u&gt;Cleanup Commands&lt;/u&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl delete service web
kubectl delete deployment web
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;u&gt;Stop &amp;amp; Delete Cluster&lt;/u&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;minikube stop
minikube delete
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;u&gt;Generic kubectl Command Reference&lt;/u&gt;&lt;br&gt;
Delete Resources&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl delete pod &amp;lt;pod-name&amp;gt; -n &amp;lt;namespace&amp;gt; 
//kubectl delete pod nginx-pod -n default

kubectl delete deployment &amp;lt;deployment-name&amp;gt;
//kubectl delete deployment nginx-deployment

kubectl delete namespace &amp;lt;namespace-name&amp;gt;
//kubectl delete namespace dev

kubectl delete configmap &amp;lt;configmap-name&amp;gt;
//kubectl delete configmap app-config

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;u&gt;Create Resources&lt;/u&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl create &amp;lt;resource-type&amp;gt; &amp;lt;name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Examples for creating different resources:&lt;/p&gt;

&lt;p&gt;🔹 Create a Namespace&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl create namespace dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔹 Create a Deployment&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl create deployment nginx-deployment --image=nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔹 Create a Pod (quick test)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl run test-pod --image=nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔹 Create a ConfigMap (from literal)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl create configmap app-config \
  --from-literal=APP_ENV=production
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;u&gt;Get / View Resources&lt;/u&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl get &amp;lt;resource-type&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Examples of get/view different resources:&lt;/p&gt;

&lt;p&gt;🔹 Get Pods&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl get pods
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔹Specific namespace:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl get pods -n dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔹 Get Deployments&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl get deployments
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔹 Get All Resources&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl get all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔹 Get ConfigMaps&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl get configmap
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔹 Detailed Info (VERY useful)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl describe pod nginx-pod
kubectl describe deployment nginx-deployment
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;u&gt;Important Beginner Tips&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;✅ Always check namespace when working with pods&lt;br&gt;
✅ Use kubectl describe when something fails&lt;br&gt;
✅ Prefer Deployment over Pod in real projects&lt;br&gt;
✅ If Minikube fails → delete and restart cleanly&lt;/p&gt;

&lt;p&gt;&lt;u&gt;Summary&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;You have successfully: - Installed Minikube - Fixed Docker &amp;amp; registry issues - Created pods and deployments - Exposed services - Understood scaling &amp;amp; self‑healing.&lt;/p&gt;

&lt;p&gt;Check out the next part which has covered more about kubernetes!😊&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>beginners</category>
      <category>tutorial</category>
      <category>devops</category>
    </item>
    <item>
      <title>Your First Mini Terraform Project: Install, Configure, and Deploy on AWS</title>
      <dc:creator>Krisha Arya</dc:creator>
      <pubDate>Tue, 02 Dec 2025 18:20:05 +0000</pubDate>
      <link>https://forem.com/krisha_arya_55/your-first-mini-terraform-project-install-configure-and-deploy-on-aws-10j2</link>
      <guid>https://forem.com/krisha_arya_55/your-first-mini-terraform-project-install-configure-and-deploy-on-aws-10j2</guid>
      <description>&lt;p&gt;🌟 What is Terraform?&lt;/p&gt;

&lt;p&gt;Terraform by HashiCorp is an Infrastructure as Code (IaC) tool used to:&lt;/p&gt;

&lt;p&gt;✔ Provision AWS / Azure / GCP resources&lt;br&gt;
✔ Automate infrastructure&lt;br&gt;
✔ Maintain repeatable, version-controlled deployments&lt;br&gt;
✔ Destroy and recreate resources easily&lt;/p&gt;

&lt;p&gt;It uses its own DSL called HCL (HashiCorp Configuration Language).&lt;/p&gt;

&lt;p&gt;In this guide, we will:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Install Terraform&lt;/li&gt;
&lt;li&gt;Configure AWS access&lt;/li&gt;
&lt;li&gt;Create a Terraform project&lt;/li&gt;
&lt;li&gt;Deploy AWS infrastructure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Install Terraform on Ubuntu&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt update
sudo apt install -y wget unzip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Download Terraform binary:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wget https://releases.hashicorp.com/terraform/1.6.3/terraform_1.6.3_linux_amd64.zip
unzip terraform_1.6.3_linux_amd64.zip
sudo mv terraform /usr/local/bin/
terraform -v
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should now see Terraform version.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Install AWS CLI&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt install -y awscli
aws --version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 3: Configure AWS Credentials&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;aws configure
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You will be prompted:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Enter AWS Access Key ID     : AKIAS4UYMELDA4JHKVP4
Enter AWS Secret Access Key : 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
Default region name         : ap-south-1
Default output format       : json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note: You can get "AWS Access Key ID" and "AWS Secret Access Key" by following this path (either create or get if already created):&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;AWS Console → IAM → Users → Your User → Security Credentials → Access Keys → Create Access Key&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Also, decide default region name according to nearest data center of your region.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Create Terraform Project Structure&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdir terraform_demo
cd terraform_demo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your folder structure will be:&lt;/p&gt;

&lt;p&gt;terraform_ansible_demo/&lt;br&gt;
└── terraform/&lt;br&gt;
    ├── provider.tf&lt;br&gt;
    ├── main.tf&lt;br&gt;
    ├── variables.tf&lt;br&gt;
    ├── terraform.tfvars&lt;br&gt;
    └── outputs.tf&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5: Write Terraform Files&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;u&gt;provider.tf&lt;/u&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;provider "aws" {
  region = var.region
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this file, we define which provider we are going to use.&lt;/p&gt;

&lt;p&gt;&lt;u&gt;variables.tf&lt;/u&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;variable "region" {}
variable "instance_type" {}
variable "key_name" {}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this file, we are going to define all variables which have been used in provider.tf and main.tf files.&lt;/p&gt;

&lt;p&gt;&lt;u&gt;terraform.tfvars&lt;/u&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;region        = "ap-south-1"
instance_type = "t2.micro"
key_name      = "nagios"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this file, we are going to define actual value of variables which have been defined in variables.tf file.&lt;/p&gt;

&lt;p&gt;&lt;u&gt;main.tf&lt;/u&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;resource "aws_instance" "web" {
  ami           = "ami-0a0f1259dd1c90938"
  instance_type = var.instance_type
  key_name      = var.key_name

  tags = {
    Name = "Terraform-Web"
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the main code file where we define all setups or configurations we want for EC2 instances.&lt;/p&gt;

&lt;p&gt;Note: For getting ami, you need to run below command to get correct ami of your selected region.&lt;/p&gt;

&lt;p&gt;For latest Ubuntu AMI (preferred):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;aws ec2 describe-images --owners canonical --filters "Name=name,Values=ubuntu/images/hvm-ssd/ubuntu-*" --query 'Images[*].[ImageId,Name]' --output table
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For latest Amazon Linux 2 AMI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;aws ec2 describe-images --owners amazon --filters "Name=name,Values=amzn2-ami-hvm-*-x86_64-gp2" --query 'Images[0].ImageId' --output text
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then after, select latest one!&lt;/p&gt;

&lt;p&gt;&lt;u&gt;outputs.tf&lt;/u&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;output "public_ip" {
  value = aws_instance.web.public_ip
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This file saves the output we get after running "terraform apply" command.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 6: Initialize Terraform&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd ~/terraform_demo/terraform
terraform init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 7: Generate an Execution Plan&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;terraform plan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It will show what Terraform is going to create.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 8: Apply &amp;amp; Create Infrastructure&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;terraform apply
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Type yes.&lt;br&gt;
You will get the public EC2 IP at the end.&lt;/p&gt;

&lt;p&gt;🎉 Terraform Setup Completed!&lt;/p&gt;

&lt;p&gt;You now have infrastructure deployed fully automatically.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>tutorial</category>
      <category>cloud</category>
      <category>devops</category>
    </item>
    <item>
      <title>How to Deploy a Web App Using Ansible in 10 Minutes</title>
      <dc:creator>Krisha Arya</dc:creator>
      <pubDate>Tue, 02 Dec 2025 16:47:11 +0000</pubDate>
      <link>https://forem.com/krisha_arya_55/how-to-deploy-a-web-app-using-ansible-in-10-minutes-4p1</link>
      <guid>https://forem.com/krisha_arya_55/how-to-deploy-a-web-app-using-ansible-in-10-minutes-4p1</guid>
      <description>&lt;p&gt;💡 What is Ansible?&lt;/p&gt;

&lt;p&gt;Ansible is a powerful automation tool used for:&lt;/p&gt;

&lt;p&gt;✔ Server configuration&lt;br&gt;
✔ Application deployment&lt;br&gt;
✔ Orchestration&lt;br&gt;
✔ Multi-server management&lt;/p&gt;

&lt;p&gt;It works over SSH, requires no agent, and uses YAML playbooks to automate tasks.&lt;br&gt;
Ansible is extremely popular in DevOps because of its simplicity and agentless architecture.&lt;/p&gt;

&lt;p&gt;In this guide, you will learn:&lt;/p&gt;

&lt;p&gt;How to install Ansible&lt;br&gt;
How to set up a project structure&lt;br&gt;
How to create inventory files&lt;br&gt;
How to write playbooks&lt;br&gt;
How to deploy a web page using Ansible&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Install Ansible on Ubuntu&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt update
sudo apt install ansible -y
ansible --version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 2: Create Ansible Project Structure&lt;/p&gt;

&lt;p&gt;Create project folder:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdir ansible_demo
cd ansible_demo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create inventory &amp;amp; playbooks directories:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdir inventory playbooks
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create inventory file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd inventory
touch hosts.ini
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create playbook file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd ../playbooks
touch web_prac.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 3: Add SSH Key to the Project&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In the project root directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd ..
mkdir ssh
cd ssh
touch nagios.pem
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Paste your PEM key content into nagios.pem.&lt;br&gt;
Then assign secure permissions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;chmod 600 nagios.pem
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 4: Test SSH Connection with PEM&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh -i ssh/nagios.pem ubuntu@ip_address_of_any_instance
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you successfully log in → connection OK.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5: Create Files Folder for Static Content&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is used when deploying frontend assets (like index.html):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd ../playbooks
mkdir files
cd files
touch index.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can add your HTML content inside index.html.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 6: Sample Playbook (web_prac.yml)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Inside ansible_demo/playbooks/web_prac.yml&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;---
- name: Setup Web Server
  hosts: webserver
  become: yes

  tasks:

    - name: Install NGINX
      apt:
        name: nginx
        state: present
        update_cache: yes

    - name: Copy index.html to web server
      copy:
        src: files/index.html
        dest: /var/www/html/index.html
        owner: www-data
        group: www-data
        mode: '0644'

    - name: Start and enable NGINX
      service:
        name: nginx
        state: started
        enabled: yes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 7: Inventory File — hosts.ini&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Inside ansible_demo/inventory/hosts.ini&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[webserver]
13.201.29.244 

ansible_user=ubuntu 
ansible_ssh_private_key_file=../ssh/nagios.pem

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 8: Run the Ansible Playbook&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;From the ansible_demo directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ansible-playbook -i inventory/hosts.ini playbooks/web_prac.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If successful →&lt;br&gt;
✔ NGINX installed&lt;br&gt;
✔ index.html deployed&lt;br&gt;
✔ Web server active&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 9: Verify on Browser&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Open:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://ip_address_of_instance" rel="noopener noreferrer"&gt;http://ip_address_of_instance&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You should see your index.html content served via NGINX.&lt;/p&gt;

&lt;p&gt;🎉 Final Result&lt;/p&gt;

&lt;p&gt;By the end of this guide, you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Installed Ansible&lt;/li&gt;
&lt;li&gt;Created a professional project structure&lt;/li&gt;
&lt;li&gt;Created an inventory file&lt;/li&gt;
&lt;li&gt;Created a YAML playbook&lt;/li&gt;
&lt;li&gt;Added SSH key for authentication&lt;/li&gt;
&lt;li&gt;Automated deployment of a web page&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>beginners</category>
      <category>tutorial</category>
      <category>cloud</category>
      <category>devops</category>
    </item>
    <item>
      <title>How I Installed Nagios on EC2 and Created My Own Disk Monitoring Plugin</title>
      <dc:creator>Krisha Arya</dc:creator>
      <pubDate>Tue, 02 Dec 2025 10:24:56 +0000</pubDate>
      <link>https://forem.com/krisha_arya_55/how-i-installed-nagios-on-ec2-and-created-my-own-disk-monitoring-plugin-3k95</link>
      <guid>https://forem.com/krisha_arya_55/how-i-installed-nagios-on-ec2-and-created-my-own-disk-monitoring-plugin-3k95</guid>
      <description>&lt;p&gt;🌟 What is Nagios?&lt;/p&gt;

&lt;p&gt;Nagios is a powerful open-source monitoring tool used to track:&lt;br&gt;
✔ Server health&lt;br&gt;
✔ Services (SSH, HTTP, CPU, disk, memory)&lt;br&gt;
✔ Network devices&lt;br&gt;
✔ Custom application metrics&lt;/p&gt;

&lt;p&gt;It alerts you instantly when a service goes down.&lt;br&gt;
Nagios is widely used in DevOps and IT operations for real-time monitoring.&lt;/p&gt;

&lt;p&gt;In this guide, you’ll learn:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How to install Nagios Core on AWS EC2&lt;/li&gt;
&lt;li&gt;How to configure hosts &amp;amp; services&lt;/li&gt;
&lt;li&gt;How to create your own custom Nagios plugin (disk monitoring)&lt;/li&gt;
&lt;li&gt;How to validate &amp;amp; restart Nagios configuration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Launch an AWS EC2 Ubuntu Instance&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Use Ubuntu 22.04 with port 80 open in security groups (for web UI).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: SSH into Your EC2 Instance&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;(Open your window powershell)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh -i yourkey.pem ubuntu@EC2_PUBLIC_IP
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 3: Install Required Packages&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt update &amp;amp;&amp;amp; sudo apt upgrade -y
sudo apt install -y build-essential libgd-dev openssl libssl-dev unzip apache2 php libapache2-mod-php
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 4: Create Nagios User &amp;amp; Groups&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo useradd nagios
sudo groupadd nagcmd
sudo usermod -aG nagcmd nagios
sudo usermod -aG nagcmd www-data
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 5: Download &amp;amp; Extract Nagios Core&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd /tmp
wget https://github.com/NagiosEnterprises/nagioscore/releases/download/nagios-4.4.14/nagios-4.4.14.tar.gz
tar -xzvf nagios-4.4.14.tar.gz
cd nagios-4.4.14
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 6: Configure &amp;amp; Compile Nagios&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;./configure --with-command-group=nagcmd
make all
sudo make install
sudo make install
sudo make install-init
sudo make install-commandmode
sudo make install-config
sudo make install-webconf
sudo a2enmod cgi
sudo systemctl restart apache2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 7: Set Nagios Admin Login&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo htpasswd -c /usr/local/nagios/etc/htpasswd.users nagiosadmin
sudo systemctl restart apache2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 8: Install Nagios Plugins&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd /tmp
wget https://nagios-plugins.org/download/nagios-plugins-2.3.3.tar.gz
tar -xzvf nagios-plugins-2.3.3.tar.gz
cd nagios-plugins-2.3.3
./configure --with-nagios-user=nagios --with-nagios-group=nagcmd
make
sudo make install
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 9: Start &amp;amp; Enable Nagios&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo systemctl start nagios
sudo systemctl enable nagios
sudo systemctl status nagios
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nagios UI will be available at:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="http://EC2_PUBLIC_IP/nagios" rel="noopener noreferrer"&gt;http://EC2_PUBLIC_IP/nagios&lt;/a&gt;&lt;br&gt;
Login: nagiosadmin&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 10: Create Custom Configuration File&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo nano /usr/local/nagios/etc/objects/nagios_demo.cfg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open main Nagios config:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo nano /usr/local/nagios/etc/nagios.cfg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add your config file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cfg_file=/usr/local/nagios/etc/objects/nagios_demo.cfg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 11: Define Hosts &amp;amp; Services in nagios_demo.cfg&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Note: We can define more than one host and service in same nagios_demo.cfg file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo nano /usr/local/nagios/etc/objects/nagios_demo.cfg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Define two hosts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;define host{
    use                    linux-server
    host_name              nagios-prac
    address                172.31.34.62
    max_check_attempts     5
}

define host{
    use                    linux-server
    host_name              nagios-prac1
    address                172.31.34.62
    max_check_attempts     5
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Define SSH service:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;define service{
    use                    generic-service
    host_name              nagios-prac
    service_description    SSH
    check_command          check_ssh
}
define service{
    use                    generic-service
    host_name              nagios-prac1
    service_description    SSH
    check_command          check_ssh
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Define HTTP (Ping) service:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;define service{
    use                    generic-service
    host_name              nagios-prac
    service_description    HTTP
    check_command          check_ping!100.0,20%!500.0,60%
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note: We are defining all these in same file i.e nagios_demo.cfg&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 12: Create Custom Disk Check Plugin&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Nagios allows custom plugins, so let’s create one for disk usage.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo nano /usr/local/nagios/libexec/check_disk_custom.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#!/bin/bash

DISK_USAGE=$(df / | grep / | awk '{print $5}' | sed 's/%//')
WARN=$1
CRIT=$2

if [ "$DISK_USAGE" -ge "$CRIT" ]; then
    echo "CRITICAL - Disk usage ${DISK_USAGE}% | usage=${DISK_USAGE}"
    exit 2
elif [ "$DISK_USAGE" -ge "$WARN" ]; then
    echo "WARNING - Disk usage ${DISK_USAGE}% | usage=${DISK_USAGE}"
    exit 1
else
    echo "OK - Disk usage ${DISK_USAGE}% | usage=${DISK_USAGE}"
    exit 0
fi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Make executable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo chmod +x /usr/local/nagios/libexec/check_disk_custom.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 13: Register Custom Command in commands.cfg&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo nano /usr/local/nagios/etc/objects/commands.cfg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;define command {
    command_name    check_disk_custom
    command_line    /usr/local/nagios/libexec/check_disk_custom.sh $ARG1$ $ARG2$
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 14: Create Service Entry for Disk Monitoring&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Make any service and use this command inside nagios_demo.cfg&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;define service {
    use                     generic-service
    host_name               nagios-prac
    service_description     Disk Load
    check_command           check_disk_custom!-w 20% -c 10%
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 15: Validate Configuration&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If no errors -&amp;gt; restart nagios&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo systemctl restart nagios
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎉 Final Output&lt;/p&gt;

&lt;p&gt;Your Nagios dashboard will now show:&lt;/p&gt;

&lt;p&gt;✔ Host status&lt;br&gt;
✔ SSH monitoring&lt;br&gt;
✔ Ping/HTTP monitoring&lt;br&gt;
✔ Disk monitoring using your custom plugin&lt;br&gt;
✔ Alerts for Warning/Critical states&lt;/p&gt;

&lt;p&gt;Login URL:&lt;br&gt;
👉 &lt;a href="http://EC2_PUBLIC_IP/nagios" rel="noopener noreferrer"&gt;http://EC2_PUBLIC_IP/nagios&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>tutorial</category>
      <category>beginners</category>
      <category>devops</category>
    </item>
    <item>
      <title>From Zero to Automation: Setting Up Puppet Master &amp; Agent on AWS EC2</title>
      <dc:creator>Krisha Arya</dc:creator>
      <pubDate>Tue, 02 Dec 2025 09:31:57 +0000</pubDate>
      <link>https://forem.com/krisha_arya_55/from-zero-to-automation-setting-up-puppet-master-agent-on-aws-ec2-5a3a</link>
      <guid>https://forem.com/krisha_arya_55/from-zero-to-automation-setting-up-puppet-master-agent-on-aws-ec2-5a3a</guid>
      <description>&lt;p&gt;🔹 What is Puppet?&lt;/p&gt;

&lt;p&gt;Puppet is an open-source configuration management and automation tool used to manage infrastructure at scale.&lt;br&gt;
It helps you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automate software installation&lt;/li&gt;
&lt;li&gt;Enforce system configuration&lt;/li&gt;
&lt;li&gt;Manage thousands of servers consistently&lt;/li&gt;
&lt;li&gt;Reduce manual repetitive tasks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Using Puppet, you define your server state in manifests (written in Puppet DSL), and Puppet ensures your system always stays in that state.&lt;/p&gt;

&lt;p&gt;In this guide, we’ll set up:&lt;br&gt;
✔️ Puppet Master&lt;br&gt;
✔️ Puppet Agent&lt;br&gt;
✔️ A demo module that installs NGINX and serves a custom webpage&lt;/p&gt;

&lt;p&gt;All using AWS EC2 Ubuntu 22.04 instances.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Launch Two AWS EC2 Instances&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You need:&lt;/p&gt;

&lt;p&gt;1 Puppet Master&lt;br&gt;
1 Puppet Agent&lt;br&gt;
Use Ubuntu 22.04 and open required ports (SSH, HTTP).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Configure the Puppet Master (puppetmaster)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;(Open your window powershell)&lt;br&gt;
✔ SSH into master&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh -i "C:\Users\User\Downloads\nagios.pem" ubuntu@15.206.178.143
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note: "C:\Users\User\Downloads\nagios.pem" is your nagios.pem file path and "15.206.178.143" is AWS EC2 instance of puppetmaster.&lt;/p&gt;

&lt;p&gt;✔ Set hostname&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo hostnamectl set-hostname puppetmaster
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✔ Update /etc/hosts&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo nano /etc/hosts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;ip-address-of-puppetmaster-ec2-instance&amp;gt; puppetmaster puppet
&amp;lt;ip-address-of-puppetagent-ec2-instance&amp;gt; puppetagent
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Install Puppet Server&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wget https://apt.puppet.com/puppet8-release-jammy.deb
sudo dpkg -i puppet8-release-jammy.deb
sudo apt update
sudo apt install puppetserver -y
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✔ Enable + start service:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo systemctl enable puppetserver
sudo systemctl start puppetserver
sudo systemctl status puppetserver
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sign Agent Certificate (Will be used later)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo /opt/puppetlabs/bin/puppetserver ca list
sudo /opt/puppetlabs/bin/puppetserver ca sign -all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 3: Configure Puppet Agent (puppetagent)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;(Open another window powershell)&lt;/p&gt;

&lt;p&gt;✔ SSH into agent&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh -i "C:\Users\User\Downloads\nagios.pem" ubuntu@3.108.65.97
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note: "C:\Users\User\Downloads\nagios.pem" is your nagios.pem file path and "15.206.178.143" is AWS EC2 instance of puppetagent.&lt;/p&gt;

&lt;p&gt;✔ Set hostname&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo hostnamectl set-hostname puppetagent
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✔ Update /etc/hosts&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo nano /etc/hosts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;ip-address-of-puppetmaster-ec2-instance&amp;gt; puppetmaster puppet
&amp;lt;ip-address-of-puppetagent-ec2-instance&amp;gt; puppetagent
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install Puppet Agent&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wget https://apt.puppet.com/puppet8-release-jammy.deb
sudo dpkg -i puppet8-release-jammy.deb
sudo apt update
sudo apt install puppet-agent -y
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Update Puppet Configuration (puppet.conf)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo nano /etc/puppetlabs/puppet/puppet.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[main]
certname = puppetagent
server = puppet
environment = production
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;▶ Start Puppet Agent&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo systemctl enable puppet
sudo systemctl start puppet
sudo /opt/puppetlabs/bin/puppet agent -t #this command send request for certificate signup to master
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 4: Create a Puppet Module (sample_nginx)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo nano /etc/puppetlabs/code/environments/production/modules/sample_nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Folder Structure:&lt;/p&gt;

&lt;p&gt;sample_nginx/&lt;br&gt;
├── manifests&lt;br&gt;
│   └── nginx.pp&lt;br&gt;
└── templates&lt;br&gt;
    └── index.erb&lt;/p&gt;

&lt;p&gt;nginx.pp (Manifest File)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class sample_nginx::nginx {
  package { 'nginx':
    ensure =&amp;gt; installed,
  }

  file { '/var/www/html/index.html':
    ensure  =&amp;gt; file,
    content =&amp;gt; template('sample_nginx/index.erb'),
  }

  service { 'nginx':
    ensure =&amp;gt; running,
    enable =&amp;gt; true,
    require =&amp;gt; Package['nginx'],
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 5: Update site.pp to Apply This Class&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo nano /etc/puppetlabs/code/environments/production/manifests/site.pp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;node default {
  include sample_nginx::nginx
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 6: Write Template File (index.erb)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;h1&amp;gt;Hello from Puppet NGINX!&amp;lt;/h1&amp;gt;
&amp;lt;p&amp;gt;This is a custom page managed by Puppet.&amp;lt;/p&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 7: Restart Master and Run Agent&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;On Master&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo systemctl restart puppetserver
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On Agent&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo /opt/puppetlabs/bin/puppet agent -t
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On Master&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo /opt/puppetlabs/bin/puppetserver ca list
sudo /opt/puppetlabs/bin/puppetserver ca sign --all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If everything is correct:&lt;/p&gt;

&lt;p&gt;✔ NGINX will be installed&lt;br&gt;
✔ Custom page will appear at /var/www/html/index.html&lt;br&gt;
✔ Puppet will manage service → auto-start + running&lt;/p&gt;

&lt;p&gt;🎉 Final Output&lt;/p&gt;

&lt;p&gt;You can now visit:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="http://AGENT_PUBLIC_IP" rel="noopener noreferrer"&gt;http://AGENT_PUBLIC_IP&lt;/a&gt;&lt;br&gt;
You will see:&lt;/p&gt;

&lt;p&gt;Hello from Puppet NGINX!&lt;br&gt;
This is a custom page managed by Puppet.&lt;/p&gt;

</description>
      <category>puppet</category>
      <category>aws</category>
      <category>ec2</category>
      <category>automation</category>
    </item>
    <item>
      <title>Hello everyone!
Hope you’re all doing well. I’ve been exploring AWS and serverless lately, and I enjoy sharing clear, simple explanations of what I learn. Looking forward to good discussions and connecting with like-minded people here!</title>
      <dc:creator>Krisha Arya</dc:creator>
      <pubDate>Thu, 20 Nov 2025 16:09:55 +0000</pubDate>
      <link>https://forem.com/krisha_arya_55/hello-everyone-hope-youre-all-doing-well-ive-been-exploring-aws-and-serverless-lately-and-i-ikk</link>
      <guid>https://forem.com/krisha_arya_55/hello-everyone-hope-youre-all-doing-well-ive-been-exploring-aws-and-serverless-lately-and-i-ikk</guid>
      <description></description>
      <category>serverless</category>
      <category>discuss</category>
      <category>aws</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Serverless Made Simple: Why Lambda Is Changing the Future of Cloud</title>
      <dc:creator>Krisha Arya</dc:creator>
      <pubDate>Thu, 20 Nov 2025 16:04:05 +0000</pubDate>
      <link>https://forem.com/krisha_arya_55/serverless-made-simple-why-lambda-is-changing-the-future-of-cloud-4d3c</link>
      <guid>https://forem.com/krisha_arya_55/serverless-made-simple-why-lambda-is-changing-the-future-of-cloud-4d3c</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;What is Serverless?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Serverless does NOT mean “there are no servers.&lt;br&gt;
It means...&lt;br&gt;
You don't manage the servers. AWS manages everything for you.&lt;/p&gt;

&lt;p&gt;You only write code, and AWS handles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;servers&lt;/li&gt;
&lt;li&gt;scaling&lt;/li&gt;
&lt;li&gt;uptime&lt;/li&gt;
&lt;li&gt;patches&lt;/li&gt;
&lt;li&gt;networking&lt;/li&gt;
&lt;li&gt;infrastructure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You pay only when your code runs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Let's understand with example...&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Imagine you want to run a function.&lt;br&gt;
Instead of buying a computer, you ask AWS:&lt;br&gt;
‘Please run this code whenever needed.’&lt;br&gt;
AWS does the rest.&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;Why Serverless Exists?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Before serverless:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;you must choose server size&lt;/li&gt;
&lt;li&gt;you must keep it running&lt;/li&gt;
&lt;li&gt;you must pay 24/7&lt;/li&gt;
&lt;li&gt;you must scale manually&lt;/li&gt;
&lt;li&gt;you must monitor and reboot&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With serverless:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;no servers to manage&lt;/li&gt;
&lt;li&gt;no scaling worries&lt;/li&gt;
&lt;li&gt;no idle costs&lt;/li&gt;
&lt;li&gt;automatically handles millions of users&lt;/li&gt;
&lt;li&gt;ideal for APIs, cron jobs, triggers&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;What is AWS Lambda?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;AWS Lambda is THE most famous serverless service.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Lambda = run your code without servers.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You upload your code → AWS executes it when needed → you pay only for milliseconds used.&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;How Lambda works???&lt;/strong&gt;
&lt;/h2&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                     Event Occurs
                           |
                  Lambda (Runs Code)
                           |
                        Output
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Examples of events that trigger Lambda:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API call from API Gateway&lt;/li&gt;
&lt;li&gt;File uploaded to S3&lt;/li&gt;
&lt;li&gt;DynamoDB table change&lt;/li&gt;
&lt;li&gt;SNS message&lt;/li&gt;
&lt;li&gt;SQS queue message&lt;/li&gt;
&lt;li&gt;CloudWatch cron job&lt;/li&gt;
&lt;li&gt;IoT event&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;Let's understand how Lambda executes code internally!&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Firstly, any event happens. Like user hits button or login API.&lt;/li&gt;
&lt;li&gt;Lambda who was sleeping,wakes up!&lt;/li&gt;
&lt;li&gt;User code executes.&lt;/li&gt;
&lt;li&gt;Lambda return results or writes to database.&lt;/li&gt;
&lt;li&gt;Lambda goes for sleep again!(shuts down..no server stays running)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;Cold Start vs Warm Start (Important)&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;When a Lambda function runs, AWS needs to prepare an execution environment for it.&lt;br&gt;
This environment includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CPU + memory allocation&lt;/li&gt;
&lt;li&gt;Runtime setup (Node/Python/Java…)&lt;/li&gt;
&lt;li&gt;Your code loading&lt;/li&gt;
&lt;li&gt;Dependencies loading (npm, libs, etc.)&lt;/li&gt;
&lt;li&gt;Environment variables&lt;/li&gt;
&lt;li&gt;Network setup (VPC ENI if used)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Depending on whether this environment already exists or not, Lambda behaves differently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;COLD START&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A cold start happens when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It’s the first time Lambda is running&lt;/li&gt;
&lt;li&gt;Lambda hasn’t been used for some time&lt;/li&gt;
&lt;li&gt;Lambda is deployed new version&lt;/li&gt;
&lt;li&gt;AWS scaled up and needed new containers&lt;/li&gt;
&lt;li&gt;You changed VPC settings (most costly cold starts)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because Lambda doesn’t keep containers alive forever.&lt;br&gt;
It sleeps after inactivity to save cost.&lt;/p&gt;

&lt;p&gt;Also when traffic spikes:&lt;/p&gt;

&lt;p&gt;If suddenly 1000 users come at once → AWS creates 1000 fresh containers → cold starts for many.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WARM START&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A warm start happens when AWS already has a prepared container for your Lambda.&lt;/p&gt;

&lt;p&gt;Meaning:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lambda ran recently&lt;/li&gt;
&lt;li&gt;AWS kept the container alive (in warm pool)&lt;/li&gt;
&lt;li&gt;No setup needed&lt;/li&gt;
&lt;li&gt;Code executes instantly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AWS keeps Lambda containers warm for some minutes (usually 5–15 minutes), hoping the function will be used again.&lt;/p&gt;

&lt;p&gt;Understand with a simple story...&lt;/p&gt;

&lt;p&gt;Warm Start - Suppose a gas stove is already hot and you can cook immediately.&lt;br&gt;
Cold Start - Suppose a gas stove is cold and you must light it,heat it and then start cooking.&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;Lambda vs EC2&lt;/strong&gt;
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Lambda&lt;/th&gt;
&lt;th&gt;EC2&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Server Management&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;You manage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pricing&lt;/td&gt;
&lt;td&gt;Pay per execution&lt;/td&gt;
&lt;td&gt;Pay per hour&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scaling&lt;/td&gt;
&lt;td&gt;Automatic&lt;/td&gt;
&lt;td&gt;Manual/Auto scaling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ideal For&lt;/td&gt;
&lt;td&gt;Small bursts, events&lt;/td&gt;
&lt;td&gt;Heavy apps, long-running apps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Always running?&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cold start&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Control Level&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OS access&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;When to Use Lambda?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Use Lambda when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You need API endpoints.&lt;/li&gt;
&lt;li&gt;You want event-driven apps.&lt;/li&gt;
&lt;li&gt;You only need code to run occasionally.&lt;/li&gt;
&lt;li&gt;You want low cost.&lt;/li&gt;
&lt;li&gt;You want no server maintenance.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;When NOT to Use Lambda?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Use EC2 instead if:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You need app running 24/7&lt;/li&gt;
&lt;li&gt;You have heavy CPU tasks&lt;/li&gt;
&lt;li&gt;You need custom OS configurations&lt;/li&gt;
&lt;li&gt;You want to host databases or big backend apps&lt;/li&gt;
&lt;li&gt;You need persistent connections (sockets, games, chat servers)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;What is the Serverless Framework?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The Serverless Framework is a tool used to create and deploy serverless apps easily.So, instead of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;creating Lambda manually&lt;/li&gt;
&lt;li&gt;adding triggers manually&lt;/li&gt;
&lt;li&gt;connecting API Gateway manually&lt;/li&gt;
&lt;li&gt;configuring permissions manually&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;❗ Serverless Framework does everything for you.&lt;/p&gt;

&lt;p&gt;File syntax is something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;service: my-service
provider:
  name: aws
  runtime: nodejs18.x

functions:
  hello:
    handler: handler.hello
    events:
      - http:
          path: hello
          method: get
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, we run below command on terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;serverless deploy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And boom 💥&lt;br&gt;
It creates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lambda&lt;/li&gt;
&lt;li&gt;API Gateway routes&lt;/li&gt;
&lt;li&gt;Permissions (IAM roles)&lt;/li&gt;
&lt;li&gt;Logs (CloudWatch)&lt;/li&gt;
&lt;li&gt;And deploys everything&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Serverless Framework = DevOps Shortcut&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;It automates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Packaging code&lt;/li&gt;
&lt;li&gt;Creating CloudFormation&lt;/li&gt;
&lt;li&gt;Deploying Lambda&lt;/li&gt;
&lt;li&gt;Creating APIs&lt;/li&gt;
&lt;li&gt;Versioning&lt;/li&gt;
&lt;li&gt;Permissions&lt;/li&gt;
&lt;li&gt;Environment variables&lt;/li&gt;
&lt;li&gt;Stages (dev, prod, test)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Very popular in companies for serverless architectures.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Let's see complete architecture!&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F81yqa9jsifq8vdbkvao9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F81yqa9jsifq8vdbkvao9.png" alt=" " width="800" height="1154"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>lambda</category>
      <category>aws</category>
      <category>serverless</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Overview of the Most Commonly Used AWS Services</title>
      <dc:creator>Krisha Arya</dc:creator>
      <pubDate>Wed, 19 Nov 2025 17:06:06 +0000</pubDate>
      <link>https://forem.com/krisha_arya_55/overview-of-the-most-commonly-used-aws-services-16k0</link>
      <guid>https://forem.com/krisha_arya_55/overview-of-the-most-commonly-used-aws-services-16k0</guid>
      <description>&lt;p&gt;Hello everyone, I am going to explain the most commonly used AWS cloud tools in a simple and easy way. These AWS services are widely used in real companies to build websites, mobile apps, APIs, and large cloud systems.&lt;/p&gt;

&lt;p&gt;Let’s begin exploring the AWS world in the simplest way possible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is AWS?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It is a cloud platform created by Amazon. It gives many tools to build apps, websites, databases, servers, storage and many more without buying any physical machine.&lt;br&gt;
Suppose, instead of buying your own computer, storage, or servers, you borrow them from Amazon whenever you need them. You use them online, pay only for what you use, and Amazon takes care of everything. If your app gets 1 → 10 → 10,000 → 10,00,000 users, AWS automatically handles the load.&lt;/p&gt;

&lt;p&gt;Let’s start by explaining tools now:&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What is Amazon EC2?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;EC2 is basically a virtual computer that lives inside AWS. You don’t buy a physical computer…&lt;br&gt;
AWS gives you one through the internet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Why EC2 exists?&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before cloud:&lt;br&gt;
• Companies had to buy servers&lt;br&gt;
• Pay for electricity&lt;br&gt;
• Maintain cooling&lt;br&gt;
• Handle hardware failures&lt;br&gt;
With EC2:&lt;br&gt;
• No hardware needed&lt;br&gt;
• Pay only when ON&lt;br&gt;
• Can start/stop anytime&lt;br&gt;
• AWS takes care of everything&lt;br&gt;
&lt;strong&gt;&lt;em&gt;Example:&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
You want to run services like frontend, backend, monitoring system like Nagios, we can do by deploying their codes and configurations on EC2.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What is a Security Group?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Security Group = A firewall (gatekeeper) for your AWS resources.&lt;br&gt;
It decides:&lt;br&gt;
• Who can enter&lt;br&gt;
• Which port they can use&lt;br&gt;
• Which IP they come from&lt;br&gt;
Simple words:&lt;br&gt;
A Security Group controls which traffic is ALLOWED into your EC2, RDS, or other AWS services.&lt;br&gt;
It controls Inbound rules (incoming traffic to your server) and outbound rules (outgoing traffic from your server).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;INTERNET --&amp;gt; SECURITY GROUPS --&amp;gt; (decides which one to allow) --&amp;gt; EC2 INSTANCE&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What is VPC?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;It is Virtual Private Cloud. Our own private network inside AWS. Imagine AWS is a big city.&lt;br&gt;
Inside this city, VPC is your own house with rooms, doors, windows, and boundary walls. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Why VPC Exists?&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
Because companies need:&lt;br&gt;
• Private space&lt;br&gt;
• Secure network&lt;br&gt;
• Separate environments&lt;br&gt;
• Control over traffic&lt;br&gt;
VPC gives you:&lt;br&gt;
✔ isolation&lt;br&gt;
✔ security&lt;br&gt;
✔ network control&lt;br&gt;
✔ full customization&lt;/p&gt;

&lt;p&gt;VPC (House)&lt;br&gt;
 ├─ Subnets (Rooms)&lt;br&gt;
 │    ├─ Public Subnet (Room with window i.e has internet access)&lt;br&gt;
 │    └─ Private Subnet (Room with no window i.e no internet access)&lt;br&gt;
 ├─ Route Table (decides traffic will go to which path)&lt;br&gt;
 ├─ Internet Gateway (main gate of house. Decides who are allowed.)&lt;br&gt;
 ├─ NAT Gateway (Private rooms/private subnets use this to communicate safely)&lt;br&gt;
 ├─ Security Groups (firewall rules, applies to house doors)&lt;br&gt;
 └─ NACLs (firewall rules, applies to subnets)&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                 INTERNET
                     |
              Internet Gateway
                     |
           ---------------------
           |     VPC Network   |
           |-------------------|
           |                   |
  Public Subnet           Private Subnet
 (frontend servers)     (databases, backend)
           |                   |
      Route Table         Route Table
           |                   |
           |              NAT Gateway
           |                   |
           ------- OUTBOUND to Internet
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;What is API Gateway?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;API Gateway is the front door for your backend.&lt;br&gt;
It receives API requests from users → checks them → sends them to the correct service like:&lt;br&gt;
• Lambda&lt;br&gt;
• EC2&lt;br&gt;
• ECS&lt;br&gt;
• DynamoDB&lt;br&gt;
• Any backend endpoint&lt;br&gt;
Think of it as a traffic police standing at your application's entry point.&lt;br&gt;
Your app has many APIs:&lt;br&gt;
• /login&lt;br&gt;
• /signup&lt;br&gt;
• /products&lt;br&gt;
• /cart&lt;br&gt;
• /orders&lt;br&gt;
Without API Gateway:&lt;br&gt;
Every API needs separate firewall, domain, rate limit → mess.&lt;br&gt;
With API Gateway:&lt;br&gt;
One single entry point handles everything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;User ---&amp;gt; API Gateway ---&amp;gt; Lambda / EC2 / Database&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;What is Lambda?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Lambda allows you to run your code without having a computer running all the time.&lt;br&gt;
Lambda is like a magic box. You put your code inside it. Whenever something happens, the box wakes up, runs your code, and goes back to sleep.It is serverless as we don't need to configure function , it will do for ourself unlike EC2. But slower than EC2 because it goes for sleep after finishing the work and wake up while calling (which takes some time).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Event (like someone clicking button) --&amp;gt; AWS Lambda (runs code)--&amp;gt;&lt;br&gt;
Output&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is Route 53?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you type a website name, something needs to tell the internet "Where is this website?".&lt;br&gt;
Route 53 does that job.&lt;br&gt;
Route 53 is like a phonebook for websites. You ask: 'Where is &lt;a href="http://www.yourWebsite.com?" rel="noopener noreferrer"&gt;www.yourWebsite.com?&lt;/a&gt;' and Route 53 tells you the correct address.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You type: &lt;a href="http://www.yourWebsite.com" rel="noopener noreferrer"&gt;www.yourWebsite.com&lt;/a&gt; --&amp;gt;Route 53--&amp;gt; Gives server address&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;What is CloudFront?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;CloudFront stores copies of your website around the world so users get fast loading.&lt;br&gt;
CloudFront is like keeping your toys in every room. So no matter where you are, you get your toy fast!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CloudFront Edge Locations&lt;br&gt;
/ | | \&lt;br&gt;
User--Fast Fast Fast Fast&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;What is CloudFormation?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;You write a YAML file saying what resources you want. AWS builds everything automatically.&lt;br&gt;
CloudFormation is like giving AWS a blueprint of a house. AWS reads it and builds the whole house for you automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Blueprint (YAML) --&amp;gt;CloudFormation ---&amp;gt; Builds EC2, S3, RDS, etc.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;What is DynamoDB?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;A fast, serverless database that stores key-value data.&lt;br&gt;
DynamoDB is like a giant table where every row has a key. When you search by key, it gives answer in a blink!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key: user123 ---&amp;gt; DynamoDB ---&amp;gt; User Data&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;What is DocumentDB?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;DocumentDB is a NoSQL database that stores flexible JSON documents.&lt;/p&gt;

&lt;p&gt;Imagine you have a big shelf where every item (document) can look different.&lt;br&gt;
One page may have name + age.&lt;br&gt;
Another page may have name + hobbies.&lt;br&gt;
Another page may have name + skills + phone.&lt;/p&gt;

&lt;p&gt;DocumentDB allows different shapes and structures of data.Unlike SQL where rows should be in same form.DocumentDB has no such restriction.&lt;br&gt;
Example:&lt;br&gt;
Document 1: {name, age}&lt;br&gt;
Document 2: {name, hobby}&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;DocumentDB&lt;/th&gt;
&lt;th&gt;DynamoDB&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Data Type&lt;/td&gt;
&lt;td&gt;Document JSON&lt;/td&gt;
&lt;td&gt;Key-Value&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Structure&lt;/td&gt;
&lt;td&gt;Flexible&lt;/td&gt;
&lt;td&gt;Simple&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Queries&lt;/td&gt;
&lt;td&gt;Rich queries&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best for&lt;/td&gt;
&lt;td&gt;User profiles, CMS, catalogs&lt;/td&gt;
&lt;td&gt;Cart, sessions, OTP, counters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scaling&lt;/td&gt;
&lt;td&gt;Good&lt;/td&gt;
&lt;td&gt;Best (serverless)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API&lt;/td&gt;
&lt;td&gt;MongoDB API&lt;/td&gt;
&lt;td&gt;Dynamo API&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;What is ElastiCache?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;It is the caching service of AWS.Basically,Caching means keeping data in memory (RAM) so you can get it super fast.&lt;/p&gt;

&lt;p&gt;AWS offers two engines:&lt;br&gt;
Redis&lt;br&gt;
Memcached&lt;/p&gt;

&lt;p&gt;Most companies use Redis, so we will focus more on that.&lt;/p&gt;

&lt;p&gt;Your main notebook (database) is kept far away.&lt;br&gt;
But you keep important pages in your pocket for quick access.&lt;br&gt;
Your pocket = CACHE.&lt;/p&gt;

&lt;p&gt;ElastiCache = pocket&lt;br&gt;
Database = big notebook&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;User -&amp;gt; Backend -&amp;gt; Redis (if found then return response) -&amp;gt; Database (if not found in redis)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now, if you are wondering.....What is memcached???&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Redis&lt;/th&gt;
&lt;th&gt;Memcached&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Data types&lt;/td&gt;
&lt;td&gt;Many (lists, sets, hashes)&lt;/td&gt;
&lt;td&gt;Only strings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Expiry&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Persistence&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pub/Sub&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Use cases&lt;/td&gt;
&lt;td&gt;Sessions, cache, leaderboard&lt;/td&gt;
&lt;td&gt;Simple cache only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Popularity&lt;/td&gt;
&lt;td&gt;Very high&lt;/td&gt;
&lt;td&gt;Less&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Redis = Swiss Army Knife&lt;br&gt;
Memcached = Simple Spoon&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;What is Amazon RDS?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;RDS = Relational Database Service&lt;br&gt;
It is AWS’s way of giving you SQL databases without you needing to install or manage them.&lt;/p&gt;

&lt;p&gt;Imagine you want a school notebook (database) where everything is neatly written in rows and columns.&lt;/p&gt;

&lt;p&gt;Amazon gives you a ready-made notebook.&lt;br&gt;
You just write data — Amazon takes care of keeping it clean, safe, and backed up.&lt;/p&gt;

&lt;p&gt;That notebook = RDS&lt;/p&gt;

&lt;p&gt;Why do companies use RDS?&lt;br&gt;
Because AWS handles the difficult parts:&lt;br&gt;
No installation&lt;br&gt;
No updates&lt;br&gt;
No backups&lt;br&gt;
No maintenance&lt;br&gt;
No server problems&lt;br&gt;
No hardware issues&lt;/p&gt;

&lt;p&gt;AWS handles EVERYTHING.&lt;/p&gt;

&lt;p&gt;You only:&lt;br&gt;
Store data&lt;br&gt;
Read data&lt;br&gt;
Query data&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;What is Amazon Aurora?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;It is super-fast upgraded version of MySQL/PostgreSQL provided by AWS.It behaves like MySQL/Postgres.BUT is 3x to 5x faster, more secure, more reliable, and auto-scaling.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why Aurora Exists?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Because normal RDS MySQL/Postgres becomes slow&lt;br&gt;
when:&lt;/p&gt;

&lt;p&gt;thousands of users come&lt;br&gt;
queries get heavy&lt;br&gt;
traffic spikes&lt;br&gt;
big companies run large apps&lt;/p&gt;

&lt;p&gt;Aurora solves everything.&lt;/p&gt;

&lt;p&gt;Simple Explanation&lt;/p&gt;

&lt;p&gt;Aurora stores 6 copies of your data:&lt;/p&gt;

&lt;p&gt;2 copies in AZ-1&lt;br&gt;
2 copies in AZ-2&lt;br&gt;
2 copies in AZ-3&lt;/p&gt;

&lt;p&gt;So even if:&lt;/p&gt;

&lt;p&gt;1 disk fails → safe&lt;br&gt;
1 AZ fails → still safe&lt;br&gt;
2 copies fail → still safe&lt;/p&gt;

&lt;p&gt;Your data is ALWAYS safe.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;RDS&lt;/th&gt;
&lt;th&gt;Aurora&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Speed&lt;/td&gt;
&lt;td&gt;Normal&lt;/td&gt;
&lt;td&gt;3–5x faster&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Durability&lt;/td&gt;
&lt;td&gt;1-2 copies&lt;/td&gt;
&lt;td&gt;6 copies in 3 AZs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Failover&lt;/td&gt;
&lt;td&gt;Slow&lt;/td&gt;
&lt;td&gt;Instant&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scaling&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;Automatic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Recovery&lt;/td&gt;
&lt;td&gt;Slow&lt;/td&gt;
&lt;td&gt;Very fast&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost&lt;/td&gt;
&lt;td&gt;Lower&lt;/td&gt;
&lt;td&gt;Slightly higher&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ideal For&lt;/td&gt;
&lt;td&gt;Small-medium apps&lt;/td&gt;
&lt;td&gt;High traffic apps&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;What is SNS?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;SNS = Simple Notification Service&lt;br&gt;
It is AWS’s messaging system used to send:&lt;br&gt;
Notifications&lt;br&gt;
Emails&lt;br&gt;
SMS&lt;br&gt;
Alerts&lt;br&gt;
Messages to Lambda&lt;br&gt;
Messages to SQS&lt;/p&gt;

&lt;p&gt;SNS follows a pub-sub model&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;(Publisher → Topic → Subscribers)&lt;br&gt;
               |&lt;br&gt;
 (Topic- A “group” created to send messages to many receivers.)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Imagine a teacher shouting one announcement in class,&lt;br&gt;
and ALL students hear it at the same time.”&lt;/p&gt;

&lt;p&gt;Teacher = Publisher&lt;br&gt;
Announcement = Message&lt;br&gt;
Students = Subscribers&lt;br&gt;
Classroom = SNS Topic&lt;/p&gt;

&lt;p&gt;One message → many receivers&lt;br&gt;
This is SNS.&lt;/p&gt;

&lt;p&gt;Note: SNS uses push, meaning:&lt;br&gt;
Messages automatically go to subscribers.&lt;br&gt;
You do NOT need to check or request the message.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Publisher (Order Placed)&lt;br&gt;
         |&lt;br&gt;
         v&lt;br&gt;
      SNS Topic&lt;br&gt;
   /       |       \&lt;br&gt;
 Email   SMS     Lambda&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;What is SQS?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;SQS = Simple Queue Service&lt;br&gt;
It is AWS’s message queue used to store messages temporarily until a worker (Lambda/EC2) processes them.&lt;br&gt;
SQS = Line/Queue system&lt;br&gt;
One message → processed by one worker at a time.&lt;/p&gt;

&lt;p&gt;Imagine kids standing in a line at school.&lt;br&gt;
Teacher checks each kid one by one.”&lt;/p&gt;

&lt;p&gt;That line = SQS queue&lt;br&gt;
Each kid = message&lt;br&gt;
Teacher = worker (Lambda/EC2)&lt;/p&gt;

&lt;p&gt;No one can jump the line.&lt;br&gt;
No one can skip.&lt;br&gt;
First come → first served.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why SQS Exists?&lt;/strong&gt;&lt;br&gt;
Because backend tasks cannot be done all at once.&lt;/p&gt;

&lt;p&gt;Example tasks:&lt;br&gt;
Process orders&lt;br&gt;
Resize images&lt;br&gt;
Compress files&lt;br&gt;
Generate invoices&lt;br&gt;
Send bulk emails&lt;/p&gt;

&lt;p&gt;Doing these instantly = slow + heavy load.&lt;br&gt;
So they go in a queue, worker processes them one by one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Messages → [ SQS Queue ] → Worker → Processed&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Order Placed --&amp;gt; SNS --&amp;gt; SQS  --&amp;gt; Lambda Worker --&amp;gt; invoice, email, updates...&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;SNS&lt;/th&gt;
&lt;th&gt;SQS&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Type&lt;/td&gt;
&lt;td&gt;Pub-sub&lt;/td&gt;
&lt;td&gt;Queue&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Delivery&lt;/td&gt;
&lt;td&gt;Push&lt;/td&gt;
&lt;td&gt;Pull&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Receivers&lt;/td&gt;
&lt;td&gt;Many&lt;/td&gt;
&lt;td&gt;One&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Use&lt;/td&gt;
&lt;td&gt;Notifications&lt;/td&gt;
&lt;td&gt;Background tasks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Message&lt;/td&gt;
&lt;td&gt;Broadcast&lt;/td&gt;
&lt;td&gt;Process sequentially&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;What is CloudWatch?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;It is monitoring and logging system of AWS.It keeps an eye on all your AWS services and tells you:&lt;/p&gt;

&lt;p&gt;What is running?&lt;br&gt;
What is failing?&lt;br&gt;
What errors happened?&lt;/p&gt;

&lt;p&gt;Imagine your house has CCTV cameras, a thermometer, and an alarm.&lt;br&gt;
The thermometer tells if the room is hot&lt;br&gt;
The CCTV tells what is happening&lt;br&gt;
The alarm tells when something is wrong.&lt;/p&gt;

&lt;p&gt;This whole system = CloudWatch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why CloudWatch Exists?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Because companies need to know:&lt;br&gt;
Is the system healthy?&lt;br&gt;
Is the server overloaded?&lt;br&gt;
Are errors increasing?&lt;br&gt;
Should we auto-scale?&lt;br&gt;
Should admin be alerted?&lt;/p&gt;

&lt;p&gt;Without CloudWatch →&lt;br&gt;
You are blind.&lt;/p&gt;

&lt;p&gt;With CloudWatch →&lt;br&gt;
You can see everything happening in your AWS environment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Main Features of CloudWatch&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Metrics (Performance numbers)
CloudWatch automatically collects numbers like:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;CPU %&lt;br&gt;
Memory&lt;br&gt;
Network usage&lt;br&gt;
Disk usage&lt;br&gt;
Lambda duration&lt;br&gt;
API Gateway errors&lt;br&gt;
DynamoDB read/write errors&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Logs
Collects logs from:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Lambda&lt;br&gt;
API Gateway&lt;br&gt;
EC2&lt;br&gt;
ECS&lt;br&gt;
RDS&lt;br&gt;
Custom apps&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Alarms
You can set alarms like:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;CPU &amp;gt; 80% → send alert&lt;br&gt;
Errors &amp;gt; 10 → notify&lt;br&gt;
Lambda failures → alert&lt;br&gt;
Low disk space → alert&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Dashboards&lt;br&gt;
Visual charts for your whole system.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Events / EventBridge&lt;br&gt;
Trigger actions on events like:&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;EC2 stop/start&lt;br&gt;
Backup success&lt;br&gt;
User login&lt;br&gt;
Auto-scaling events&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                EC2 Metrices/Lambda Logs/API Errors
                                 |
                             CloudWatch
                                 |
                                SNS
                                 |
                             Email/SMS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;What is CloudTrail?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;It is activity recorder of AWS.&lt;br&gt;
It records:&lt;/p&gt;

&lt;p&gt;Who did what&lt;br&gt;
When it was done&lt;br&gt;
From where&lt;br&gt;
On which resource&lt;br&gt;
Using which AWS API&lt;/p&gt;

&lt;p&gt;Imagine your school keeps a diary that notes:&lt;/p&gt;

&lt;p&gt;Who entered classroom&lt;br&gt;
Who took which book&lt;br&gt;
Who used the computer&lt;br&gt;
Who changed something&lt;/p&gt;

&lt;p&gt;This diary = CloudTrail.”&lt;br&gt;
CloudTrail records EVERY action done inside your AWS account.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why CloudTrail Exists?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Companies need:&lt;br&gt;
Security&lt;br&gt;
Auditing&lt;br&gt;
Detecting unauthorized access&lt;br&gt;
Debugging issues&lt;br&gt;
Compliance (ISO, PCI, GDPR)&lt;br&gt;
Tracing mistakes&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
Someone accidentally deletes an EC2 instance →&lt;br&gt;
CloudTrail tells you WHO did it and WHEN.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What CloudTrail Tracks?&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Logs every API call:&lt;br&gt;
Examples:&lt;/p&gt;

&lt;p&gt;EC2 Started&lt;br&gt;
Lambda Updated&lt;br&gt;
S3 Bucket Deleted&lt;br&gt;
RDS Snapshot Created&lt;br&gt;
IAM User Login&lt;br&gt;
Security Group Modified&lt;br&gt;
DynamoDB Table Deleted&lt;/p&gt;

&lt;p&gt;Tracks console + CLI + SDK actions&lt;br&gt;
Whether action came from:&lt;/p&gt;

&lt;p&gt;AWS Console&lt;br&gt;
CLI&lt;br&gt;
Terraform&lt;br&gt;
API&lt;br&gt;
Everything is recorded.&lt;/p&gt;

&lt;p&gt;Tracks IP address&lt;br&gt;
From where the action came.&lt;/p&gt;

&lt;p&gt;Tracks time and region&lt;br&gt;
Every action is timestamped.&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;            +-----------------------------+
            |        Users / AWS CLI      |
            |   (Human or Application)    |
            +--------------+--------------+
                           |
                           |  API Calls (Actions)
                           v
             +-----------------------------+
             |         AWS Services        |
             |  EC2, S3, IAM, Lambda, etc. |
             +--------------+--------------+
                           |
                           |  Every Action Recorded
                           v
             +-----------------------------+
             |         CloudTrail          |
             | (CCTV of AWS — logs every   |
             |  API call, who, when, where)|
             +--------------+--------------+
                           |
                           |  Store Logs
                           v
   +-------------------+                +------------------+
   |      S3 Bucket    |   &amp;lt;optional&amp;gt;   | CloudWatch Logs  |  
   | (Long-term logs)  |--------------- | (For monitoring  |   
   +-------------------+                |   + alerts)      |   
                                        +------------------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;CloudTrail&lt;/th&gt;
&lt;th&gt;CloudWatch&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Purpose&lt;/td&gt;
&lt;td&gt;Security &amp;amp; Auditing&lt;/td&gt;
&lt;td&gt;Monitoring &amp;amp; Performance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Records&lt;/td&gt;
&lt;td&gt;“Who did what?”&lt;/td&gt;
&lt;td&gt;“How is system behaving?”&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Example&lt;/td&gt;
&lt;td&gt;User changed SG&lt;/td&gt;
&lt;td&gt;CPU = 90%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Used by&lt;/td&gt;
&lt;td&gt;Security teams&lt;/td&gt;
&lt;td&gt;DevOps teams&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;So, these were some tools which should be in our knowledge.Let's see final architecture of how all these tools work together.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;COMPLETE ARCHITECTURE&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                        INTERNET
                            |
                       Route 53     
                     (Domain Name)  
                            |
                       CloudFront   
                     (CDN for Speed)    
                            |                                                     
                     API Gateway    
                     (Entry Door)                        
                            |
          ------------------------------------
          |                                  |                                                      
        Lambda                              EC2            
    (Serverless Code)              (Backend Servers)       

          |                                  |
          |                                  |
          |                                  |
          v                                  v

     DynamoDB                          RDS / Aurora      
(Fast NoSQL Key-Value)                (SQL Database)         
            |                               |
            |                               |
            v                               v
 +-------------------+               +--------------------+
 |   ElastiCache     |               |   DocumentDB       |
 |     (Redis)       |               | (MongoDB-like JSON)|
 +-------------------+               +--------------------+

            |                                      |
            |                                      |
            -----------------+   +------------------
                              v  v
                         +-------------------+
                         |       SNS         |
                         | (Notifications)   |
                         +-------------------+
                                  |
                                  | PUSH
                                  v
                       +----------------------+
                       |         SQS          |
                       | (Background Queue)   |
                       +----------------------+
                                  |
                                  v
                       +-----------------------+
                       |   Lambda Workers      |
                       | (Processes Messages)  |
                       +-----------------------+

 -------------------------------------------------------------
                            OBSERVABILITY
 -------------------------------------------------------------

         +----------------------+    +----------------------+
         |     CloudWatch       |    |    CloudTrail        |
         | (Monitoring, Logs,   |    |(CCTV — Who Did What?)|
         |   Alarms)            |    +----------------------+
         +----------------------+ 
                   |
                   v
              +----------+
              |   SNS    |
              | Alerts   |
              +----------+
                   |
                   v
               EMAIL / SMS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>aws</category>
      <category>ec2</category>
      <category>linux</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Nagios Core 4.4.6 Installation and Setup on Ubuntu VM</title>
      <dc:creator>Krisha Arya</dc:creator>
      <pubDate>Thu, 25 Sep 2025 11:25:21 +0000</pubDate>
      <link>https://forem.com/krisha_arya_55/nagios-core-446-installation-and-setup-on-ubuntu-vm-2aca</link>
      <guid>https://forem.com/krisha_arya_55/nagios-core-446-installation-and-setup-on-ubuntu-vm-2aca</guid>
      <description>&lt;h3&gt;
  
  
  &lt;strong&gt;Introduction&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Nagios is an open-source monitoring system that allows IT administrators to monitor &lt;strong&gt;servers, services, and network infrastructure&lt;/strong&gt;. It provides &lt;strong&gt;real-time alerts&lt;/strong&gt; for failures or threshold breaches, ensuring high availability and reliability. Nagios supports monitoring of host resources (CPU, memory, disk), network services (HTTP, FTP, SMTP), and custom applications.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Purpose of This Setup&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The goal of this setup is to install Nagios Core with a &lt;strong&gt;web interface&lt;/strong&gt; on Ubuntu VM to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Monitor the health and performance of servers and services.&lt;/li&gt;
&lt;li&gt;Receive alerts for system failures.&lt;/li&gt;
&lt;li&gt;Provide a &lt;strong&gt;centralized dashboard&lt;/strong&gt; for easy monitoring.&lt;/li&gt;
&lt;li&gt;Gain practical experience with Linux system administration, service monitoring, and web-based dashboards.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;1. System Update &amp;amp; Install Prerequisites&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;wget unzip curl openssl build-essential libgd-dev libssl-dev &lt;span class="se"&gt;\&lt;/span&gt;
libapache2-mod-php php-gd php apache2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Installs build tools, Apache web server, PHP, and required libraries.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;2. Download &amp;amp; Extract Nagios Core&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /tmp
wget https://assets.nagios.com/downloads/nagioscore/releases/nagios-4.4.6.tar.gz
&lt;span class="nb"&gt;sudo tar&lt;/span&gt; &lt;span class="nt"&gt;-zxvf&lt;/span&gt; nagios-4.4.6.tar.gz
&lt;span class="nb"&gt;cd &lt;/span&gt;nagios-4.4.6
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  &lt;strong&gt;3. Compile Nagios&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo&lt;/span&gt; ./configure
&lt;span class="nb"&gt;sudo &lt;/span&gt;make all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Prepares the build environment and compiles Nagios.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;4. Create Users &amp;amp; Groups&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;make install-groups-users
&lt;span class="nb"&gt;sudo &lt;/span&gt;usermod &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="nt"&gt;-G&lt;/span&gt; nagios www-data
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Creates &lt;code&gt;nagios&lt;/code&gt; user and &lt;code&gt;nagcmd&lt;/code&gt; group.&lt;/li&gt;
&lt;li&gt;Adds Apache user &lt;code&gt;www-data&lt;/code&gt; to &lt;code&gt;nagios&lt;/code&gt; group for web command access.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;5. Install Nagios Core&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;make &lt;span class="nb"&gt;install
sudo &lt;/span&gt;make install-commandmode
&lt;span class="nb"&gt;sudo &lt;/span&gt;make install-config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Installs Nagios binaries, sets permissions, and copies default configuration files.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;6. Install Web Interface&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;make install-webconf
&lt;span class="nb"&gt;sudo &lt;/span&gt;a2enmod rewrite
&lt;span class="nb"&gt;sudo &lt;/span&gt;a2enmod cgi
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart apache2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Installs Nagios web files and enables required Apache modules.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;7. Configure Firewall&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow apache
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw &lt;span class="nb"&gt;enable
sudo &lt;/span&gt;ufw reload
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Allows HTTP traffic to the Nagios web interface.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;8. Set Up Web Authentication&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;htpasswd &lt;span class="nt"&gt;-c&lt;/span&gt; /usr/local/nagios/etc/htpasswd.users linuxhint
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Username:&lt;/strong&gt; &lt;code&gt;linuxhint&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Password:&lt;/strong&gt; (as entered during command)&lt;/li&gt;
&lt;li&gt;Used to log in to the Nagios web dashboard.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;9. Install Nagios Plugins&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /tmp
&lt;span class="nb"&gt;sudo &lt;/span&gt;wget https://nagios-plugins.org/download/nagios-plugins-2.3.3.tar.gz
&lt;span class="nb"&gt;sudo tar&lt;/span&gt; &lt;span class="nt"&gt;-zxvf&lt;/span&gt; nagios-plugins-2.3.3.tar.gz
&lt;span class="nb"&gt;cd &lt;/span&gt;nagios-plugins-2.3.3
&lt;span class="nb"&gt;sudo&lt;/span&gt; ./configure &lt;span class="nt"&gt;--with-nagios-user&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;nagios &lt;span class="nt"&gt;--with-nagios-group&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;nagios
&lt;span class="nb"&gt;sudo &lt;/span&gt;make &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Plugins enable checks for CPU, memory, disk, network, and services.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;10. Verify Nagios Configuration&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo&lt;/span&gt; /usr/local/nagios/bin/nagios &lt;span class="nt"&gt;-v&lt;/span&gt; /usr/local/nagios/etc/nagios.cfg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Ensures all configuration files are correct before starting Nagios.&lt;/li&gt;
&lt;li&gt;No errors should appear; check “Total Warnings” and “Total Errors”.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;11. Start Nagios&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start nagios
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or manually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo&lt;/span&gt; /usr/local/nagios/bin/nagios /usr/local/nagios/etc/nagios.cfg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Starts Nagios monitoring service.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;12. Find VM IP Address&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;hostname&lt;/span&gt; &lt;span class="nt"&gt;-I&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Example output: &lt;code&gt;192.168.171.129&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;This is the IP to access the Nagios web interface from a browser.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;13. Access Nagios Web Interface&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Open your browser and go to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://&amp;lt;VM-IP&amp;gt;/nagios
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Replace &lt;code&gt;&amp;lt;VM-IP&amp;gt;&lt;/code&gt; with the IP from the previous step.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Username:&lt;/strong&gt; &lt;code&gt;linuxhint&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Password:&lt;/strong&gt; (as set in htpasswd)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You will see the &lt;strong&gt;Nagios Core dashboard&lt;/strong&gt; with hosts, services, and alerts.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Summary&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;This setup provides a &lt;strong&gt;fully functional Nagios monitoring environment&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Monitors system metrics, services, and network resources.&lt;/li&gt;
&lt;li&gt;Provides real-time alerts to prevent downtime.&lt;/li&gt;
&lt;li&gt;Web interface allows centralized monitoring and control.&lt;/li&gt;
&lt;li&gt;Prepares users for practical &lt;strong&gt;IT monitoring and Linux administration skills&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Motto:&lt;/strong&gt; “Monitor, Alert, and Maintain — Keeping IT systems healthy and reliable.”&lt;/p&gt;




</description>
      <category>webdev</category>
      <category>nagios</category>
      <category>ubuntu</category>
      <category>installation</category>
    </item>
  </channel>
</rss>
