<?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>DEV Community: Syed Kashif Ali</title>
    <description>The latest articles on DEV Community by Syed Kashif Ali (@syed_kashifali_2a9fe52dd).</description>
    <link>https://dev.to/syed_kashifali_2a9fe52dd</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3415073%2Fcddf5319-de23-4169-8445-6edd0a0c3917.jpeg</url>
      <title>DEV Community: Syed Kashif Ali</title>
      <link>https://dev.to/syed_kashifali_2a9fe52dd</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/syed_kashifali_2a9fe52dd"/>
    <language>en</language>
    <item>
      <title>Day -1: Building the Foundation for My AWS DevOps Journey</title>
      <dc:creator>Syed Kashif Ali</dc:creator>
      <pubDate>Fri, 14 Aug 2026 15:49:46 +0000</pubDate>
      <link>https://dev.to/syed_kashifali_2a9fe52dd/day-1-building-the-foundation-for-my-aws-devops-journey-49fk</link>
      <guid>https://dev.to/syed_kashifali_2a9fe52dd/day-1-building-the-foundation-for-my-aws-devops-journey-49fk</guid>
      <description>&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgw3ne48f4peodkjnhjcs.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgw3ne48f4peodkjnhjcs.png" alt=" " width="800" height="802"&gt;&lt;/a&gt;&lt;br&gt;
Every DevOps journey starts with tools.&lt;br&gt;
But before learning Kubernetes, Terraform, containers, or complex CI/CD pipelines, I believe it is important to understand the fundamentals that connect everything together.&lt;br&gt;
That is what I focused on during Day -1 of my AWS DevOps learning journey.&lt;br&gt;
🎯 The Goal&lt;br&gt;
The goal was not to master every AWS service.&lt;br&gt;
It was to understand the foundation:&lt;br&gt;
Linux → Git → GitHub → CI/CD → AWS&lt;br&gt;
Once these pieces are clear, learning more advanced DevOps technologies becomes much easier.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Understanding DevOps&lt;br&gt;
DevOps is more than just a collection of tools.&lt;br&gt;
It brings together:&lt;br&gt;
Development&lt;br&gt;
Operations&lt;br&gt;
Automation&lt;br&gt;
Collaboration&lt;br&gt;
Continuous delivery&lt;br&gt;
Monitoring&lt;br&gt;
The basic idea is to create a reliable path from writing code to running that code in production.&lt;br&gt;
A simplified workflow looks like:&lt;br&gt;
This workflow became the foundation for the topics I want to explore in the coming days.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Linux — The DevOps Foundation&lt;br&gt;
Linux is one of the most important foundations for DevOps engineers.&lt;br&gt;
I focused on understanding:&lt;br&gt;
File and directory structure&lt;br&gt;
Permissions&lt;br&gt;
Users and groups&lt;br&gt;
Processes&lt;br&gt;
Package management&lt;br&gt;
SSH&lt;br&gt;
Environment variables&lt;br&gt;
Basic networking commands&lt;br&gt;
Log investigation&lt;br&gt;
Some commands that every DevOps engineer should become comfortable with include:&lt;br&gt;
These commands become extremely useful when troubleshooting EC2 instances, containers, CI/CD runners, and Kubernetes nodes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Git and GitHub&lt;br&gt;
The next foundation is version control.&lt;br&gt;
Git allows us to track changes to our code and collaborate with other engineers.&lt;br&gt;
A basic workflow is:&lt;br&gt;
For example:&lt;br&gt;
But Git becomes much more powerful when combined with CI/CD.&lt;br&gt;
A simple git push can become the trigger for an entire automated delivery process.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;AWS Fundamentals&lt;br&gt;
I also revisited some of the core AWS concepts that are important for DevOps.&lt;br&gt;
AWS Region&lt;br&gt;
A geographical area containing multiple Availability Zones.&lt;br&gt;
Availability Zone&lt;br&gt;
An isolated location within an AWS Region.&lt;br&gt;
VPC&lt;br&gt;
The networking boundary for AWS resources.&lt;br&gt;
EC2&lt;br&gt;
Virtual compute instances that can run applications, Docker, GitLab Runners, and many other workloads.&lt;br&gt;
S3&lt;br&gt;
Object storage commonly used for application files, backups, Terraform state, artifacts, and logs.&lt;br&gt;
IAM&lt;br&gt;
The authorization layer that controls what users, applications, and AWS services can access.&lt;br&gt;
CloudWatch&lt;br&gt;
Used for monitoring, metrics, logs, and operational visibility.&lt;br&gt;
Understanding these services gives us the basic AWS vocabulary required for designing DevOps architectures.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;IAM — A Critical DevOps Concept&lt;br&gt;
One important lesson is that DevOps is not only about automation.&lt;br&gt;
Security must be part of the automation.&lt;br&gt;
IAM determines:&lt;br&gt;
For example, a CI/CD pipeline should not simply receive unrestricted AWS credentials.&lt;br&gt;
A better approach is to use short-lived credentials and role-based access.&lt;br&gt;
This becomes particularly important when we connect GitLab CI/CD with AWS.&lt;br&gt;
That will be one of the areas I explore further in this journey.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;CI/CD Fundamentals&lt;br&gt;
The next concept was understanding the basic CI/CD lifecycle.&lt;br&gt;
A simplified pipeline looks like:&lt;br&gt;
Instead of manually performing every step, the pipeline automates the process.&lt;br&gt;
For example:&lt;br&gt;
This is where DevOps starts becoming powerful.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How Everything Connects&lt;br&gt;
The most important takeaway from Day -1 was understanding how individual technologies fit together.&lt;br&gt;
Each technology has a role.&lt;br&gt;
Git manages source-code history.&lt;br&gt;
GitHub/GitLab hosts and collaborates on code.&lt;br&gt;
CI/CD automates delivery.&lt;br&gt;
Terraform automates infrastructure.&lt;br&gt;
Docker packages applications.&lt;br&gt;
AWS provides the infrastructure.&lt;br&gt;
EKS runs containerized workloads using Kubernetes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What I Learned&lt;br&gt;
The biggest lesson from Day -1 is that learning DevOps shouldn't be about memorizing commands.&lt;br&gt;
It should be about understanding how the pieces connect.&lt;br&gt;
For example:&lt;br&gt;
Why do we need Git?&lt;br&gt;
To track and collaborate on code.&lt;br&gt;
Why do we need CI/CD?&lt;br&gt;
To automate software delivery.&lt;br&gt;
Why do we need Terraform?&lt;br&gt;
To automate infrastructure.&lt;br&gt;
Why do we need Docker?&lt;br&gt;
To package applications consistently.&lt;br&gt;
Why do we need Kubernetes?&lt;br&gt;
To orchestrate containers at scale.&lt;br&gt;
Why do we need AWS?&lt;br&gt;
To provide scalable cloud infrastructure and managed services.&lt;br&gt;
Once we understand the "why", the tools become much easier to learn.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;🚀 What's Next?&lt;br&gt;
With the foundation in place, the next step is Amazon EKS.&lt;br&gt;
I'll explore:&lt;br&gt;
EKS architecture&lt;br&gt;
Control plane&lt;br&gt;
Worker nodes&lt;br&gt;
Pods&lt;br&gt;
Deployments&lt;br&gt;
Services&lt;br&gt;
Ingress&lt;br&gt;
EKS networking&lt;br&gt;
Container deployment&lt;br&gt;
Application-to-database communication&lt;br&gt;
The goal is to move from:&lt;br&gt;
Understanding DevOps → Building DevOps systems&lt;/p&gt;

&lt;p&gt;Final Takeaway&lt;br&gt;
A strong DevOps foundation is not built by learning 50 tools at once.&lt;br&gt;
It is built by understanding how a small number of fundamental technologies work together.&lt;br&gt;
My current learning path is:&lt;br&gt;
Day -1 complete.&lt;br&gt;
Next stop: Amazon EKS Fundamentals. ☸️&lt;br&gt;
Learn. Build. Automate. Deploy. Repeat.&lt;/p&gt;

&lt;h1&gt;
  
  
  AWS #AWSCommunityBuilders #DevOps #AmazonEKS #Git #GitHub #GitLab #Terraform #Docker #Linux #CICD #CloudComputing #LearningInPublic
&lt;/h1&gt;

</description>
      <category>devops</category>
      <category>aws</category>
      <category>git</category>
      <category>ai</category>
    </item>
    <item>
      <title>🚀 Amazon EKS: Stateful vs Stateless Applications — Services, Deployments, StatefulSets &amp; Persistent Storage</title>
      <dc:creator>Syed Kashif Ali</dc:creator>
      <pubDate>Mon, 10 Aug 2026 05:33:22 +0000</pubDate>
      <link>https://dev.to/syed_kashifali_2a9fe52dd/amazon-eks-stateful-vs-stateless-applications-services-deployments-statefulsets-persistent-j5i</link>
      <guid>https://dev.to/syed_kashifali_2a9fe52dd/amazon-eks-stateful-vs-stateless-applications-services-deployments-statefulsets-persistent-j5i</guid>
      <description>&lt;ol&gt;
&lt;li&gt;Stateless application in EKS&lt;/li&gt;
&lt;/ol&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk4fls8xged2l30rmpehg.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk4fls8xged2l30rmpehg.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A stateless application does not store important data inside the Pod.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;p&gt;Nginx&lt;br&gt;
React frontend&lt;br&gt;
Node.js API&lt;br&gt;
Python Flask API&lt;br&gt;
Java Spring Boot API&lt;/p&gt;

