<?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: Azmat Ahmed</title>
    <description>The latest articles on Forem by Azmat Ahmed (@azmatahmed).</description>
    <link>https://forem.com/azmatahmed</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%2F3132984%2Ff3dc53c6-d9e5-4fb6-a763-b442f7e6fb84.jpg</url>
      <title>Forem: Azmat Ahmed</title>
      <link>https://forem.com/azmatahmed</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/azmatahmed"/>
    <language>en</language>
    <item>
      <title>🚀 End-to-End CI/CD Pipeline with Jenkins, Docker, Kubernetes &amp; Argo CD (GitOps)</title>
      <dc:creator>Azmat Ahmed</dc:creator>
      <pubDate>Sat, 07 Feb 2026 09:58:10 +0000</pubDate>
      <link>https://forem.com/azmatahmed/end-to-end-cicd-pipeline-with-jenkins-docker-kubernetes-argo-cd-gitops-4l1i</link>
      <guid>https://forem.com/azmatahmed/end-to-end-cicd-pipeline-with-jenkins-docker-kubernetes-argo-cd-gitops-4l1i</guid>
      <description>&lt;p&gt;In this post, I’ll walk you through a real-world CI/CD pipeline using modern DevOps tools.&lt;br&gt;
This project demonstrates how Continuous Integration and GitOps-based Continuous Deployment work together in production environments.&lt;/p&gt;

&lt;p&gt;🔗 Source Code Repository&lt;br&gt;
👉 &lt;a href="https://github.com/Azmat-Ahmed/E-Commerce-Style-App" rel="noopener noreferrer"&gt;https://github.com/Azmat-Ahmed/E-Commerce-Style-App&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🧠 What This Project Covers&lt;/p&gt;

&lt;p&gt;This project implements a complete CI/CD workflow:&lt;/p&gt;

&lt;p&gt;Node.js E-commerce style web application&lt;/p&gt;

&lt;p&gt;Jenkins for Continuous Integration (CI)&lt;/p&gt;

&lt;p&gt;Docker for containerization&lt;/p&gt;

&lt;p&gt;Docker Hub as image registry&lt;/p&gt;

&lt;p&gt;Kubernetes for orchestration&lt;/p&gt;

&lt;p&gt;Argo CD for GitOps-based Continuous Deployment (CD)&lt;/p&gt;

&lt;p&gt;Separate Git repositories for source code and Kubernetes manifests&lt;/p&gt;

&lt;p&gt;🏗 Project Architecture (High Level)&lt;br&gt;
Developer → GitHub (Source Repo)&lt;br&gt;
        → Jenkins (CI Pipeline)&lt;br&gt;
        → Docker Build &amp;amp; Push&lt;br&gt;
        → Docker Hub&lt;br&gt;
        → Argo CD Image Updater&lt;br&gt;
        → GitHub (Manifest Repo)&lt;br&gt;
        → Argo CD&lt;br&gt;
        → Kubernetes Cluster&lt;/p&gt;

&lt;p&gt;📦 Application Overview&lt;/p&gt;

&lt;p&gt;The application is a Node.js Express web app with:&lt;/p&gt;

&lt;p&gt;A clean, professional frontend&lt;/p&gt;

&lt;p&gt;Navigation bar and product cards&lt;/p&gt;

&lt;p&gt;Backend API serving product data&lt;/p&gt;

&lt;p&gt;The app runs on port 3000 and is fully containerized using Docker.&lt;/p&gt;

&lt;p&gt;🔁 Why Two Git Repositories?&lt;br&gt;
1️⃣ Source Code Repository&lt;/p&gt;

&lt;p&gt;This repo contains:&lt;/p&gt;

&lt;p&gt;Node.js application code&lt;/p&gt;

&lt;p&gt;Frontend assets&lt;/p&gt;

&lt;p&gt;Dockerfile&lt;/p&gt;

&lt;p&gt;Jenkinsfile&lt;/p&gt;

&lt;p&gt;👉 This repo is responsible for CI (build, test, image creation).&lt;/p&gt;

&lt;p&gt;🔗 Source Repo:&lt;br&gt;
&lt;a href="https://github.com/Azmat-Ahmed/E-Commerce-Style-App" rel="noopener noreferrer"&gt;https://github.com/Azmat-Ahmed/E-Commerce-Style-App&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2️⃣ Kubernetes Manifest Repository&lt;/p&gt;

&lt;p&gt;This repo contains:&lt;/p&gt;

&lt;p&gt;deployment.yaml&lt;/p&gt;

&lt;p&gt;service.yaml&lt;/p&gt;

&lt;p&gt;ingress.yaml&lt;/p&gt;

&lt;p&gt;👉 This repo defines what runs in Kubernetes.&lt;br&gt;
Argo CD continuously watches this repository.&lt;/p&gt;

&lt;p&gt;This separation follows the GitOps principle:&lt;/p&gt;

&lt;p&gt;Git is the single source of truth for deployments.&lt;/p&gt;

&lt;p&gt;⚙️ CI: Jenkins Pipeline&lt;/p&gt;

&lt;p&gt;Whenever code is pushed to GitHub:&lt;/p&gt;

&lt;p&gt;GitHub Webhook triggers Jenkins&lt;/p&gt;

&lt;p&gt;Jenkins pipeline runs:&lt;/p&gt;

&lt;p&gt;Code checkout&lt;/p&gt;

&lt;p&gt;Docker image build&lt;/p&gt;

&lt;p&gt;Docker image push to Docker Hub&lt;/p&gt;

&lt;p&gt;Jenkins stops if any step fails&lt;/p&gt;

&lt;p&gt;This ensures only valid, buildable code moves forward.&lt;/p&gt;

&lt;p&gt;🐳 Docker Image Strategy&lt;/p&gt;

&lt;p&gt;Each Jenkins build creates a new Docker image tag (e.g. build number or version).&lt;/p&gt;

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

