Skip to content
GreenKube

Energy Estimation Methodology

GreenKube estimates per-pod energy consumption using a methodology based on the Cloud Carbon Footprint (CCF) project, adapted for real-time Kubernetes workload monitoring.

The energy estimation pipeline converts CPU utilization metrics into energy consumption (Joules) using known power characteristics of cloud instance types.

Input Metrics
📈 CPU Usage cores
💾 Instance Type metadata
🖥️ Node TDP watts/vCPU
Power Model
Pidle = min_watts × vCPUs
Pmax = max_watts × vCPUs
Pnode = Pidle + (Pmax − Pidle) × U
U = CPU utilization (0.0 – 1.0)
Energy
Enode = Pnode × Δt
Joules = Watts × seconds
Epod = cpupodcputotal × Enode
Proportional distribution
Carbon
CO₂e = EkWh × I × PUE
EkWh = Joules / 3,600,000
I = gCO₂e/kWh (Electricity Maps)
PUE = datacenter overhead

Each cloud instance type has a power profile defining its energy characteristics:

ParameterDescriptionUnit
min_wattsPower consumption at idle (per vCPU)Watts
max_wattsPower consumption at 100% utilization (per vCPU)Watts
vcpusNumber of virtual CPUscount

GreenKube includes built-in profiles for common instance types across:

  • AWS — m5, c5, r5, t3, etc.
  • GCP — n1, n2, e2, c2, etc.
  • Azure — Standard_D, Standard_E, Standard_F, etc.
  • OVH — Based on averaged micro-architecture data
  • Scaleway — Based on averaged micro-architecture data

For each node, the power consumption is calculated as:

P_node = P_idle + (P_max - P_idle) × U
Where:
P_idle = min_watts × vCPUs (idle power)
P_max = max_watts × vCPUs (max power)
U = CPU utilization ratio (0.0 to 1.0)

This is a linear interpolation between idle and max power, which is a widely-used approximation validated by SPECpower benchmarks.

Energy is the integral of power over time:

E_node = P_node × duration_seconds (Joules)

Node-level energy is distributed to pods proportionally by CPU usage:

E_pod = (cpu_pod / cpu_total_node) × E_node

Where:

  • cpu_pod — CPU usage of the specific pod
  • cpu_total_node — Total CPU usage across all pods on the node

Energy is converted to CO₂ equivalent emissions:

CO₂e (grams) = E (kWh) × I (gCO₂e/kWh) × PUE
Where:
E (kWh) = E (Joules) / 3,600,000
I = Grid carbon intensity (from Electricity Maps or default)
PUE = Power Usage Effectiveness (datacenter overhead)

The carbon intensity of electricity varies by:

  • Geographic location (carbon zone)
  • Time of day (renewable energy availability)
  • Season (heating/cooling demand)

GreenKube uses the Electricity Maps API for real-time intensity data. When the API is unavailable, GreenKube follows a two-step fallback:

  1. Per-zone default — A built-in table of average grid intensities per zone (e.g., France ≈ 85 gCO₂e/kWh, Germany ≈ 385 gCO₂e/kWh)
  2. Global default — If no per-zone default exists, the configurable global fallback is used (default: 500 gCO₂e/kWh)

PUE accounts for datacenter overhead (cooling, lighting, networking):

PUE = Total facility power / IT equipment power
ProviderPUESource
AWS1.15AWS Sustainability
GCP1.09Google Data Centers
Azure1.18Microsoft Sustainability Report 2025
OVH1.26OVHcloud Sustainability
Scaleway1.37Scaleway Environmental Leadership

Since the Cloud Carbon Footprint project doesn’t provide power constants for OVH and Scaleway, GreenKube derives provider-level estimates using the CCF methodology for “unknown micro-architectures”:

“When we don’t know the underlying processor micro-architecture, we use the average of all micro-architectures used by that cloud provider.”

Identified architectures: Intel Haswell, Broadwell, Skylake, Cascade Lake; AMD EPYC Milan, Genoa

Micro-architectureMin WattsMax Watts
Haswell1.905.99
Broadwell0.713.54
Skylake0.644.05
Cascade Lake0.643.80
AMD EPYC Milan0.451.87
AMD EPYC Genoa*0.451.87

Average: Min Watts = 0.80, Max Watts = 3.52

Identified architectures: AMD EPYC Naples, Rome, Milan; Intel Skylake, Cascade Lake

Micro-architectureMin WattsMax Watts
AMD EPYC 1st Gen0.822.55
AMD EPYC 2nd Gen0.471.64
AMD EPYC 3rd Gen0.451.87
Intel Skylake0.644.05
Intel Cascade Lake0.643.80

Average: Min Watts = 0.60, Max Watts = 2.78

When GreenKube cannot determine the exact instance type, it uses a configurable default profile:

# Default values in Helm
config:
defaults:
pue: 1.3
instance:
vcores: 1
minWatts: 1.0
maxWatts: 10.0

When default values are used, the metric is flagged as is_estimated: true with the reason recorded in estimation_reasons.

GreenKube also supports embodied emissions — the carbon footprint of manufacturing the hardware — via the Boavizta API:

Embodied CO₂e per pod = (Server GWP_manufacture / Lifespan_hours) × Duration × (pod_share / node_total)

This data is cached in the EmbodiedRepository to minimize API calls.

Every metric in GreenKube includes transparency flags:

FieldDescription
is_estimatedtrue if any default/fallback was used
estimation_reasonsList of reasons why estimation was needed

Example reasons:

  • "Unknown instance type, using default profile"
  • "Carbon intensity API unavailable, using per-zone default"
  • "Carbon intensity API unavailable, using global default 500 gCO₂e/kWh"
  • "OpenCost data unavailable, cost set to 0"
SourceDataFrequency
PrometheusCPU, memory, network, disk metricsReal-time (5m default)
Kubernetes APINode metadata, pod specsReal-time
Electricity MapsGrid carbon intensityCached (hourly default)
Boavizta APIHardware embodied emissionsCached (long-term)
OpenCostCost allocationReal-time
CCF CoefficientsInstance power profilesBuilt-in (static)