&lt;p&gt;If a Pod dies, Kubernetes can create a new Pod and the application continues working because there is no important state inside the old Pod.&lt;/p&gt;

&lt;p&gt;Architecture&lt;br&gt;
                    Internet&lt;br&gt;
                       |&lt;br&gt;
                       v&lt;br&gt;
                AWS Load Balancer&lt;br&gt;
                       |&lt;br&gt;
                       v&lt;br&gt;
              +------------------+&lt;br&gt;
              | Kubernetes       |&lt;br&gt;
              | Service          |&lt;br&gt;
              | ClusterIP        |&lt;br&gt;
              +------------------+&lt;br&gt;
                 /      |      \&lt;br&gt;
                v       v       v&lt;br&gt;
             Pod-1    Pod-2    Pod-3&lt;br&gt;
             API      API      API&lt;br&gt;
              |        |        |&lt;br&gt;
              +--------+--------+&lt;br&gt;
                       |&lt;br&gt;
                       v&lt;br&gt;
                 External DB&lt;br&gt;
              Amazon RDS / etc.&lt;br&gt;
Example: Deployment&lt;br&gt;
apiVersion: apps/v1&lt;br&gt;
kind: Deployment&lt;br&gt;
metadata:&lt;br&gt;
  name: nginx&lt;br&gt;
spec:&lt;br&gt;
  replicas: 3&lt;/p&gt;

&lt;p&gt;selector:&lt;br&gt;
    matchLabels:&lt;br&gt;
      app: nginx&lt;/p&gt;

&lt;p&gt;template:&lt;br&gt;
    metadata:&lt;br&gt;
      labels:&lt;br&gt;
        app: nginx&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;spec:
  containers:
    - name: nginx
      image: nginx:1.27
      ports:
        - containerPort: 80
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Here Kubernetes manages 3 interchangeable Pods.&lt;/p&gt;

&lt;p&gt;If nginx-abc dies:&lt;/p&gt;

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

&lt;p&gt;nginx-abc&lt;br&gt;
nginx-def&lt;br&gt;
nginx-ghi&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      ↓ Pod-abc crashes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;After:&lt;/p&gt;

&lt;p&gt;nginx-new&lt;br&gt;
nginx-def&lt;br&gt;
nginx-ghi&lt;/p&gt;

&lt;p&gt;The new Pod doesn't need the old Pod's identity or filesystem.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Service for Stateless application&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The Service provides a stable network endpoint for the changing Pods.&lt;/p&gt;

&lt;p&gt;apiVersion: v1&lt;br&gt;
kind: Service&lt;br&gt;
metadata:&lt;br&gt;
  name: nginx-service&lt;/p&gt;

&lt;p&gt;spec:&lt;br&gt;
  type: ClusterIP&lt;/p&gt;

&lt;p&gt;selector:&lt;br&gt;
    app: nginx&lt;/p&gt;

&lt;p&gt;ports:&lt;br&gt;
    - port: 80&lt;br&gt;
      targetPort: 80&lt;/p&gt;

&lt;p&gt;The Service finds Pods using:&lt;/p&gt;

&lt;p&gt;labels:&lt;br&gt;
  app: nginx&lt;/p&gt;

&lt;p&gt;So:&lt;/p&gt;

&lt;p&gt;Client&lt;br&gt;
  |&lt;br&gt;
  v&lt;br&gt;
nginx-service:80&lt;br&gt;
  |&lt;br&gt;
  +----&amp;gt; nginx Pod 1&lt;br&gt;
  |&lt;br&gt;
  +----&amp;gt; nginx Pod 2&lt;br&gt;
  |&lt;br&gt;
  +----&amp;gt; nginx Pod 3&lt;/p&gt;

&lt;p&gt;The Service provides load balancing across the matching Pods.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Stateful application in EKS&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A stateful application needs persistent identity and/or persistent storage.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;p&gt;MySQL&lt;br&gt;
PostgreSQL&lt;br&gt;
MongoDB&lt;br&gt;
Redis&lt;br&gt;
Kafka&lt;br&gt;
Elasticsearch&lt;/p&gt;

&lt;p&gt;For example, imagine MySQL:&lt;/p&gt;

&lt;p&gt;MySQL Pod&lt;br&gt;
   |&lt;br&gt;
   +---- Database files&lt;br&gt;
   +---- Users&lt;br&gt;
   +---- Orders&lt;br&gt;
   +---- Transactions&lt;/p&gt;

&lt;p&gt;If the Pod disappears, you cannot simply create an empty new MySQL Pod.&lt;/p&gt;

&lt;p&gt;You need the data to survive.&lt;/p&gt;

&lt;p&gt;That's where:&lt;/p&gt;

&lt;p&gt;StatefulSet&lt;br&gt;
PersistentVolumeClaim&lt;br&gt;
PersistentVolume&lt;br&gt;
EBS/EFS&lt;br&gt;
Headless Service&lt;/p&gt;

&lt;p&gt;come into the picture.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;StatefulSet&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For Kubernetes-native stateful workloads, we commonly use a StatefulSet instead of a Deployment.&lt;/p&gt;

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

&lt;p&gt;apiVersion: apps/v1&lt;br&gt;
kind: StatefulSet&lt;br&gt;
metadata:&lt;br&gt;
  name: mysql&lt;/p&gt;

&lt;p&gt;spec:&lt;br&gt;
  serviceName: mysql&lt;br&gt;
  replicas: 1&lt;/p&gt;

&lt;p&gt;selector:&lt;br&gt;
    matchLabels:&lt;br&gt;
      app: mysql&lt;/p&gt;

&lt;p&gt;template:&lt;br&gt;
    metadata:&lt;br&gt;
      labels:&lt;br&gt;
        app: mysql&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;spec:
  containers:
    - name: mysql
      image: mysql:8.0

      env:
        - name: MYSQL_ROOT_PASSWORD
          value: "mypassword"

      ports:
        - containerPort: 3306

      volumeMounts:
        - name: mysql-data
          mountPath: /var/lib/mysql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;volumeClaimTemplates:&lt;br&gt;
    - metadata:&lt;br&gt;
        name: mysql-data&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  spec:
    accessModes:
      - ReadWriteOnce

    resources:
      requests:
        storage: 20Gi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The important part is:&lt;/p&gt;

&lt;p&gt;volumeClaimTemplates:&lt;/p&gt;

&lt;p&gt;Kubernetes creates a PVC for the StatefulSet.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What happens in EKS?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Suppose you have:&lt;/p&gt;

&lt;p&gt;StatefulSet&lt;br&gt;
     |&lt;br&gt;
     v&lt;br&gt;
mysql-0&lt;br&gt;
     |&lt;br&gt;
     v&lt;br&gt;
PVC&lt;br&gt;
     |&lt;br&gt;
     v&lt;br&gt;
PV&lt;br&gt;
     |&lt;br&gt;
     v&lt;br&gt;
AWS EBS Volume&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;mysql-0&lt;br&gt;
   |&lt;br&gt;
   +---- mysql-data-mysql-0&lt;br&gt;
                |&lt;br&gt;
                v&lt;br&gt;
           EBS 20 GB&lt;/p&gt;

&lt;p&gt;The MySQL data is stored on the persistent volume rather than only inside the container.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What happens if MySQL Pod crashes?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is the important part.&lt;/p&gt;

&lt;p&gt;Initially:&lt;/p&gt;

&lt;p&gt;mysql-0&lt;br&gt;
   |&lt;br&gt;
   v&lt;br&gt;
EBS Volume&lt;br&gt;
   |&lt;br&gt;
   +---- customer data&lt;br&gt;
   +---- orders&lt;br&gt;
   +---- database&lt;/p&gt;

&lt;p&gt;Suppose:&lt;/p&gt;

&lt;p&gt;mysql-0&lt;br&gt;
   X&lt;br&gt;
  CRASH&lt;/p&gt;

&lt;p&gt;StatefulSet recreates:&lt;/p&gt;

&lt;p&gt;mysql-0&lt;br&gt;
   |&lt;br&gt;
   v&lt;br&gt;
Existing PVC&lt;br&gt;
   |&lt;br&gt;
   v&lt;br&gt;
Existing EBS&lt;br&gt;
   |&lt;br&gt;
   +---- customer data&lt;br&gt;
   +---- orders&lt;br&gt;
   +---- database&lt;/p&gt;

&lt;p&gt;So the new Pod can mount the existing persistent storage.&lt;/p&gt;

&lt;p&gt;The Pod name remains:&lt;/p&gt;

&lt;p&gt;mysql-0&lt;/p&gt;

&lt;p&gt;This stable identity is one of the major differences from a normal Deployment.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;StatefulSet vs Deployment
Feature Deployment  StatefulSet
Used for    Stateless apps  Stateful apps
Pod identity    Temporary   Stable
Pod names   Random-ish suffix   Ordered names
Example api-7d9f... mysql-0
Persistent storage  Optional    Common
PVC Usually separate    Can use volumeClaimTemplates
Scaling Easy    Ordered
Pod replacement Interchangeable Identity preserved
Example Node.js API MySQL&lt;/li&gt;
&lt;li&gt;Stateful Service&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Stateful applications often use a Headless Service.&lt;/p&gt;

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

&lt;p&gt;apiVersion: v1&lt;br&gt;
kind: Service&lt;br&gt;
metadata:&lt;br&gt;
  name: mysql&lt;/p&gt;

&lt;p&gt;spec:&lt;br&gt;
  clusterIP: None&lt;/p&gt;

&lt;p&gt;selector:&lt;br&gt;
    app: mysql&lt;/p&gt;