&lt;p&gt;azmatahmed/devops-shop:12&lt;/p&gt;

&lt;p&gt;This image is pushed to Docker Hub and becomes available for deployment.&lt;/p&gt;

&lt;p&gt;🔄 CD with Argo CD &amp;amp; Image Updater (GitOps)&lt;br&gt;
Argo CD Image Updater&lt;/p&gt;

&lt;p&gt;Monitors Docker Hub for new image tags&lt;/p&gt;

&lt;p&gt;Automatically updates the image tag in the Kubernetes manifest repo&lt;/p&gt;

&lt;p&gt;Commits the change back to Git&lt;/p&gt;

&lt;p&gt;Argo CD&lt;/p&gt;

&lt;p&gt;Watches the manifest repository&lt;/p&gt;

&lt;p&gt;Detects changes in YAML files&lt;/p&gt;

&lt;p&gt;Automatically syncs Kubernetes cluster state with Git&lt;/p&gt;

&lt;p&gt;⚠️ Jenkins does not deploy directly to Kubernetes&lt;br&gt;
Deployment happens only via Git changes.&lt;/p&gt;

&lt;p&gt;This is modern GitOps CD.&lt;/p&gt;

&lt;p&gt;☸ Kubernetes Deployment&lt;/p&gt;

&lt;p&gt;The Kubernetes setup includes:&lt;/p&gt;

&lt;p&gt;Deployment: runs multiple replicas of the app&lt;/p&gt;

&lt;p&gt;Service: exposes the app internally&lt;/p&gt;

&lt;p&gt;Ingress: routes external traffic to the service&lt;/p&gt;

&lt;p&gt;Once Argo CD syncs:&lt;/p&gt;

&lt;p&gt;New pods are created&lt;/p&gt;

&lt;p&gt;Old pods are terminated&lt;/p&gt;

&lt;p&gt;Zero-downtime rolling update occurs&lt;/p&gt;

&lt;p&gt;✅ Benefits of This Approach&lt;/p&gt;

&lt;p&gt;Clear separation of CI and CD&lt;/p&gt;

&lt;p&gt;No direct cluster access from Jenkins&lt;/p&gt;

&lt;p&gt;Full deployment history in Git&lt;/p&gt;

&lt;p&gt;Easy rollback using Git revert&lt;/p&gt;

&lt;p&gt;Production-ready GitOps workflow&lt;/p&gt;

&lt;p&gt;🎯 Final Thoughts&lt;/p&gt;

&lt;p&gt;This project represents how CI/CD is implemented in modern DevOps teams:&lt;/p&gt;

&lt;p&gt;Jenkins focuses on building and testing&lt;/p&gt;

&lt;p&gt;Docker ensures consistency&lt;/p&gt;

&lt;p&gt;Kubernetes manages scalability&lt;/p&gt;

&lt;p&gt;Argo CD provides safe, auditable deployments&lt;/p&gt;

&lt;p&gt;If you’re learning DevOps, mastering this flow will give you a strong industry-level foundation.&lt;/p&gt;

&lt;p&gt;🔗 Useful Links&lt;/p&gt;

&lt;p&gt;Source Code Repo:&lt;br&gt;
&lt;a href="https://github.com/Azmat-Ahmed/E-Commerce-Style-App" rel="noopener noreferrer"&gt;https://github.com/Azmat-Ahmed/E-Commerce-Style-App&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>gitops</category>
      <category>argocd</category>
      <category>jenkins</category>
    </item>
    <item>
      <title>🚀 End-to-End DevOps Project: Deploying a Node.js App on AWS EC2 with Docker, Kubernetes &amp; Ingress</title>
      <dc:creator>Azmat Ahmed</dc:creator>
      <pubDate>Fri, 23 Jan 2026 15:15:43 +0000</pubDate>
      <link>https://forem.com/azmatahmed/end-to-end-devops-project-deploying-a-nodejs-app-on-aws-ec2-with-docker-kubernetes-ingress-47pp</link>
      <guid>https://forem.com/azmatahmed/end-to-end-devops-project-deploying-a-nodejs-app-on-aws-ec2-with-docker-kubernetes-ingress-47pp</guid>
      <description>&lt;p&gt;Today I completed a full real-world DevOps deployment where I built, containerized, and deployed a Node.js application using Docker, Kubernetes, Minikube, Ingress, HTTPS, and RBAC, all running on AWS EC2.&lt;/p&gt;

&lt;p&gt;This project helped me connect all core DevOps concepts into one working system.&lt;/p&gt;

&lt;p&gt;🔧 Tech Stack Used&lt;/p&gt;

&lt;p&gt;Node.js – Application layer&lt;/p&gt;

&lt;p&gt;Docker (Multi-Stage Build) – Optimized container image&lt;/p&gt;

&lt;p&gt;Docker Hub – Image registry&lt;/p&gt;

&lt;p&gt;AWS EC2 (Linux) – Cloud infrastructure&lt;/p&gt;

&lt;p&gt;Kubernetes (Minikube) – Container orchestration&lt;/p&gt;

&lt;p&gt;kubectl – Cluster management&lt;/p&gt;

&lt;p&gt;Kubernetes Deployment &amp;amp; Service&lt;/p&gt;

&lt;p&gt;NodePort Service&lt;/p&gt;

&lt;p&gt;Ingress Controller&lt;/p&gt;

&lt;p&gt;HTTPS (TLS Certificates)&lt;/p&gt;

&lt;p&gt;Docker Volumes &amp;amp; Networks&lt;/p&gt;

&lt;p&gt;RBAC (Role &amp;amp; RoleBinding)&lt;/p&gt;

&lt;p&gt;🧱 Step 1: Node.js Application&lt;/p&gt;

&lt;p&gt;I started with a simple Node.js web application that serves a static page to confirm deployment status.&lt;/p&gt;

&lt;p&gt;🐳 Step 2: Docker Multi-Stage Build&lt;/p&gt;

