DEV Community

SHIVAM UPADHYAY
SHIVAM UPADHYAY

Posted on Edited on

Testing CAST AI on GKE: A Hands-On Kubernetes Workload Optimization Lab

I intentionally over-provisioned a Kubernetes application just to see whether CAST AI could detect it, recommend better resource requests, and actually optimize it.

Spoiler: it did—but the biggest lesson wasn't about cost savings. It was about understanding the difference between resource requests, actual usage, and infrastructure cost.

🤔 Why I Built This Lab

When we deploy applications to Kubernetes, we usually write something like this:

resources:
requests:
cpu: "1000m"
memory: "1Gi"

limits:
cpu: "1500m"
memory: "1500Mi"

But here's the question:

How do you know if those numbers are correct?

Most of us guess.

Sometimes we copy them from another project.

Sometimes we simply over-provision because we don't want the application to crash.

That's exactly what I did for this experiment.

🏗️ The Lab Setup

I built a very small application instead of using a complex microservice.

Tech Stack

FastAPI
Docker
Google Kubernetes Engine (GKE)
Google Artifact Registry
CAST AI

The deployment flow looked like this:

FastAPI
│
Docker Image
│
Artifact Registry
│
GKE Cluster
│
Deployment (2 Pods)
│
ClusterIP Service
│
CAST AI

☕ The Coffee API

The application only exposes two endpoints.

@app.get("/")
def home():
return {
"message": "Coffee Shop API",
"hostname": socket.gethostname()
}

@app.get("/coffee")
def coffee():
return {
"coffee": "Cappuccino",
"price": 120
}

Nothing fancy.

The goal wasn't the application.

The goal was the infrastructure.

🎯 Intentionally Over-Provisioning the Pods

Each Pod requested:

resources:
requests:
cpu: "1000m"
memory: "1Gi"

and I deployed 2 replicas.

So Kubernetes reserved:

2 CPU
2 GiB Memory

for an application that barely did anything.

🚀 Deploying to GKE

After building the Docker image, I pushed it to Artifact Registry and deployed it to GKE.

Everything looked healthy.

2 Pods
Running
Ready

At this point, Kubernetes had no idea the application was oversized.

It simply respected the resource requests I had defined.

🔍 Connecting CAST AI

I connected the cluster to CAST AI.

Interestingly, onboarding wasn't completely smooth.

I ran into several issues:

missing gke-gcloud-auth-plugin
expired CAST AI authentication
missing IAM permissions
Kubernetes RBAC

After fixing those, CAST AI started collecting workload metrics.

📊 The Interesting Part

After some time, CAST AI analyzed my workload.

My deployment requested:

CPU
1 CPU per Pod

Memory
1 GiB per Pod

But actual usage looked more like:

CPU
≈ 3-4m

Memory
≈ 30 MiB

That was a huge difference.

💡 CAST AI Recommendation

Instead of recommending something extreme like 4m CPU, CAST AI suggested:

Resource Before Recommendation
CPU 1 CPU 750m
Memory 1 GiB 768 MiB

It also estimated around 25% workload cost reduction.

Screenshot

(Insert your CAST AI optimization screenshot here)

🤔 Why Not Just Recommend 4m CPU?

This was actually my favorite learning.

If the application is only using 4m CPU...

...why recommend 750m?

Because optimization isn't simply:

request = current usage

Production workloads experience:

startup spikes
traffic bursts
background jobs
unpredictable load

A good optimizer leaves enough headroom for those situations.

✅ Verifying It From Kubernetes

I didn't want to trust only the dashboard.

So I verified everything directly from Kubernetes.

kubectl get pod \
-o jsonpath='{.status.containerStatuses[0].allocatedResources}'

Result:

{
"cpu":"750m",
"memory":"768Mi"
}

That was pretty satisfying.

🧠 Biggest Takeaways

This experiment completely changed how I think about Kubernetes resources.

I learned that these are not the same thing:

Requested Resources

↓

Actual Usage

↓

Recommended Resources

↓

Allocated Resources

↓

Infrastructure Cost

Those five numbers often get mixed together.

Understanding the difference is the first step toward Kubernetes cost optimization.

Final Thoughts

Before this project I thought Kubernetes cost optimization mostly meant:

"Find cheaper virtual machines."

Now I'd describe it differently:

Start by making sure your workloads request only the resources they actually need.

Node optimization comes later.

Workload optimization comes first.

📚 Project Repository

I documented the complete lab including:

GKE setup
CAST AI onboarding
Docker deployment
Kubernetes networking
Cost monitoring
Workload optimization
Troubleshooting

👉 GitHub:
https://github.com/Upshivam786/castai-gke-workload-optimization-lab

🙌 Thanks for Reading

If you've experimented with Kubernetes cost optimization tools like CAST AI, Karpenter, Goldilocks, or Vertical Pod Autoscaler, I'd love to hear about your experience.

Happy learning! 🚀

Tags:

kubernetes #gke #devops #docker #googlecloud #finops #mlops #castai

Top comments (0)