&lt;p&gt;ports:&lt;br&gt;
    - port: 3306&lt;br&gt;
      targetPort: 3306&lt;/p&gt;

&lt;p&gt;Notice:&lt;/p&gt;

&lt;p&gt;clusterIP: None&lt;/p&gt;

&lt;p&gt;This makes it a Headless Service.&lt;/p&gt;

&lt;p&gt;Instead of giving one virtual IP, Kubernetes DNS can resolve individual StatefulSet Pods.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;mysql-0.mysql.default.svc.cluster.local&lt;/p&gt;

&lt;p&gt;If you had:&lt;/p&gt;

&lt;p&gt;mysql-0&lt;br&gt;
mysql-1&lt;br&gt;
mysql-2&lt;/p&gt;

&lt;p&gt;they can have stable DNS identities:&lt;/p&gt;

&lt;p&gt;mysql-0.mysql&lt;br&gt;
mysql-1.mysql&lt;br&gt;
mysql-2.mysql&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Why StatefulSet needs Service?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Consider a database cluster:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;             mysql-service
                   |
      +------------+------------+
      |            |            |
      v            v            v
   mysql-0      mysql-1      mysql-2
      |            |            |
     PVC          PVC          PVC
      |            |            |
     EBS          EBS          EBS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The Service provides stable networking.&lt;/p&gt;

&lt;p&gt;The StatefulSet provides:&lt;/p&gt;

&lt;p&gt;stable Pod identity&lt;br&gt;
ordered deployment&lt;br&gt;
ordered termination&lt;br&gt;
persistent storage association&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Stateless EKS example — Node.js API&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Imagine your ecommerce application:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                Internet
                   |
                   v
             AWS ALB
                   |
                   v
            Kubernetes Service
                   |
      +------------+------------+
      |            |            |
      v            v            v
   API Pod      API Pod      API Pod
      |            |            |
      +------------+------------+
                   |
                   v
                Amazon RDS
                   |
                   v
                MySQL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Your Node.js API is stateless.&lt;/p&gt;

&lt;p&gt;Why?&lt;/p&gt;

&lt;p&gt;Because:&lt;/p&gt;

&lt;p&gt;User&lt;br&gt;
  |&lt;br&gt;
  v&lt;br&gt;
API Pod&lt;br&gt;
  |&lt;br&gt;
  v&lt;br&gt;
RDS&lt;/p&gt;

&lt;p&gt;The API doesn't permanently store the user's orders inside its own filesystem.&lt;/p&gt;

&lt;p&gt;If:&lt;/p&gt;

&lt;p&gt;API Pod 1 → crashes&lt;/p&gt;

&lt;p&gt;Kubernetes creates:&lt;/p&gt;

&lt;p&gt;API Pod 4&lt;/p&gt;

&lt;p&gt;and the application continues.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Stateful EKS example — MySQL&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now imagine MySQL running inside EKS:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;         MySQL Service
               |
               v
            mysql-0
               |
               v
              PVC
               |
               v
          EBS Volume
               |
               v
         Database Data
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;If:&lt;/p&gt;

&lt;p&gt;mysql-0 → crashes&lt;/p&gt;

&lt;p&gt;Kubernetes recreates:&lt;/p&gt;

&lt;p&gt;mysql-0&lt;/p&gt;

&lt;p&gt;and attaches the persistent storage.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Very important: EKS + RDS&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In production, you generally don't need to run MySQL yourself inside EKS if you can use Amazon RDS/Aurora.&lt;/p&gt;

&lt;p&gt;A common architecture is:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                Internet
                   |
                   v
                 ALB
                   |
                   v
          Kubernetes Service
                   |
      +------------+------------+
      |            |            |
      v            v            v
   API Pod      API Pod      API Pod
      |            |            |
      +------------+------------+
                   |
                   v
             Amazon RDS
              MySQL/Postgres
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Here:&lt;/p&gt;

&lt;p&gt;EKS&lt;/p&gt;

&lt;p&gt;Runs your stateless application:&lt;/p&gt;

&lt;p&gt;Frontend&lt;br&gt;
Backend&lt;br&gt;
API&lt;br&gt;
Microservices&lt;br&gt;
RDS&lt;/p&gt;

&lt;p&gt;Runs your stateful database:&lt;/p&gt;

&lt;p&gt;MySQL&lt;br&gt;
PostgreSQL&lt;/p&gt;

&lt;p&gt;AWS handles much of the database infrastructure for you.&lt;/p&gt;

&lt;p&gt;This is usually preferable to running production MySQL directly inside EKS unless you have a specific reason to do so.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Easy way to remember
Stateless
Deployment
 ↓
Pods
 ↓
Service
 ↓
External database&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Pods are replaceable.&lt;/p&gt;