&lt;p&gt;To keep the image lightweight and production-ready, I used a multi-stage Docker build:&lt;/p&gt;

&lt;p&gt;FROM node:18 AS build&lt;br&gt;
WORKDIR /app&lt;br&gt;
COPY package*.json ./&lt;br&gt;
RUN npm install&lt;br&gt;
COPY . .&lt;/p&gt;

&lt;p&gt;FROM node:18-alpine&lt;br&gt;
WORKDIR /app&lt;br&gt;
COPY --from=build /app .&lt;br&gt;
EXPOSE 3000&lt;br&gt;
CMD ["node", "app.js"]&lt;/p&gt;

&lt;p&gt;Benefits:&lt;/p&gt;

&lt;p&gt;Smaller image size&lt;/p&gt;

&lt;p&gt;Faster deployments&lt;/p&gt;

&lt;p&gt;Better security&lt;/p&gt;

&lt;p&gt;📦 Step 3: Push Image to Docker Hub&lt;br&gt;
docker build -t /devops-node .&lt;br&gt;
docker login&lt;br&gt;
docker push /devops-node&lt;/p&gt;

&lt;p&gt;Now the image is accessible from anywhere, including Kubernetes.&lt;/p&gt;

&lt;p&gt;☁️ Step 4: AWS EC2 Setup&lt;/p&gt;

&lt;p&gt;Launched an EC2 Linux instance&lt;/p&gt;

&lt;p&gt;Installed:&lt;/p&gt;

&lt;p&gt;Docker&lt;/p&gt;

&lt;p&gt;kubectl&lt;/p&gt;

&lt;p&gt;Minikube&lt;/p&gt;

&lt;p&gt;Ran Minikube inside EC2 to simulate a real Kubernetes environment&lt;/p&gt;

&lt;p&gt;☸️ Step 5: Kubernetes Deployment&lt;/p&gt;

&lt;p&gt;Created a Deployment with multiple replicas:&lt;/p&gt;

&lt;p&gt;apiVersion: apps/v1&lt;br&gt;
kind: Deployment&lt;br&gt;
metadata:&lt;br&gt;
  name: node-deploy&lt;br&gt;
spec:&lt;br&gt;
  replicas: 2&lt;br&gt;
  selector:&lt;br&gt;
    matchLabels:&lt;br&gt;
      app: node&lt;br&gt;
  template:&lt;br&gt;
    metadata:&lt;br&gt;
      labels:&lt;br&gt;
        app: node&lt;br&gt;
    spec:&lt;br&gt;
      containers:&lt;br&gt;
      - name: node&lt;br&gt;
        image: /devops-node&lt;br&gt;
        ports:&lt;br&gt;
        - containerPort: 3000&lt;/p&gt;

&lt;p&gt;Applied using:&lt;/p&gt;

&lt;p&gt;kubectl apply -f deployment.yaml&lt;/p&gt;

&lt;p&gt;🌐 Step 6: Kubernetes Service (NodePort)&lt;br&gt;
apiVersion: v1&lt;br&gt;
kind: Service&lt;br&gt;
metadata:&lt;br&gt;
  name: node-service&lt;br&gt;
spec:&lt;br&gt;
  type: NodePort&lt;br&gt;
  selector:&lt;br&gt;
    app: node&lt;br&gt;
  ports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;port: 80
targetPort: 3000&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This exposed the app internally within the cluster.&lt;/p&gt;

&lt;p&gt;🔀 Step 7: Ingress Controller&lt;/p&gt;

&lt;p&gt;Enabled ingress in Minikube:&lt;/p&gt;

&lt;p&gt;minikube addons enable ingress&lt;/p&gt;

&lt;p&gt;Ingress configuration:&lt;/p&gt;

&lt;p&gt;apiVersion: networking.k8s.io/v1&lt;br&gt;
kind: Ingress&lt;br&gt;
metadata:&lt;br&gt;
  name: node-ingress&lt;br&gt;
spec:&lt;br&gt;
  rules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;host: devops.local
http:
  paths:

&lt;ul&gt;
&lt;li&gt;path: /
pathType: Prefix
backend:
  service:
    name: node-service
    port:
      number: 80&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Mapped the domain in /etc/hosts:&lt;/p&gt;

&lt;p&gt; devops.local&lt;/p&gt;

&lt;p&gt;🔐 Step 8: HTTPS with TLS&lt;/p&gt;

&lt;p&gt;Generated certificates:&lt;/p&gt;

&lt;p&gt;openssl req -x509 -nodes -days 365 -newkey rsa:2048 \&lt;br&gt;
-keyout key.pem -out cert.pem&lt;/p&gt;

&lt;p&gt;Created Kubernetes TLS secret:&lt;/p&gt;

&lt;p&gt;kubectl create secret tls node-tls --cert=cert.pem --key=key.pem&lt;/p&gt;

&lt;p&gt;Updated ingress with TLS configuration and re-applied it.&lt;/p&gt;

&lt;p&gt;The site now runs on HTTPS.&lt;/p&gt;

&lt;p&gt;📦 Step 9: Docker Volumes &amp;amp; Network&lt;/p&gt;

&lt;p&gt;Created Docker volume for persistent data&lt;/p&gt;

&lt;p&gt;Used Docker networks for container communication&lt;/p&gt;

&lt;p&gt;Ensured clean separation of concerns&lt;/p&gt;

&lt;p&gt;🔐 Step 10: RBAC Security&lt;/p&gt;

&lt;p&gt;Created a Role:&lt;/p&gt;

&lt;p&gt;apiVersion: rbac.authorization.k8s.io/v1&lt;br&gt;
kind: Role&lt;br&gt;
metadata:&lt;br&gt;
  name: devops-role&lt;br&gt;
rules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list"]&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bound it using RoleBinding:&lt;/p&gt;

