This document provides context and guidelines for AI coding assistants working on the Karpenter Optimizer project.
Karpenter Optimizer is a tool for optimizing Karpenter NodePool configurations based on actual cluster usage data. It analyzes Kubernetes workloads and node capacity to provide cost-optimized instance type recommendations.
cmd/api/ (main entry), internal/ (core logic)internal/api/server.go - REST API endpointsinternal/recommender/recommender.go - Legacy recommendation logic (cluster-summary based)internal/recommender/node_pool_recommender.go - PRIMARY recommendation engine (NodePool-based)internal/kubernetes/client.go - Kubernetes API client (nodes, pods, NodePools)internal/awspricing/client.go - AWS Pricing API client for instance pricinginternal/ollama/client.go - Ollama LLM client for AI explanationsfrontend/src/App.js - Main application componentcomponents/GlobalClusterSummary.js - Cluster overview and recommendation triggercomponents/NodePoolCard.js - Displays individual NodePool recommendationscomponents/NodeUsageView.js - Real-time node resource usage visualizationcomponents/DisruptionTracker.js - Node disruption tracking (on-demand)type NodePoolCapacityRecommendation struct {
NodePoolName string `json:"nodePoolName"`
CurrentNodes int `json:"currentNodes"`
CurrentInstanceTypes []string `json:"currentInstanceTypes"` // Format: "m6g.2xlarge (27)"
CurrentCPUUsed float64 `json:"currentCPUUsed"`
CurrentCPUCapacity float64 `json:"currentCPUCapacity"`
CurrentMemoryUsed float64 `json:"currentMemoryUsed"`
CurrentMemoryCapacity float64 `json:"currentMemoryCapacity"`
CurrentCost float64 `json:"currentCost"`
RecommendedNodes int `json:"recommendedNodes"`
RecommendedInstanceTypes []string `json:"recommendedInstanceTypes"`
RecommendedTotalCPU float64 `json:"recommendedTotalCPU"`
RecommendedTotalMemory float64 `json:"recommendedTotalMemory"`
RecommendedCost float64 `json:"recommendedCost"`
CostSavings float64 `json:"costSavings"`
CostSavingsPercent float64 `json:"costSavingsPercent"`
Reasoning string `json:"reasoning"` // AI-generated explanation
Architecture string `json:"architecture"` // arm64 or amd64
CapacityType string `json:"capacityType"` // spot or on-demand
}
type NodeInfo struct {
Name string
InstanceType string
Architecture string
CapacityType string // "spot" or "on-demand"
NodePool string
CPUUsage *ResourceUsage
MemoryUsage *ResourceUsage
PodCount int
// ...
}
GET /api/v1/recommendations - NodePool-based recommendations (uses GenerateRecommendationsFromNodePools)GET /api/v1/nodepools/recommendations - Same as above, returns recommendations arrayGET /api/v1/recommendations/cluster-summary - Enhanced with Ollama explanations (uses nodepools endpoint + Ollama)GET /api/v1/recommendations/cluster-summary/stream - SSE version with progress updatesGET /api/v1/nodepools - List all NodePools with actual node dataGET /api/v1/nodes - Get all nodes with usage dataGET /api/v1/cluster/summary - Cluster-wide statistics1. Fetch NodePools with actual nodes (ListNodePools)
2. For each NodePool:
a. Calculate current capacity (CPU/Memory allocatable from nodes)
b. Calculate current cost (based on actual instance types and capacity types)
c. Find optimal instance types (findOptimalInstanceTypesWithCapacityType)
d. Try both spot and on-demand to find best cost
e. Only recommend if cost savings > 0
3. Enhance with Ollama explanations (if Ollama available)
spec.nodeName set)NodePoolRecommendation) and new (NodePoolCapacityRecommendation)recommendation.nodePoolName !== undefinedinternal/recommender/node_pool_recommender.go - PRIMARY recommendation engine
GenerateRecommendationsFromNodePools() - Main recommendation functionfindOptimalInstanceTypesWithCapacityType() - Finds best instance types and capacity typegetCandidateInstanceTypes() - Gets candidate instance types (AWS API or fallback)EnhanceRecommendationsWithOllama() - Adds AI explanationsinternal/recommender/recommender.go - Legacy recommendation logic
GenerateRecommendationsFromClusterSummary() - Cluster-wide recommendations (deprecated)estimateCost() - Cost calculation with AWS Pricing API integrationestimateInstanceCapacity() - Estimates CPU/Memory for instance typesinternal/kubernetes/client.go - Kubernetes integration
ListNodePools() - Lists NodePools with actual node dataGetAllNodesWithUsage() - Gets all nodes with CPU/Memory usageGetNodeDisruptions() - Tracks node disruptions (FailedDraining events)internal/awspricing/client.go - AWS Pricing API
GetProductPrice() - Gets instance pricing (on-demand or spot)GetAvailableEC2InstanceTypes() - Lists available instance types from AWSinternal/api/server.go - API endpoints
getRecommendations() - Main recommendation endpointgetRecommendationsFromClusterSummary() - Enhanced with OllamagetNodePoolRecommendations() - NodePool-specific recommendationsfrontend/src/App.js - Main app, manages recommendations statefrontend/src/components/NodePoolCard.js - Displays recommendation cards (supports both formats)frontend/src/components/GlobalClusterSummary.js - Cluster overview and recommendation triggerestimateInstanceCapacity() in recommender.goonDemandPrices map (if hardcoded)estimateCostFromFamily() if neededinternal/recommender/node_pool_recommender.gointernal/recommender/recommender.go → estimateCost()findOptimalInstanceTypesWithCapacityType()internal/api/server.go → setupRoutes()GenerateRecommendationsFromNodePools() for recommendationsprogressCallback for SSE endpointsNodePoolCard.js for format detectionOLLAMA_URL - Ollama server URL (optional, for AI explanations)OLLAMA_MODEL - Ollama model name (default: “granite4:latest”)KUBECONFIG - Kubernetes config pathKUBE_CONTEXT - Kubernetes contextPORT - API server port (default: 8080)gofmtcontext.Context for all API calls with timeouts⚠️ DO NOT:
âś… DO: