πŸ“šBook Signing at KubeCon EU 2026Meet us at Booking.com HQ (Mon 18:30-21:00) & vCluster booth #521 (Tue 24 Mar, 12:30-1:30pm) β€” free book giveaway!RSVP Booking.com Event
Autoscaling beginner ⏱ 15 minutes K8s 1.28+

Goldilocks VPA Dashboard for Resource Optimization

Deploy Goldilocks to visualize VPA recommendations across all workloads and identify over-provisioned or under-provisioned containers with actionable

By Luca Berton β€’ β€’ πŸ“– 5 min read

πŸ’‘ Quick Answer: Goldilocks creates VPA objects for every Deployment in labeled namespaces and provides a dashboard showing β€œjust right” resource recommendations β€” identifying which containers are over-provisioned (wasting money) or under-provisioned (risking OOM).

The Problem

  • You have 200+ Deployments β€” which ones are over/under-provisioned?
  • VPA recommendations exist but nobody reads kubectl describe vpa for each one
  • Need a visual dashboard for platform teams to review resource efficiency
  • Want to identify quick wins (containers requesting 4Gi but using 200Mi)

The Solution

Install Goldilocks

helm repo add fairwinds-stable https://charts.fairwinds.com/stable
helm install goldilocks fairwinds-stable/goldilocks \
  --namespace goldilocks --create-namespace \
  --set dashboard.enabled=true \
  --set vpa.enabled=true

Enable for Namespaces

# Label namespaces to enable Goldilocks analysis
kubectl label namespace default goldilocks.fairwinds.com/enabled=true
kubectl label namespace production goldilocks.fairwinds.com/enabled=true
kubectl label namespace staging goldilocks.fairwinds.com/enabled=true

# Goldilocks auto-creates VPA (mode=Off) for every Deployment in labeled namespaces

Access Dashboard

# Port-forward to dashboard
kubectl port-forward -n goldilocks svc/goldilocks-dashboard 8080:80

# Or expose via Ingress
kubectl apply -f - << 'INGRESS'
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: goldilocks
  namespace: goldilocks
spec:
  rules:
    - host: goldilocks.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: goldilocks-dashboard
                port:
                  number: 80
INGRESS

Dashboard Shows Per-Container

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Namespace: production                                           β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Deployment: api-server                                         β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ Container   β”‚ Current  β”‚ Lower    β”‚ Target   β”‚ Upper       β”‚ β”‚
β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚
β”‚ β”‚ api (CPU)   β”‚ 1000m    β”‚ 50m      β”‚ 150m     β”‚ 500m        β”‚ β”‚
β”‚ β”‚ api (Mem)   β”‚ 2Gi      β”‚ 128Mi    β”‚ 256Mi    β”‚ 1Gi         β”‚ β”‚
β”‚ β”‚ β†’ OVER-PROVISIONED: saving 850m CPU, 1.75Gi memory         β”‚ β”‚
β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚
β”‚ β”‚ sidecar     β”‚ 100m     β”‚ 10m      β”‚ 25m      β”‚ 100m        β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Deployment: worker                                             β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ worker(CPU) β”‚ 200m     β”‚ 300m     β”‚ 800m     β”‚ 2000m       β”‚ β”‚
β”‚ β”‚ worker(Mem) β”‚ 512Mi    β”‚ 1Gi      β”‚ 2Gi      β”‚ 4Gi         β”‚ β”‚
β”‚ β”‚ β†’ UNDER-PROVISIONED: needs 600m more CPU, 1.5Gi more RAM   β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Export Recommendations as YAML

# Get all VPA recommendations programmatically
kubectl get vpa -n production -o json | jq '
  .items[] |
  {
    deployment: .spec.targetRef.name,
    containers: [.status.recommendation.containerRecommendations[] |
      {
        name: .containerName,
        target_cpu: .target.cpu,
        target_memory: .target.memory,
        current_cpu: .lowerBound.cpu,
        upper_cpu: .upperBound.cpu
      }
    ]
  }
'

Common Issues

No recommendations showing

  • Cause: VPA needs 24-48h of metrics; or metrics-server not installed
  • Fix: Wait; verify kubectl top pods works

Dashboard shows β€œNo data”

  • Cause: Namespace not labeled
  • Fix: kubectl label ns <name> goldilocks.fairwinds.com/enabled=true

Best Practices

  1. Enable on all non-system namespaces β€” comprehensive visibility
  2. Review weekly β€” top 10 over-provisioned workloads = quick cost wins
  3. Apply β€œTarget” recommendations β€” balanced between lower/upper bound
  4. Combine with VPA Auto β€” Goldilocks shows, VPA applies
  5. Track savings β€” before/after resource reduction per namespace

Key Takeaways

  • Goldilocks = VPA recommendations + web dashboard (visual)
  • Label namespaces to enable; auto-creates VPA objects per Deployment
  • Shows current vs recommended resources per container
  • Identifies over-provisioned (wasting money) and under-provisioned (risking OOM)
  • Typical finding: 40-60% of cluster resources are over-provisioned
  • Use β€œTarget” column as the recommended right-size value
  • Apply recommendations gradually; monitor for OOM/throttling after changes
#goldilocks #vpa #cost-optimization #resource-management #dashboard
Luca Berton
Written by Luca Berton

Principal Solutions Architect specializing in Kubernetes, AI/GPU infrastructure, and cloud-native platforms. Author of Kubernetes Recipes and creator of CopyPasteLearn courses.

Kubernetes Recipes book cover

Want More Kubernetes Recipes?

This recipe is from Kubernetes Recipes, our 750-page practical guide with hundreds of production-ready patterns.

Luca Berton Ansible Pilot Ansible by Example Open Empower K8s Recipes Terraform Pilot CopyPasteLearn ProteinLens