&lt;p&gt;apiVersion: rbac.authorization.k8s.io/v1&lt;br&gt;
kind: RoleBinding&lt;br&gt;
metadata:&lt;br&gt;
  name: devops-binding&lt;br&gt;
subjects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;kind: User
name: devops-user
roleRef:
kind: Role
name: devops-role
apiGroup: rbac.authorization.k8s.io&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This ensured least-privilege access inside the cluster.&lt;/p&gt;

&lt;p&gt;✅ Final Outcome&lt;/p&gt;

&lt;p&gt;✔ Node.js app running on AWS EC2&lt;br&gt;
✔ Docker multi-stage image pushed to Docker Hub&lt;br&gt;
✔ Kubernetes Deployment &amp;amp; Service&lt;br&gt;
✔ Ingress routing with HTTPS&lt;br&gt;
✔ Persistent storage using volumes&lt;br&gt;
✔ Secure access using RBAC&lt;/p&gt;

&lt;p&gt;🎯 What I Learned&lt;/p&gt;

&lt;p&gt;How real DevOps components connect end-to-end&lt;/p&gt;

&lt;p&gt;Debugging Kubernetes ImagePullBackOff issues&lt;/p&gt;

&lt;p&gt;Difference between NodePort, Service &amp;amp; Ingress&lt;/p&gt;

&lt;p&gt;HTTPS using Kubernetes TLS secrets&lt;/p&gt;

&lt;p&gt;Importance of RBAC in production clusters&lt;/p&gt;

</description>
      <category>devops</category>
      <category>aws</category>
      <category>ingress</category>
      <category>docker</category>
    </item>
    <item>
      <title>DevOps Week 16: Kubernetes RBAC Hands-On — Securing Cluster Access</title>
      <dc:creator>Azmat Ahmed</dc:creator>
      <pubDate>Sat, 11 Oct 2025 17:40:38 +0000</pubDate>
      <link>https://forem.com/azmatahmed/devops-week-16-kubernetes-rbac-hands-on-securing-cluster-access-44c2</link>
      <guid>https://forem.com/azmatahmed/devops-week-16-kubernetes-rbac-hands-on-securing-cluster-access-44c2</guid>
      <description>&lt;p&gt;🧩 What I Learned This Week&lt;/p&gt;

&lt;p&gt;This week in my DevOps journey, I implemented Kubernetes RBAC (Role-Based Access Control) — a critical mechanism for securing clusters and controlling user permissions.&lt;/p&gt;

&lt;p&gt;⚙️ Hands-on Practice&lt;/p&gt;

&lt;p&gt;Created a developer ServiceAccount&lt;/p&gt;

&lt;p&gt;kubectl create serviceaccount dev-user -n default&lt;/p&gt;

&lt;p&gt;Defined read-only permissions&lt;/p&gt;

&lt;p&gt;kind: Role&lt;br&gt;
metadata:&lt;br&gt;
  name: pod-reader&lt;br&gt;
  namespace: default&lt;br&gt;
rules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bound the Role to the developer&lt;/p&gt;

&lt;p&gt;kind: RoleBinding&lt;br&gt;
metadata:&lt;br&gt;
  name: read-pods&lt;br&gt;
subjects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;kind: ServiceAccount
name: dev-user
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tested access&lt;/p&gt;

&lt;p&gt;kubectl auth can-i list pods --as=system:serviceaccount:default:dev-user -n default  # yes&lt;br&gt;
kubectl auth can-i delete pods --as=system:serviceaccount:default:dev-user -n default # no&lt;/p&gt;

&lt;p&gt;🔐 Why RBAC Matters in DevOps&lt;/p&gt;

&lt;p&gt;Prevents unauthorized resource changes&lt;/p&gt;

&lt;p&gt;Separates developer/tester/admin access&lt;/p&gt;

&lt;p&gt;Enhances security compliance&lt;/p&gt;

&lt;p&gt;Protects your Kubernetes workloads&lt;/p&gt;

&lt;p&gt;🌱 Conclusion&lt;/p&gt;

&lt;p&gt;RBAC is not just theory — it’s a real-world Kubernetes security control.&lt;br&gt;
Through this week’s practice, I learned how to:&lt;/p&gt;

&lt;p&gt;Create roles and bindings&lt;/p&gt;

&lt;p&gt;Apply permissions to users&lt;/p&gt;

&lt;p&gt;Validate actions using kubectl auth can-i&lt;/p&gt;

&lt;p&gt;A must-learn for every DevOps engineer aiming for real-world Kubernetes expertise!&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>devops</category>
      <category>minikube</category>
      <category>permissions</category>
    </item>
    <item>
      <title>My DevOps Week 15 Journey: Kubernetes Deployments, Services, and NGINX Ingress</title>
      <dc:creator>Azmat Ahmed</dc:creator>
      <pubDate>Sat, 11 Oct 2025 13:26:36 +0000</pubDate>
      <link>https://forem.com/azmatahmed/my-devops-week-15-journey-kubernetes-deployments-services-and-nginx-ingress-2ia1</link>
      <guid>https://forem.com/azmatahmed/my-devops-week-15-journey-kubernetes-deployments-services-and-nginx-ingress-2ia1</guid>
      <description>&lt;p&gt;Content:&lt;/p&gt;

&lt;p&gt;This week, I focused on Kubernetes hands-on practice using Minikube. Here’s a summary of everything I learned:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Minikube Setup&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Installed and configured Minikube&lt;/p&gt;

&lt;p&gt;Set up Master and Worker Nodes&lt;/p&gt;

&lt;p&gt;Explored master components (API Server, Scheduler, Controller Manager, etcd)&lt;/p&gt;

&lt;p&gt;Learned how Kubelet runs containers on nodes&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Deploying Applications&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Deployed Nginx, Apache, and Redis via apps.yaml&lt;/p&gt;

&lt;p&gt;Exposed apps with NodePort Services&lt;/p&gt;

&lt;p&gt;Key commands:&lt;/p&gt;

&lt;p&gt;kubectl get pods&lt;br&gt;
kubectl describe pod &lt;br&gt;
kubectl logs &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Self-Healing and Scaling&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Created Deployment with 3–4 replicas&lt;/p&gt;

&lt;p&gt;Deleted a pod manually to test self-healing&lt;/p&gt;

&lt;p&gt;Monitored pods with:&lt;/p&gt;

&lt;p&gt;kubectl get pods -w&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Kubernetes Services&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;ClusterIP: Internal access&lt;/p&gt;

&lt;p&gt;NodePort: External access via :&lt;/p&gt;

&lt;p&gt;LoadBalancer: External access in cloud setups&lt;/p&gt;

&lt;p&gt;Services control internal/external routing&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;NGINX Ingress &amp;amp; HTTPS&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Enabled NGINX Ingress in Minikube&lt;/p&gt;

&lt;p&gt;Created Ingress YAML for custom domain routing&lt;/p&gt;

&lt;p&gt;Secured app with TLS/HTTPS:&lt;/p&gt;

&lt;p&gt;kubectl create secret tls -tls --cert=tls.crt --key=tls.key&lt;/p&gt;

&lt;p&gt;Verified routing and HTTPS access&lt;/p&gt;

&lt;p&gt;Key Learnings&lt;/p&gt;

&lt;p&gt;Kubernetes provides high availability, self-healing, and scaling&lt;/p&gt;

&lt;p&gt;Services + Ingress enable secure external access&lt;/p&gt;

&lt;p&gt;Deployments and ReplicaSets ensure reliable pod management&lt;/p&gt;

&lt;p&gt;Hands-on practice with Minikube strengthens understanding of Kubernetes architecture&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>devops</category>
      <category>minikube</category>
    </item>
    <item>
      <title># 🚀 DevOps Journey — Week 14: **Kubernetes Scaling &amp; Automation**</title>
      <dc:creator>Azmat Ahmed</dc:creator>
      <pubDate>Sun, 28 Sep 2025 06:55:30 +0000</pubDate>
      <link>https://forem.com/azmatahmed/-devops-journey-week-14-kubernetes-scaling-automation-5chl</link>
      <guid>https://forem.com/azmatahmed/-devops-journey-week-14-kubernetes-scaling-automation-5chl</guid>
      <description>&lt;p&gt;In my &lt;strong&gt;DevOps Journey Week 14&lt;/strong&gt;, I moved from Docker &amp;amp; Compose into the world of &lt;strong&gt;Kubernetes&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
This was a huge milestone: learning how to handle &lt;strong&gt;scaling, automation, and thousands of users without downtime&lt;/strong&gt;.  &lt;/p&gt;




&lt;h2&gt;
  
  
  🔹 Step 1: Docker Networking
&lt;/h2&gt;

&lt;p&gt;Before K8s, I explored Docker networking:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bridge&lt;/strong&gt; → local isolated communication
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Host&lt;/strong&gt; → container shares host’s network
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Overlay&lt;/strong&gt; → multi-host (Swarm, cluster setups)
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔹 Step 2: Docker Compose
&lt;/h2&gt;

&lt;p&gt;Next, I practiced &lt;strong&gt;multi-service apps&lt;/strong&gt;:&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
yaml
version: "3.9"
services:
  web:
    image: nginx
  db:
    image: mysql:5.7
With a single command:

bash
Copy code
docker-compose up -d
This was enough for small dev projects.

🔹 Step 3: Kubernetes — the Game Changer
Here’s where Week 14 really leveled up.
Kubernetes gave me:

Scaling → add more pods instantly.

Self-healing → crashed pods restart automatically.

Rolling updates → zero downtime deploys.

Load balancing → spread traffic across pods.

Commands I used:
bash
Copy code
kubectl create deployment web --image=nginx
kubectl expose deployment web --type=NodePort --port=80
kubectl scale deployment web --replicas=5
kubectl get pods
🔥 Reflection
Docker was my foundation.

Docker Compose gave me small multi-service apps.

But Kubernetes unlocked production-level orchestration.

This week felt like moving from “developer” → “DevOps engineer.”

#devops #docker #kubernetes #devto #devopsjourney
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>devops</category>
      <category>docker</category>
      <category>kubernetes</category>
      <category>devopsjourney</category>
    </item>
    <item>
      <title>🚀 Week 13 DevOps Journey: Multi-Stage Docker Builds (From 1.2GB 3MB)</title>
      <dc:creator>Azmat Ahmed</dc:creator>
      <pubDate>Tue, 16 Sep 2025 09:09:10 +0000</pubDate>
      <link>https://forem.com/azmatahmed/week-13-devops-journey-multi-stage-docker-builds-from-12gb-3mb-5eij</link>
      <guid>https://forem.com/azmatahmed/week-13-devops-journey-multi-stage-docker-builds-from-12gb-3mb-5eij</guid>
      <description>&lt;p&gt;While working through my DevOps journey (Week 13), I deployed a Node.js app to AWS EC2 and compared single-stage vs multi-stage Docker builds.&lt;/p&gt;

&lt;p&gt;Here’s what I learned 👇&lt;/p&gt;

&lt;p&gt;🐳 Simple Dockerfile&lt;/p&gt;

&lt;p&gt;Uses a full Node.js base image.&lt;/p&gt;

&lt;p&gt;Includes build tools + dependencies.&lt;/p&gt;

&lt;p&gt;Final size: 1.2GB.&lt;/p&gt;

&lt;p&gt;⚡ Multi-Stage Dockerfile&lt;/p&gt;

&lt;p&gt;Build stage: compiles and prepares app.&lt;/p&gt;

&lt;p&gt;Run stage: copies only the essentials.&lt;/p&gt;

&lt;p&gt;Base: distroless image.&lt;/p&gt;

&lt;p&gt;Final size: 3MB 😍.&lt;/p&gt;

&lt;p&gt;Why This Matters in DevOps&lt;/p&gt;

