Skip to main content

v0.30.0 Release Notes

EnerOS v0.30.0 Release Notes

Release Date: 2025-12-28 Codename: Cloud Git Tag: v0.30.0 Support Status: Stable Total Crates: 82 (4 new) Test Cases: 10500+ (500+ new)

Overview

EnerOS v0.30.0 “Cloud” is a cloud-native-support-focused release that enables EnerOS to be deployed in production on Kubernetes. The power industry is undergoing a transformation from “proprietary hardware + monolithic software” to “cloud-native + microservices,” with provincial dispatch centers beginning to run dispatch systems on private clouds. v0.30.0 provides a complete cloud-native toolchain: Kubernetes Operator, Helm Chart, container images, and elastic scaling, enabling EnerOS to be deployed, operated, and scaled in a cloud-native manner.

This release introduces five core capabilities: Cloud Native, Kubernetes Operator, Helm Chart, Containerization, and Elastic Scaling. The Operator implements full lifecycle management of EnerOS clusters (deployment, upgrade, scaling, backup/recovery), and the Helm Chart provides one-click deployment.

In terms of design philosophy, v0.30.0 adheres to “declarative” — cluster state is declared via Kubernetes Custom Resources, and the Operator reconciles actual state to desired state; “stateless” — compute nodes are stateless, with all state下沉 to distributed storage for easy elastic scaling; “observable” — all components expose Prometheus metrics and OpenTelemetry traces.

Key Metrics

MetricValueDescription
Cluster startup time< 90s3 nodes
Rolling upgrade downtime0Zero downtime
Elastic scaling time< 60sNew node ready
Container image size180MBdistroless
Operator CRD count5Declarative API
New Crates4Cloud-native-related

New Features

1. Cloud Native Support

Introduces the eneros-cloud Crate, providing cloud-native infrastructure abstraction. EnerOS can run on any Kubernetes cluster (private cloud, public cloud, hybrid cloud).

Cloud Platform Adaptation

use eneros_cloud::{CloudProvider, CloudConfig};

let cloud = CloudProvider::auto_detect().await?;
// Auto-detect: AWS / Azure / GCP / Alibaba Cloud / Private cloud

let config = CloudConfig::new()
    .storage(StorageConfig::auto())        // Auto-select storage backend
    .load_balancer(LbConfig::auto())       // Auto-configure load balancer
    .dns(DnsConfig::auto());               // Auto DNS

cloud.configure(config).await?;

Storage Backends

BackendTypeApplicable ScenarioPerformance
Local diskLocal PVHigh-performance computingExtremely high
Block storageBlock PVGeneralHigh
File storageNFS PVShared accessMedium
Object storageS3Backup archiveLow
Distributed storageCephPersistenceHigh

2. Kubernetes Operator

Introduces the eneros-cloud-operator Crate, providing the EnerOS Kubernetes Operator. The Operator declares EnerOS clusters as Custom Resource Definitions (CRDs), automatically completing deployment, upgrade, scaling, and failure recovery.

Cluster Declaration

# eneros-cluster.yaml
apiVersion: eneros.io/v1
kind: EnerOSCluster
metadata:
  name: dispatch-prod
spec:
  version: "0.30.0"
  nodes: 5
  topology:
    shards: 32
    replicationFactor: 3
  storage:
    class: fast-ssd
    size: 500Gi
  resources:
    coordinator:
      replicas: 3
      cpu: "4"
      memory: "16Gi"
    datanode:
      replicas: 5
      cpu: "8"
      memory: "32Gi"
    compute:
      replicas: 5
      cpu: "16"
      memory: "64Gi"
  monitoring:
    prometheus: true
    grafana: true

Operator Controller

use eneros_cloud_operator::{Controller, Reconciler};

#[derive(Debug, Reconciler)]
enum EnerOSReconciler {
    #[reconcile(action = "deploy")]
    Deploy,
    #[reconcile(action = "scale")]
    Scale,
    #[reconcile(action = "upgrade")]
    Upgrade,
    #[reconcile(action = "backup")]
    Backup,
}

let controller = Controller::new()
    .crd("enerosclusters.eneros.io")
    .reconciler(EnerOSReconciler)
    .watch().await?;

// Auto-reconcile when CR changes
controller.on_change(|cluster, desired| async move {
    if cluster.nodes < desired.nodes {
        scale_up(cluster, desired.nodes).await?;
    }
    if cluster.version != desired.version {
        rolling_upgrade(cluster, desired.version).await?;
    }
});

Operator Capabilities

CapabilityDescriptionTrigger
DeployCreate clusterCreate CR
ScaleAdd/remove nodesModify nodes field
UpgradeVersion upgradeModify version field
Failure recoveryNode rebuildPod failure
BackupData snapshotScheduled/manual
RestoreDisaster recoveryCreate from snapshot

3. Helm Chart

Introduces the eneros-cloud-helm Crate, providing Helm Chart one-click deployment.

Helm Deployment

# Add EnerOS Helm repo
helm repo add eneros https://charts.eneros.io
helm repo update

