<?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: ShubhankarDev</title>
    <description>The latest articles on DEV Community by ShubhankarDev (@shubhankardev_a0028afe8ff).</description>
    <link>https://dev.to/shubhankardev_a0028afe8ff</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%2F2175016%2F29f7a0cd-c142-42fd-b902-b7b2fc61097f.png</url>
      <title>DEV Community: ShubhankarDev</title>
      <link>https://dev.to/shubhankardev_a0028afe8ff</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shubhankardev_a0028afe8ff"/>
    <language>en</language>
    <item>
      <title>Kubernetes (EKS) Fundamentals - In-Depth Guide</title>
      <dc:creator>ShubhankarDev</dc:creator>
      <pubDate>Sat, 22 Feb 2025 13:41:25 +0000</pubDate>
      <link>https://dev.to/shubhankardev_a0028afe8ff/kubernetes-eks-fundamentals-in-depth-guide-3mpc</link>
      <guid>https://dev.to/shubhankardev_a0028afe8ff/kubernetes-eks-fundamentals-in-depth-guide-3mpc</guid>
      <description>&lt;p&gt;Kubernetes (EKS) Fundamentals - In-Depth Guide&lt;br&gt;
This guide will cover everything you need to successfully deploy a secure application on Amazon Elastic Kubernetes Service (EKS) while following AWS best practices.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;EKS Cluster Setup
To deploy a secure Kubernetes cluster on AWS, you need to:
✅ Set up a VPC with private and public subnets
✅ Create an EKS cluster
✅ Add worker nodes in private subnets
✅ Configure IAM roles and security groups&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Step 1: Create a VPC for EKS&lt;br&gt;
AWS Elastic Kubernetes Service (EKS) requires a custom VPC with both public and private subnets across multiple Availability Zones (AZs).&lt;/p&gt;

&lt;p&gt;You can create the VPC manually or use eksctl:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;eksctl create cluster \&lt;br&gt;
  --name my-eks-cluster \&lt;br&gt;
  --region us-east-1 \&lt;br&gt;
  --vpc-private-subnets subnet-abc123,subnet-def456 \&lt;br&gt;
  --without-nodegroup&lt;/code&gt;&lt;br&gt;
This command creates:&lt;/p&gt;

&lt;p&gt;An EKS cluster in us-east-1&lt;br&gt;
Private subnets for worker nodes&lt;br&gt;
No default node group (so we manually add worker nodes later)&lt;br&gt;
Step 2: Create an EKS Node Group in Private Subnets&lt;br&gt;
Worker nodes must only exist in private subnets (no public IPs).&lt;br&gt;
Use eksctl to create a private node group:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;eksctl create nodegroup \&lt;br&gt;
  --cluster my-eks-cluster \&lt;br&gt;
  --name private-nodes \&lt;br&gt;
  --node-type t3.medium \&lt;br&gt;
  --nodes 2 \&lt;br&gt;
  --nodes-min 2 \&lt;br&gt;
  --nodes-max 4 \&lt;br&gt;
  --node-private-networking&lt;/code&gt;&lt;br&gt;
This provisions 2 worker nodes in private subnets.&lt;br&gt;
The --node-private-networking flag ensures no public IPs.&lt;br&gt;
✅ Now your EKS cluster has worker nodes only accessible within the VPC.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Kubernetes Manifests (Deployments, Services, Ingress)
What are Kubernetes Manifests?
A manifest file is a YAML file that defines Kubernetes resources like:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Deployments (to run applications)&lt;br&gt;
Services (to expose applications inside the cluster)&lt;br&gt;
Ingress (to expose applications externally via ALB)&lt;br&gt;
Step 1: Create a Deployment&lt;br&gt;
We deploy an Nginx web app using a Deployment manifest:&lt;/p&gt;