&lt;p&gt;Production environments need lightweight images.&lt;/p&gt;

&lt;p&gt;Faster push/pull → smoother CI/CD pipelines.&lt;/p&gt;

&lt;p&gt;Lower resource usage on servers.&lt;/p&gt;

&lt;p&gt;More secure (no unnecessary OS packages).&lt;/p&gt;

&lt;p&gt;🔗 Check out my implementation here: GitHub Repo&lt;/p&gt;

&lt;p&gt;🌐 See more about me: &lt;a href="https://azmatahmed.netlify.app" rel="noopener noreferrer"&gt;https://azmatahmed.netlify.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Keywords: Docker, Multi-stage builds, Node.js Dockerfile, AWS EC2, Distroless images, DevOps best practices, Optimize Docker images, DevOps learning.&lt;/p&gt;

</description>
      <category>docker</category>
      <category>multistagebuilds</category>
      <category>awsec2</category>
      <category>devopslearning</category>
    </item>
    <item>
      <title>🚀 Docker in DevOps – Node.js Deployment on AWS EC2 (Week 12 Journey)</title>
      <dc:creator>Azmat Ahmed</dc:creator>
      <pubDate>Mon, 08 Sep 2025 08:07:20 +0000</pubDate>
      <link>https://forem.com/azmatahmed/docker-in-devops-nodejs-deployment-on-aws-ec2-week-12-journey-4b1e</link>
      <guid>https://forem.com/azmatahmed/docker-in-devops-nodejs-deployment-on-aws-ec2-week-12-journey-4b1e</guid>
      <description>&lt;p&gt;🚀 Docker in DevOps – Node.js Deployment on AWS EC2 (Week 12 Journey)&lt;/p&gt;

&lt;p&gt;In &lt;strong&gt;Week 12 of my DevOps journey&lt;/strong&gt;, I focused on &lt;strong&gt;Docker&lt;/strong&gt; and successfully deployed a &lt;strong&gt;Node.js app&lt;/strong&gt; on &lt;strong&gt;AWS EC2&lt;/strong&gt;.  &lt;/p&gt;




&lt;h2&gt;
  
  
  🔹 What I Did
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Wrote a &lt;strong&gt;Dockerfile&lt;/strong&gt; with Node.js as the base image.
&lt;/li&gt;
&lt;li&gt;Installed dependencies automatically with:&lt;/li&gt;
&lt;/ul&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
dockerfile
  COPY package*.json ./
  RUN npm install
Built image:

bash
Copy code
docker build -t my-node-app .
Ran container:

bash
Copy code
docker run -p 3000:3000 my-node-app
Configured AWS EC2 security groups for port 3000.

🔹 Why Docker?
Removes manual setup

Creates consistent environments

Speeds up deployments

Root tool of DevOps automation

📂 Links
👉 GitHub Repo: https://github.com/azmatahmed11/docker-push-docker
🌐 Portfolio: https://azmatahmed.netlify.app/

🔑 Keywords
Docker, DevOps, Node.js app deployment, AWS EC2, Dockerfile, containerization, automation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>docker</category>
      <category>devops</category>
      <category>automation</category>
      <category>aws</category>
    </item>
    <item>
      <title>🚀 Week 11 of My DevOps Journey: GitHub Actions CI/CD on AWS EC2</title>
      <dc:creator>Azmat Ahmed</dc:creator>
      <pubDate>Sat, 30 Aug 2025 10:36:04 +0000</pubDate>
      <link>https://forem.com/azmatahmed/-week-11-of-my-devops-journey-github-actions-cicd-on-aws-ec2-4pj3</link>
      <guid>https://forem.com/azmatahmed/-week-11-of-my-devops-journey-github-actions-cicd-on-aws-ec2-4pj3</guid>
      <description>&lt;p&gt;This week I got hands-on with GitHub Actions and built a CI/CD pipeline to deploy my Node.js app to AWS EC2.&lt;/p&gt;

&lt;p&gt;Unlike Jenkins, GitHub Actions doesn’t require setting up servers or webhooks manually — everything happens in the .yml workflow file. It’s a much smoother process for automation.&lt;/p&gt;

&lt;p&gt;🔧 What I Achieved&lt;/p&gt;

&lt;p&gt;Built and configured GitHub Actions pipeline.&lt;/p&gt;

&lt;p&gt;Automated deployment of Node.js app to AWS EC2.&lt;/p&gt;

&lt;p&gt;Handled multiple errors during pipeline creation.&lt;/p&gt;

&lt;p&gt;Successfully exposed the app on port 3000 by configuring AWS EC2 security rules.&lt;/p&gt;

&lt;p&gt;💡 Takeaway&lt;/p&gt;

&lt;p&gt;GitHub Actions simplifies CI/CD automation, making deployment faster, easier, and fully integrated with GitHub.&lt;/p&gt;

&lt;h1&gt;
  
  
  devops #github #githubactions #cicd #aws #node #cloud #ec2 #automation #deployment
&lt;/h1&gt;

</description>
      <category>devops</category>
      <category>cloud</category>
      <category>githubactions</category>
      <category>cicd</category>
    </item>
    <item>
      <title>🚀 DevOps Journey– Week 10 (Mastering Jenkins CI/CD)</title>
      <dc:creator>Azmat Ahmed</dc:creator>
      <pubDate>Wed, 20 Aug 2025 16:29:55 +0000</pubDate>
      <link>https://forem.com/azmatahmed/devops-journey-week-10-mastering-jenkins-cicd-5c7e</link>
      <guid>https://forem.com/azmatahmed/devops-journey-week-10-mastering-jenkins-cicd-5c7e</guid>
      <description>&lt;p&gt;🔹 Recap&lt;/p&gt;

&lt;p&gt;This week was all about Jenkins. I built multiple pipelines and deployed my Node.js app to AWS EC2 using Jenkins. Now, when I update my GitHub repo and click Build Now, Jenkins automatically updates my app on EC2.&lt;/p&gt;