# One-click deployment
helm install dispatch-prod eneros/eneros \
  --set cluster.nodes=5 \
  --set cluster.version=0.30.0 \
  --set storage.class=fast-ssd \
  --set monitoring.enabled=true

# View deployment status
kubectl get eneroscluster dispatch-prod

Chart Configuration

# values.yaml
cluster:
  name: dispatch-prod
  nodes: 5
  version: "0.30.0"

topology:
  shards: 32
  replicationFactor: 3

resources:
  coordinator:
    replicas: 3
    cpu: "4"
    memory: "16Gi"
  datanode:
    replicas: 5
    cpu: "8"
    memory: "32Gi"

storage:
  class: fast-ssd
  size: 500Gi

monitoring:
  enabled: true
  prometheus: true
  grafana: true
  alerts: true

security:
  tls:
    enabled: true
    certManager: true
  networkPolicy: true

Chart Coverage

ComponentChart Sub-templateRequiredDefault
Coordinatorcoordinator.yamlYes3 replicas
DataNodedatanode.yamlYes5 replicas
Computecompute.yamlYes5 replicas
Gatewaygateway.yamlYes2 replicas
Prometheusmonitoring.yamlNoEnabled
Grafanagrafana.yamlNoEnabled
cert-managercerts.yamlNoEnabled

4. Containerization

Introduces the eneros-cloud-container Crate, providing production-grade container images. Based on distroless base images, the images are small in size and attack surface.

Image Build

# Multi-stage build
FROM rust:1.75 AS builder
WORKDIR /build
COPY . .
RUN cargo build --release --bin enerosd

FROM gcr.io/distroless/cc-debian12
COPY --from=builder /build/target/release/enerosd /usr/local/bin/enerosd
ENTRYPOINT ["enerosd"]

Image Specifications

ImageSizeBaseDescription
eneros/enerosd180MBdistrolessMain process
eneros/operator120MBdistrolessOperator
eneros/cli95MBdistrolessCommand line
eneros/init50MBalpineInitialization

Health Checks

# Kubernetes probe configuration
livenessProbe:
  httpGet:
    path: /health
    port: 8080
  initialDelaySeconds: 30
  periodSeconds: 10

readinessProbe:
  httpGet:
    path: /ready
    port: 8080
  initialDelaySeconds: 5
  periodSeconds: 5

startupProbe:
  httpGet:
    path: /startup
    port: 8080
  failureThreshold: 30
  periodSeconds: 10

5. Elastic Scaling

Introduces the eneros-cloud-autoscale Crate, providing automatic elastic scaling. Automatically adds/removes compute nodes based on load.

HPA Auto Scaling

# Horizontal Pod Autoscaler
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: eneros-compute
spec:
  scaleTargetRef:
    apiVersion: eneros.io/v1
    kind: EnerOSComputePool
    name: compute
  minReplicas: 3
  maxReplicas: 20
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70
  - type: Pods
    pods:
      metric:
        name: eneros_task_queue_length
      target:
        type: AverageValue
        averageValue: 100

Custom Metric Scaling

use eneros_cloud_autoscale::{Autoscaler, Metric};

let autoscaler = Autoscaler::new(&cluster)
    .min_nodes(3)
    .max_nodes(20)
    .metric(Metric::custom("task_queue_length")
        .target(100)
        .scale_up_threshold(120)
        .scale_down_threshold(50))
    .metric(Metric::cpu().target(70))
    .cooldown_up(Duration::minutes(2))
    .cooldown_down(Duration::minutes(5));

autoscaler.start().await?;

Scaling Performance

OperationDurationDescription
Scale up 1 node45sIncludes image pull
Scale up 5 nodes60sParallel pull
Scale down 1 node30sIncludes data migration
Rolling upgrade3 min/nodeZero downtime

Improvements

  • Startup Acceleration: Image layering optimization, startup time reduced from 180s to 90s
  • Graceful Shutdown: Supports SIGTERM graceful exit, no data loss
  • Configuration Hot Reload: ConfigMap changes take effect automatically, no restart needed
  • Observability: Built-in Prometheus exporter and OpenTelemetry trace

Bug Fixes

  • Fixed eneros-cloud-operator not cleaning up PV when CR deleted (#3008)
  • Fixed eneros-cloud-helm values merge conflict during upgrade (#3013)
  • Fixed eneros-cloud-container compilation issue on ARM64 architecture (#3018)
  • Fixed eneros-cloud-autoscale frequent scaling due to metric fluctuation (#3023)

Breaking Changes

  • Image Base: Changed from debian to distroless; shell no longer included in image
  • CRD Version: Upgraded from v1beta1 to v1; kubectl version 1.22+ required

Upgrade Guide

  1. Run helm upgrade dispatch-prod eneros/eneros --version 0.30.0
  2. Update CRD: kubectl apply -f crds/eneros.io_v1.yaml
  3. Confirm kubectl version >= 1.22
  4. Refer to docs/migration/v0.30.0.md for detailed migration steps

Acknowledgments

Thanks to the 15 contributors who participated in this release, with special thanks to the cloud-native working group for their hard work. v0.30.0 marks EnerOS completing all capability development for the internal iteration phase and entering the public release phase.