&lt;p&gt;Pod dies&lt;br&gt;
   ↓&lt;br&gt;
New Pod&lt;br&gt;
   ↓&lt;br&gt;
Continue&lt;br&gt;
Stateful&lt;br&gt;
StatefulSet&lt;br&gt;
     ↓&lt;br&gt;
Pod&lt;br&gt;
     ↓&lt;br&gt;
PVC&lt;br&gt;
     ↓&lt;br&gt;
PV&lt;br&gt;
     ↓&lt;br&gt;
EBS/EFS&lt;/p&gt;

&lt;p&gt;Pod identity and data persistence matter.&lt;/p&gt;

&lt;p&gt;Pod dies&lt;br&gt;
   ↓&lt;br&gt;
Same identity&lt;br&gt;
   ↓&lt;br&gt;
Same persistent storage&lt;br&gt;
   ↓&lt;br&gt;
Continue with data&lt;br&gt;
Interview answer&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If an interviewer asks "What is the difference between StatefulSet and Deployment in EKS?", you can say:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Deployment is mainly used for stateless applications where Pods are interchangeable. StatefulSet is used for stateful applications that require stable Pod identity, predictable naming, and persistent storage. In EKS, a Deployment might run Node.js API replicas behind a Service, while a StatefulSet could run MySQL with PVCs backed by EBS. For production databases, however, I would generally prefer Amazon RDS/Aurora rather than managing the database inside EKS.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>elastic</category>
      <category>eks</category>
      <category>aws</category>
    </item>
    <item>
      <title>🚀 Amazon EKS with MCP — AI-Powered Kubernetes Management on AWS</title>
      <dc:creator>Syed Kashif Ali</dc:creator>
      <pubDate>Sun, 09 Aug 2026 13:27:03 +0000</pubDate>
      <link>https://dev.to/syed_kashifali_2a9fe52dd/amazon-eks-with-mcp-ai-powered-kubernetes-management-on-aws-130c</link>
      <guid>https://dev.to/syed_kashifali_2a9fe52dd/amazon-eks-with-mcp-ai-powered-kubernetes-management-on-aws-130c</guid>
      <description>&lt;p&gt;🚀 Amazon EKS — Zero to Production Roadmap&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Architecture&lt;/li&gt;
&lt;/ol&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvdcc5pqquenllay087gc.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvdcc5pqquenllay087gc.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Core components:&lt;/p&gt;

&lt;p&gt;EKS Control Plane&lt;br&gt;
Managed Node Groups&lt;br&gt;
VPC&lt;br&gt;
Private/Public Subnets&lt;br&gt;
VPC CNI&lt;br&gt;
CoreDNS&lt;br&gt;
kube-proxy&lt;br&gt;
AWS Load Balancer Controller&lt;br&gt;
EBS CSI Driver&lt;br&gt;
IAM / EKS Access Entries&lt;br&gt;
Kubernetes RBAC&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create EKS with Terraform&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Recommended structure:&lt;/p&gt;

&lt;p&gt;eks-project/&lt;br&gt;
├── main.tf&lt;br&gt;
├── variables.tf&lt;br&gt;
├── outputs.tf&lt;br&gt;
├── providers.tf&lt;br&gt;
├── terraform.tfvars&lt;br&gt;
└── modules/&lt;br&gt;
    ├── vpc/&lt;br&gt;
    └── eks/&lt;/p&gt;

&lt;p&gt;Your Terraform should create:&lt;/p&gt;

&lt;p&gt;VPC&lt;br&gt;
 ├── Internet Gateway&lt;br&gt;
 ├── NAT Gateway&lt;br&gt;
 ├── Public Subnets&lt;br&gt;
 ├── Private Subnets&lt;br&gt;
 └── Route Tables&lt;/p&gt;

&lt;p&gt;EKS&lt;br&gt;
 ├── Control Plane&lt;br&gt;
 ├── IAM Roles&lt;br&gt;
 ├── Managed Node Group&lt;br&gt;
 └── EKS Add-ons&lt;/p&gt;

&lt;p&gt;For production, place worker nodes in private subnets.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Verify AWS Authentication&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Before touching Kubernetes:&lt;/p&gt;

&lt;p&gt;aws sts get-caller-identity&lt;/p&gt;

&lt;p&gt;You should get your AWS identity.&lt;/p&gt;

&lt;p&gt;Then:&lt;/p&gt;

&lt;p&gt;aws eks update-kubeconfig \&lt;br&gt;
  --region ap-south-1 \&lt;br&gt;
  --name &lt;/p&gt;

&lt;p&gt;Verify:&lt;/p&gt;

&lt;p&gt;kubectl config current-context&lt;/p&gt;

&lt;p&gt;Then:&lt;/p&gt;

&lt;p&gt;kubectl get nodes&lt;/p&gt;

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