&lt;p&gt;✅ Achievements&lt;/p&gt;

&lt;p&gt;Set up Jenkins on my server&lt;/p&gt;

&lt;p&gt;Configured Jenkins pipeline for Node.js app&lt;/p&gt;

&lt;p&gt;Connected GitHub → Jenkins → EC2 deployment&lt;/p&gt;

&lt;p&gt;Used PM2 to manage and restart the Node.js app&lt;/p&gt;

&lt;p&gt;Automated CI/CD successfully 🎉&lt;/p&gt;

&lt;p&gt;🔹 Jenkins Pipeline Script&lt;br&gt;
pipeline {&lt;br&gt;
    agent any&lt;br&gt;
    stages {&lt;br&gt;
        stage('Checkout') {&lt;br&gt;
            steps {&lt;br&gt;
                git branch: 'main',&lt;br&gt;
                    url: '&lt;a href="https://github.com/Azmat-Ahmed/deploycicd.git" rel="noopener noreferrer"&gt;https://github.com/Azmat-Ahmed/deploycicd.git&lt;/a&gt;'&lt;br&gt;
            }&lt;br&gt;
        }&lt;br&gt;
        stage('Dependencies') {&lt;br&gt;
            steps {&lt;br&gt;
                sh 'npm install'&lt;br&gt;
            }&lt;br&gt;
        }&lt;br&gt;
        stage('Deploy') {&lt;br&gt;
            steps {&lt;br&gt;
                sh """&lt;br&gt;
                ssh -o StrictHostKeyChecking=no -i /var/lib/jenkins/test.pem ubuntu@ &amp;lt;&amp;lt; 'EOF'&lt;br&gt;
                    cd /home/ubuntu/deploycicd&lt;br&gt;
                    git pull origin main&lt;br&gt;
                    npm install&lt;br&gt;
                    pm2 restart app.js || pm2 start app.js&lt;br&gt;
                EOF&lt;br&gt;
                """&lt;br&gt;
            }&lt;br&gt;
        }&lt;br&gt;
    }&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;🎯 What’s Next?&lt;/p&gt;

&lt;p&gt;In the next stage of my journey, I will be exploring:&lt;/p&gt;

&lt;p&gt;GitHub Webhooks → for fully automated Jenkins triggers&lt;/p&gt;

&lt;p&gt;GitHub Actions → GitHub’s native CI/CD tool&lt;/p&gt;

&lt;p&gt;But for now, I can confidently say: Week 10 = Jenkins Mastery ✅&lt;/p&gt;

&lt;p&gt;👉 My portfolio: &lt;a href="https://azmatahmed.netlify.app" rel="noopener noreferrer"&gt;https://azmatahmed.netlify.app&lt;/a&gt;&lt;/p&gt;

</description>
      <category>jenkins</category>
      <category>cicd</category>
      <category>devops</category>
      <category>aws</category>
    </item>
    <item>
      <title>🚀 DevOps Journey – Week 10 (Mastering Jenkins CI/CD)</title>
      <dc:creator>Azmat Ahmed</dc:creator>
      <pubDate>Wed, 20 Aug 2025 16:23:25 +0000</pubDate>
      <link>https://forem.com/azmatahmed/devops-journey-week-10-mastering-jenkins-cicd-i1k</link>
      <guid>https://forem.com/azmatahmed/devops-journey-week-10-mastering-jenkins-cicd-i1k</guid>
      <description>&lt;p&gt;🔹 Recap&lt;/p&gt;

&lt;p&gt;This week was all about Jenkins. I built multiple pipelines and deployed my Node.js app to AWS EC2 using Jenkins. Now, when I update my GitHub repo and click Build Now, Jenkins automatically updates my app on EC2.&lt;/p&gt;

&lt;p&gt;✅ Achievements&lt;/p&gt;

&lt;p&gt;Set up Jenkins on my server&lt;/p&gt;

&lt;p&gt;Configured Jenkins pipeline for Node.js app&lt;/p&gt;

&lt;p&gt;Connected GitHub → Jenkins → EC2 deployment&lt;/p&gt;

&lt;p&gt;Used PM2 to manage and restart the Node.js app&lt;/p&gt;

&lt;p&gt;Automated CI/CD successfully 🎉&lt;/p&gt;

&lt;p&gt;🔹 Jenkins Pipeline Script&lt;br&gt;
pipeline {&lt;br&gt;
    agent any&lt;br&gt;
    stages {&lt;br&gt;
        stage('Checkout') {&lt;br&gt;
            steps {&lt;br&gt;
                git branch: 'main',&lt;br&gt;
                    url: '&lt;a href="https://github.com/Azmat-Ahmed/deploycicd.git" rel="noopener noreferrer"&gt;https://github.com/Azmat-Ahmed/deploycicd.git&lt;/a&gt;'&lt;br&gt;
            }&lt;br&gt;
        }&lt;br&gt;
        stage('Dependencies') {&lt;br&gt;
            steps {&lt;br&gt;
                sh 'npm install'&lt;br&gt;
            }&lt;br&gt;
        }&lt;br&gt;
        stage('Deploy') {&lt;br&gt;
            steps {&lt;br&gt;
                sh """&lt;br&gt;
                ssh -o StrictHostKeyChecking=no -i /var/lib/jenkins/test.pem ubuntu@ &amp;lt;&amp;lt; 'EOF'&lt;br&gt;
                    cd /home/ubuntu/deploycicd&lt;br&gt;
                    git pull origin main&lt;br&gt;
                    npm install&lt;br&gt;
                    pm2 restart app.js || pm2 start app.js&lt;br&gt;
                EOF&lt;br&gt;
                """&lt;br&gt;
            }&lt;br&gt;
        }&lt;br&gt;
    }&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;🎯 What’s Next?&lt;/p&gt;

&lt;p&gt;In the next stage of my journey, I will be exploring:&lt;/p&gt;

&lt;p&gt;GitHub Webhooks → for fully automated Jenkins triggers&lt;/p&gt;

&lt;p&gt;GitHub Actions → GitHub’s native CI/CD tool&lt;/p&gt;

&lt;p&gt;But for now, I can confidently say: Week 10 = Jenkins Mastery ✅&lt;/p&gt;

&lt;p&gt;👉 My portfolio: azmatahmed.netlify.app&lt;/p&gt;

</description>
      <category>jenkins</category>
      <category>devops</category>
      <category>clouddeployment</category>
    </item>
    <item>
      <title>Week 9 DevOps: Terraform on AWS — Remote State, Modular Code &amp; Best Practices</title>
      <dc:creator>Azmat Ahmed</dc:creator>
      <pubDate>Tue, 12 Aug 2025 09:11:14 +0000</pubDate>
      <link>https://forem.com/azmatahmed/week-9-devops-terraform-on-aws-remote-state-modular-code-best-practices-cdn</link>
      <guid>https://forem.com/azmatahmed/week-9-devops-terraform-on-aws-remote-state-modular-code-best-practices-cdn</guid>
      <description>&lt;p&gt;Hey everyone, I’m Azmat Ahmed!&lt;/p&gt;

&lt;p&gt;This week, my &lt;strong&gt;Week 9 DevOps journey&lt;/strong&gt; focused on Terraform — provisioning AWS infrastructure using Infrastructure as Code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Highlights:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Used Terraform commands: &lt;code&gt;terraform init&lt;/code&gt;, &lt;code&gt;plan&lt;/code&gt;, &lt;code&gt;apply&lt;/code&gt;, and &lt;code&gt;destroy&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Set up remote state storage on &lt;strong&gt;AWS S3&lt;/strong&gt;, with &lt;strong&gt;DynamoDB&lt;/strong&gt; for state locking — critical for collaboration&lt;/li&gt;
&lt;li&gt;Modularized Terraform files: split EC2, S3, DynamoDB resources into separate &lt;code&gt;.tf&lt;/code&gt; files&lt;/li&gt;
&lt;li&gt;Provisioned EC2 instances, created S3 buckets, and DynamoDB tables with Terraform&lt;/li&gt;
&lt;li&gt;Followed best practices: never commit &lt;code&gt;.tfstate&lt;/code&gt; files, use remote state, version control&lt;/li&gt;
&lt;li&gt;Ran Terraform on Linux, practiced debugging and deployment&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why Terraform?
&lt;/h3&gt;

&lt;p&gt;Terraform brings the power of &lt;strong&gt;Infrastructure as Code&lt;/strong&gt; — enabling automation, consistency, and scalability for cloud infrastructure.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sample Terraform file structure:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
plaintext
main.tf
variables.tf
ec2.tf
s3.tf
dynamodb.tf
outputs.tf
terraform.tfvars
Let’s connect!
Portfolio: https://azmatahmed.netlify.app

LinkedIn: https://www.linkedin.com/in/azmat-ahmed-13610a314/

Email: ahmedawan9519@gmail.com

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

&lt;/div&gt;

</description>
      <category>terraform</category>
      <category>aws</category>
      <category>devops</category>
      <category>infrastructureascode</category>
    </item>
    <item>
      <title>"DevOps Journey: Week 8 - Automating Configuration with Ansible"</title>
      <dc:creator>Azmat Ahmed</dc:creator>
      <pubDate>Mon, 04 Aug 2025 03:44:48 +0000</pubDate>
      <link>https://forem.com/azmatahmed/devops-journey-week-8-automating-configuration-with-ansible-4j73</link>
      <guid>https://forem.com/azmatahmed/devops-journey-week-8-automating-configuration-with-ansible-4j73</guid>
      <description>&lt;p&gt;Hey everyone! 👋&lt;/p&gt;

&lt;p&gt;I’ve just wrapped up &lt;strong&gt;Week 8&lt;/strong&gt; of my DevOps journey, where I focused entirely on learning and applying &lt;strong&gt;Ansible&lt;/strong&gt; — the powerful automation tool used widely in production environments.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔧 What I Covered:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Installed and configured Ansible on Ubuntu&lt;/li&gt;
&lt;li&gt;Wrote and applied &lt;strong&gt;Playbooks&lt;/strong&gt; using YAML&lt;/li&gt;
&lt;li&gt;Created and used &lt;strong&gt;Inventory Files&lt;/strong&gt; (static &amp;amp; dynamic)&lt;/li&gt;
&lt;li&gt;Explored &lt;strong&gt;Ansible Galaxy&lt;/strong&gt; to download and reuse roles&lt;/li&gt;
&lt;li&gt;Restarted services, installed packages, and configured remote servers&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🧪 Hands-On Practice:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Real-time tasks using VMs and EC2 instances&lt;/li&gt;
&lt;li&gt;Used SSH for secure communication&lt;/li&gt;
&lt;li&gt;Built modular playbooks for easier reuse&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📈 Progress Summary:
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Install Ansible&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inventory Files&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Playbooks&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ansible Galaxy&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-server Configuration&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  🔜 What’s Next:
&lt;/h2&gt;

&lt;p&gt;In &lt;strong&gt;Week 9&lt;/strong&gt;, I’ll move on to &lt;strong&gt;Terraform&lt;/strong&gt; to learn how to provision infrastructure as code.&lt;/p&gt;




&lt;h3&gt;
  
  
  🔗 Let’s Connect!
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;🌐 &lt;a href="https://azmatahmed.netlify.app/" rel="noopener noreferrer"&gt;My Portfolio&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🐙 &lt;a href="https://github.com/Azmat-Ahmed" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💼 &lt;a href="https://www.linkedin.com/in/azmat-ahmed-13610a314/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devops</category>
      <category>ansible</category>
      <category>terraform</category>
      <category>automation</category>
    </item>
  </channel>
</rss>
