AWS Retail Store — EKS Production Deployment
The flagship. Multi-language microservices on EKS with Helm umbrella charts, IRSA, HPA, StatefulSets, and full Prometheus/Grafana observability — driven by a single Jenkins shared library.
Overview
Everything I learned building RoboShop on VMs, rebuilt properly on Kubernetes. A 5-service polyglot retail app (UI, Catalog, Cart, Orders, Checkout) plus MySQL, Postgres, RabbitMQ, Redis, and DynamoDB — all deployed to Amazon EKS with zero static credentials, dynamic storage, autoscaling, and dashboards that ship with the workload.
Repositories
Problem
Most students who 'know Kubernetes' have run kubectl apply on a tutorial manifest. The goal here was the opposite: prove I can operate a real cluster — OIDC-backed identity, StatefulSet storage, health-probe-driven rollouts, and a CI/CD system that scales across every service in every language from one shared codebase.
Architecture
Source of truth — push to main triggers Jenkins via webhook.
CI/CD Flow
- 01Jenkins shared library exposes three reusable Groovy functions: detectVersion(), dockerBuildPush(), deployK8s().
- 02detectVersion() reads pom.xml for Java, main.go for Go, package.json for Node — one pipeline definition works across every service.
- 03dockerBuildPush() builds and pushes SHA-tagged images to DockerHub; deployK8s() runs helm upgrade with env-specific values.
- 04When the deployment process changes, it changes in one place — not five Jenkinsfiles.
Infrastructure
- Umbrella Helm chart with 10 subcharts: cart, catalog, checkout, orders, ui, mysql, postgresql, rabbitmq, redis, dynamodb.
- Env values: dev uses local DynamoDB + static creds; prod uses AWS DynamoDB + IRSA. Zero secret sprawl.
- IRSA fully implemented: OIDC provider on EKS, trust policy scoped to a single ServiceAccount, IAM policy scoped to a specific DynamoDB table ARN. Verified via env | grep AWS inside the pod.
- StatefulSets with volumeClaimTemplates + EBS CSI (gp3, WaitForFirstConsumer) for MySQL and PostgreSQL — each replica gets its own volume.
- HPA on all 5 application services at 70% CPU. Startup + liveness + readiness probes on every workload.
Technologies Used
Challenges
Lessons Learned
- IRSA is a habit, not a feature. Once the OIDC → trust policy → SA annotation chain is muscle memory, static AWS keys become unthinkable.
- Observability is a deploy-time concern. ServiceMonitors and dashboards ship inside the Helm chart, not as a follow-up ticket.
- Shared libraries pay off the moment you have a second service. Write the abstraction before you write the second Jenkinsfile.