&lt;p&gt;`yaml&lt;/p&gt;

&lt;p&gt;apiVersion: apps/v1&lt;br&gt;
kind: Deployment&lt;br&gt;
metadata:&lt;br&gt;
  name: nginx-app&lt;br&gt;
spec:&lt;br&gt;
  replicas: 2&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;br&gt;
Creates 2 replicas of Nginx&lt;br&gt;
Labels help services find this deployment&lt;br&gt;
Ports define where the container listens&lt;br&gt;
Apply the deployment:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;kubectl apply -f deployment.yaml&lt;/code&gt;&lt;br&gt;
Step 2: Create a Service&lt;br&gt;
A Service allows other Kubernetes components to access the Deployment:&lt;/p&gt;

&lt;p&gt;`yaml&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;
    - protocol: TCP&lt;br&gt;
      port: 80&lt;br&gt;
      targetPort: 80&lt;br&gt;
  type: NodePort`&lt;br&gt;
This exposes Nginx internally within the cluster.&lt;br&gt;
Apply the service:&lt;/p&gt;

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

&lt;p&gt;Step 3: Configure an Ingress with AWS ALB&lt;br&gt;
To expose the service externally via ALB, use an Ingress manifest:&lt;/p&gt;

&lt;p&gt;yaml&lt;/p&gt;

&lt;p&gt;&lt;code&gt;apiVersion: networking.k8s.io/v1&lt;br&gt;
kind: Ingress&lt;br&gt;
metadata:&lt;br&gt;
  name: nginx-ingress&lt;br&gt;
  annotations:&lt;br&gt;
    alb.ingress.kubernetes.io/scheme: internet-facing&lt;br&gt;
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS": 443}]'&lt;br&gt;
    alb.ingress.kubernetes.io/ssl-redirect: "443"&lt;br&gt;
    alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:your-certificate-arn&lt;br&gt;
spec:&lt;br&gt;
  rules:&lt;br&gt;
    - host: myapp.example.com&lt;br&gt;
      http:&lt;br&gt;
        paths:&lt;br&gt;
          - path: /&lt;br&gt;
            pathType: Prefix&lt;br&gt;
            backend:&lt;br&gt;
              service:&lt;br&gt;
                name: nginx-service&lt;br&gt;
                port:&lt;br&gt;
                  number: 80&lt;/code&gt;&lt;br&gt;
Uses AWS ALB for external traffic&lt;br&gt;
Redirects HTTP (80) to HTTPS (443)&lt;br&gt;
Uses an SSL certificate from ACM&lt;br&gt;
Apply the ingress:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;kubectl apply -f ingress.yaml&lt;/code&gt;&lt;br&gt;
Now your app is publicly accessible over HTTPS via the ALB.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;AWS ALB Ingress Controller
AWS provides an Ingress Controller that integrates ALB with Kubernetes.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Step 1: Install ALB Ingress Controller&lt;br&gt;
Using helm:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;helm repo add eks https://aws.github.io/eks-charts&lt;br&gt;
helm install aws-load-balancer-controller eks/aws-load-balancer-controller \&lt;br&gt;
  --set clusterName=my-eks-cluster \&lt;br&gt;
  --set serviceAccount.create=false \&lt;br&gt;
  --set serviceAccount.name=aws-load-balancer-controller&lt;/code&gt;&lt;br&gt;
Step 2: Verify Deployment&lt;/p&gt;

&lt;p&gt;&lt;code&gt;kubectl get pods -n kube-system&lt;/code&gt;&lt;br&gt;
✅ You should see aws-load-balancer-controller running.&lt;/p&gt;

&lt;p&gt;Now, Ingress rules will automatically create and configure an ALB.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Kubernetes Network Policies
By default, all pods can communicate with each other.
To restrict intra-cluster communication, use NetworkPolicy rules.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Step 1: Restrict Pod Communication&lt;br&gt;
Example: Only allow ALB → Nginx, block other traffic.&lt;/p&gt;

&lt;p&gt;`yaml&lt;/p&gt;

&lt;p&gt;apiVersion: networking.k8s.io/v1&lt;br&gt;
kind: NetworkPolicy&lt;br&gt;
metadata:&lt;br&gt;
  name: nginx-network-policy&lt;br&gt;
spec:&lt;br&gt;
  podSelector:&lt;br&gt;
    matchLabels:&lt;br&gt;
      app: nginx&lt;br&gt;
  policyTypes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ingress
ingress:&lt;/li&gt;
&lt;li&gt;from:

&lt;ul&gt;
&lt;li&gt;ipBlock:
cidr: 10.0.0.0/16
ports:&lt;/li&gt;
&lt;li&gt;protocol: TCP
port: 80`
Blocks all pod-to-pod traffic except from ALB.
Ensures that only the Load Balancer can reach Nginx.
Apply the policy:&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;`sh&lt;/p&gt;

&lt;p&gt;kubectl apply -f network-policy.yaml`&lt;br&gt;
Final Steps&lt;br&gt;
✅ Check ALB&lt;/p&gt;

&lt;p&gt;`sh&lt;/p&gt;

&lt;p&gt;aws elbv2 describe-load-balancers`&lt;br&gt;
✅ Check Deployment&lt;/p&gt;

&lt;p&gt;`sh&lt;/p&gt;

&lt;p&gt;kubectl get pods&lt;br&gt;
kubectl get svc&lt;br&gt;
kubectl get ingress`&lt;br&gt;
✅ Test HTTPS Visit: &lt;a href="https://myapp.example.com" rel="noopener noreferrer"&gt;https://myapp.example.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Should only be accessible over HTTPS&lt;br&gt;
HTTP should redirect to HTTPS&lt;br&gt;
🚀 Summary&lt;br&gt;
✔ EKS Cluster Setup with private worker nodes&lt;br&gt;
✔ Kubernetes Manifests (Deployments, Services, Ingress)&lt;br&gt;
✔ ALB Ingress Controller to expose applications&lt;br&gt;
✔ Network Policies to restrict communication&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