&lt;p&gt;NAME                          STATUS   ROLES&lt;br&gt;
ip-10-0-1-xxx.ec2.internal   Ready    &lt;br&gt;
ip-10-0-2-xxx.ec2.internal   Ready    &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;EKS Authentication&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Think about authentication in two layers:&lt;/p&gt;

&lt;p&gt;IAM&lt;br&gt;
 │&lt;br&gt;
 │ Authentication&lt;br&gt;
 ▼&lt;br&gt;
EKS API Server&lt;br&gt;
 │&lt;br&gt;
 │ Authorization&lt;br&gt;
 ▼&lt;br&gt;
Kubernetes RBAC&lt;br&gt;
Authentication&lt;/p&gt;

&lt;p&gt;AWS asks:&lt;/p&gt;

&lt;p&gt;Who are you?&lt;/p&gt;

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

&lt;p&gt;aws sts get-caller-identity&lt;br&gt;
Authorization&lt;/p&gt;

&lt;p&gt;Kubernetes asks:&lt;/p&gt;

&lt;p&gt;What are you allowed to do?&lt;/p&gt;

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

&lt;p&gt;kubectl auth can-i get pods&lt;/p&gt;

&lt;p&gt;This distinction is very important in EKS interviews.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;EKS Access Entry&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For modern EKS clusters, use EKS Access Entries where possible.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;/p&gt;

&lt;p&gt;IAM User / IAM Role&lt;br&gt;
        │&lt;br&gt;
        ▼&lt;br&gt;
EKS Access Entry&lt;br&gt;
        │&lt;br&gt;
        ▼&lt;br&gt;
Access Policy / Kubernetes permissions&lt;br&gt;
        │&lt;br&gt;
        ▼&lt;br&gt;
Kubernetes API&lt;/p&gt;

&lt;p&gt;For example, an IAM role can be granted administrative access to the cluster.&lt;/p&gt;

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

&lt;p&gt;RBAC controls permissions inside Kubernetes.&lt;/p&gt;

&lt;p&gt;There are four important objects:&lt;/p&gt;

&lt;p&gt;Role&lt;br&gt;
ClusterRole&lt;br&gt;
RoleBinding&lt;br&gt;
ClusterRoleBinding&lt;br&gt;
Role&lt;/p&gt;

&lt;p&gt;Namespace-specific permissions.&lt;/p&gt;

&lt;p&gt;Example:&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: developer-role&lt;br&gt;
  namespace: dev&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;This allows a user to:&lt;/p&gt;

&lt;p&gt;GET pods&lt;br&gt;
LIST pods&lt;br&gt;
WATCH pods&lt;/p&gt;

&lt;p&gt;but not:&lt;/p&gt;

&lt;p&gt;DELETE pods&lt;br&gt;
CREATE pods&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;RoleBinding&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Connect the user to the Role:&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: developer-binding&lt;br&gt;
  namespace: dev&lt;br&gt;
subjects:&lt;/p&gt;

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

&lt;p&gt;Apply:&lt;/p&gt;

&lt;p&gt;kubectl apply -f role.yaml&lt;br&gt;
kubectl apply -f rolebinding.yaml&lt;/p&gt;

&lt;p&gt;Test:&lt;/p&gt;

&lt;p&gt;kubectl auth can-i get pods -n dev --as=ali&lt;/p&gt;

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

&lt;p&gt;yes&lt;/p&gt;

&lt;p&gt;Test something unauthorized:&lt;/p&gt;

&lt;p&gt;kubectl auth can-i delete deployment -n dev --as=ali&lt;/p&gt;

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

&lt;p&gt;no&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;VPC CNI&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is one of the most important EKS concepts.&lt;/p&gt;

&lt;p&gt;AWS VPC CNI gives Kubernetes pods networking through the AWS VPC.&lt;/p&gt;

&lt;p&gt;EKS Node&lt;br&gt;
   │&lt;br&gt;
   ├── Primary ENI&lt;br&gt;
   │&lt;br&gt;
   ├── Secondary ENI&lt;br&gt;
   │&lt;br&gt;
   ├── Pod IP&lt;br&gt;
   │&lt;br&gt;
   ├── Pod IP&lt;br&gt;
   │&lt;br&gt;
   └── Pod IP&lt;/p&gt;

&lt;p&gt;Check it:&lt;/p&gt;

&lt;p&gt;kubectl get pods -n kube-system&lt;/p&gt;

&lt;p&gt;Look for:&lt;/p&gt;

&lt;p&gt;aws-node-xxxxx&lt;/p&gt;

&lt;p&gt;Check:&lt;/p&gt;

&lt;p&gt;kubectl get daemonset aws-node -n kube-system&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Why VPC CNI Matters&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Suppose your node has:&lt;/p&gt;

&lt;p&gt;10.0.1.10&lt;/p&gt;

&lt;p&gt;A pod may receive:&lt;/p&gt;

