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
| Metric | Value | Description |
|---|---|---|
| Cluster startup time | < 90s | 3 nodes |
| Rolling upgrade downtime | 0 | Zero downtime |
| Elastic scaling time | < 60s | New node ready |
| Container image size | 180MB | distroless |
| Operator CRD count | 5 | Declarative API |
| New Crates | 4 | Cloud-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
| Backend | Type | Applicable Scenario | Performance |
|---|---|---|---|
| Local disk | Local PV | High-performance computing | Extremely high |
| Block storage | Block PV | General | High |
| File storage | NFS PV | Shared access | Medium |
| Object storage | S3 | Backup archive | Low |
| Distributed storage | Ceph | Persistence | High |
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
| Capability | Description | Trigger |
|---|---|---|
| Deploy | Create cluster | Create CR |
| Scale | Add/remove nodes | Modify nodes field |
| Upgrade | Version upgrade | Modify version field |
| Failure recovery | Node rebuild | Pod failure |
| Backup | Data snapshot | Scheduled/manual |
| Restore | Disaster recovery | Create 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
| Component | Chart Sub-template | Required | Default |
|---|---|---|---|
| Coordinator | coordinator.yaml | Yes | 3 replicas |
| DataNode | datanode.yaml | Yes | 5 replicas |
| Compute | compute.yaml | Yes | 5 replicas |
| Gateway | gateway.yaml | Yes | 2 replicas |
| Prometheus | monitoring.yaml | No | Enabled |
| Grafana | grafana.yaml | No | Enabled |
| cert-manager | certs.yaml | No | Enabled |
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
| Image | Size | Base | Description |
|---|---|---|---|
| eneros/enerosd | 180MB | distroless | Main process |
| eneros/operator | 120MB | distroless | Operator |
| eneros/cli | 95MB | distroless | Command line |
| eneros/init | 50MB | alpine | Initialization |
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
| Operation | Duration | Description |
|---|---|---|
| Scale up 1 node | 45s | Includes image pull |
| Scale up 5 nodes | 60s | Parallel pull |
| Scale down 1 node | 30s | Includes data migration |
| Rolling upgrade | 3 min/node | Zero 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-operatornot cleaning up PV when CR deleted (#3008) - Fixed
eneros-cloud-helmvalues merge conflict during upgrade (#3013) - Fixed
eneros-cloud-containercompilation issue on ARM64 architecture (#3018) - Fixed
eneros-cloud-autoscalefrequent 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
- Run
helm upgrade dispatch-prod eneros/eneros --version 0.30.0 - Update CRD:
kubectl apply -f crds/eneros.io_v1.yaml - Confirm kubectl version >= 1.22
- Refer to
docs/migration/v0.30.0.mdfor 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.