&lt;p&gt;10.0.1.50&lt;/p&gt;

&lt;p&gt;That IP comes from the VPC networking system.&lt;/p&gt;

&lt;p&gt;Therefore your pods can communicate with AWS resources such as:&lt;/p&gt;

&lt;p&gt;RDS&lt;br&gt;
ElastiCache&lt;br&gt;
ALB&lt;br&gt;
S3 via VPC endpoints&lt;br&gt;
Secrets Manager via VPC endpoints&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Deploy an Application&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;apiVersion: apps/v1&lt;br&gt;
kind: Deployment&lt;br&gt;
metadata:&lt;br&gt;
  name: nginx&lt;br&gt;
spec:&lt;br&gt;
  replicas: 3&lt;br&gt;
  selector:&lt;br&gt;
    matchLabels:&lt;br&gt;
      app: nginx&lt;br&gt;
  template:&lt;br&gt;
    metadata:&lt;br&gt;
      labels:&lt;br&gt;
        app: nginx&lt;br&gt;
    spec:&lt;br&gt;
      containers:&lt;br&gt;
        - name: nginx&lt;br&gt;
          image: nginx:latest&lt;br&gt;
          ports:&lt;br&gt;
            - containerPort: 80&lt;/p&gt;

&lt;p&gt;Apply:&lt;/p&gt;

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

&lt;p&gt;Check:&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;Service&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Expose the pods internally:&lt;/p&gt;

&lt;p&gt;apiVersion: v1&lt;br&gt;
kind: Service&lt;br&gt;
metadata:&lt;br&gt;
  name: nginx-service&lt;br&gt;
spec:&lt;br&gt;
  selector:&lt;br&gt;
    app: nginx&lt;br&gt;
  ports:&lt;br&gt;
    - port: 80&lt;br&gt;
      targetPort: 80&lt;br&gt;
  type: ClusterIP&lt;/p&gt;

&lt;p&gt;Then:&lt;/p&gt;

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

&lt;p&gt;Check:&lt;/p&gt;

&lt;p&gt;kubectl get svc&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;ALB Ingress&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For external traffic:&lt;/p&gt;

&lt;p&gt;Internet&lt;br&gt;
   │&lt;br&gt;
   ▼&lt;br&gt;
AWS ALB&lt;br&gt;
   │&lt;br&gt;
   ▼&lt;br&gt;
Kubernetes Ingress&lt;br&gt;
   │&lt;br&gt;
   ▼&lt;br&gt;
Service&lt;br&gt;
   │&lt;br&gt;
   ▼&lt;br&gt;
Pods&lt;/p&gt;

&lt;p&gt;You'll normally use the AWS Load Balancer Controller for this.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Production Application Architecture&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For your DevOps project, a good architecture is:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                Internet
                   │
                   ▼
                Route 53
                   │
                   ▼
                AWS ALB
                   │
             ┌─────┴─────┐
             │   Ingress │
             └─────┬─────┘
                   │
          ┌────────┴────────┐
          │                 │
      Frontend           Backend
          │                 │
          │            ┌────┴────┐
          │            │         │
          │           RDS      Redis
          │
          ▼
         Pods
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;CI/CD&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Your final pipeline can be:&lt;/p&gt;

&lt;p&gt;Developer&lt;br&gt;
    │&lt;br&gt;
    ▼&lt;br&gt;
GitHub&lt;br&gt;
    │&lt;br&gt;
    ▼&lt;br&gt;
GitHub Actions&lt;br&gt;
    │&lt;br&gt;
    ├── Test&lt;br&gt;
    ├── SonarQube&lt;br&gt;
    ├── Docker Build&lt;br&gt;
    ├── Docker Push&lt;br&gt;
    │&lt;br&gt;
    ▼&lt;br&gt;
Amazon ECR&lt;br&gt;
    │&lt;br&gt;
    ▼&lt;br&gt;
EKS&lt;br&gt;
    │&lt;br&gt;
    ▼&lt;br&gt;
Rolling Deployment&lt;/p&gt;

&lt;p&gt;Use GitHub OIDC → AWS IAM Role rather than storing long-lived AWS access keys.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Final Production Flow
                GitHub
                   │
                   ▼
            GitHub Actions
                   │
             OIDC Authentication
                   │
                   ▼
                AWS IAM
                   │
        ┌──────────┴──────────┐
        │                     │
        ▼                     ▼
       ECR                   EKS
        │                     │
   Docker Image          Kubernetes
                              │
                     ┌────────┴────────┐
                     │                 │
                  Ingress          Services
                     │                 │
                     └────────┬────────┘
                              │
                              ▼
                             Pods
                              │
                ┌─────────────┼─────────────┐
                ▼             ▼             ▼
               RDS         Redis        AWS APIs&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>aws</category>
      <category>awschallenge</category>
    </item>
  </channel>
</rss>
