跳到主内容

v0.30.0 版本说明

EnerOS v0.30.0 版本说明

发布日期:2025-12-28 版本代号:Cloud Git Tag:v0.30.0 支持状态:稳定(Stable) Crate 总数:82(新增 4 个) 测试用例数:10500+(新增 500+)

概述

EnerOS v0.30.0「Cloud」是云原生支持专项版本,使 EnerOS 能够在 Kubernetes 上生产化部署。电力行业正在经历从「专有硬件 + 单体软件」向「云原生 + 微服务」的转型,省级调度中心开始在私有云上运行调度系统。v0.30.0 提供完整的云原生工具链:Kubernetes Operator、Helm Chart、容器镜像、弹性伸缩,使 EnerOS 能够以云原生方式部署、运维、扩缩容。

本版本引入了五大核心能力:云原生支持(Cloud Native)、Kubernetes Operator、Helm Chart、容器化(Containerization)、弹性伸缩(Elastic Scaling)。Operator 实现了 EnerOS 集群的全生命周期管理(部署、升级、扩缩容、备份恢复),Helm Chart 提供一键部署能力。

设计哲学上,v0.30.0 坚持「声明式」——集群状态以 Kubernetes Custom Resource 声明,Operator 负责调和实际状态至期望状态;「无状态化」——计算节点无状态,状态全部下沉至分布式存储,便于弹性伸缩;「可观测」——所有组件暴露 Prometheus 指标与 OpenTelemetry 追踪。

关键数据

指标数值说明
集群启动时间< 90s3 节点
滚动升级停机0零停机
弹性扩容时间< 60s新节点就绪
容器镜像大小180MBdistroless
Operator CRD 数5声明式 API
新增 Crate4云原生相关

新特性

1. 云原生支持

引入 eneros-cloud Crate,提供云原生基础设施抽象。EnerOS 可运行于任意 Kubernetes 集群(私有云、公有云、混合云)。

云平台适配

use eneros_cloud::{CloudProvider, CloudConfig};

let cloud = CloudProvider::auto_detect().await?;
// 自动检测:AWS / Azure / GCP / 阿里云 / 私有云

let config = CloudConfig::new()
    .storage(StorageConfig::auto())        // 自动选择存储后端
    .load_balancer(LbConfig::auto())       // 自动配置负载均衡
    .dns(DnsConfig::auto());               // 自动 DNS

cloud.configure(config).await?;

存储后端

后端类型适用场景性能
本地盘Local PV高性能计算极高
块存储Block PV通用
文件存储NFS PV共享访问
对象存储S3备份归档
分布式存储Ceph持久化

2. Kubernetes Operator

引入 eneros-cloud-operator Crate,提供 EnerOS Kubernetes Operator。Operator 以 Custom Resource Definition(CRD)形式声明 EnerOS 集群,自动完成部署、升级、扩缩容、故障恢复。

集群声明

# 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 控制器

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?;

// 当 CR 变更时,自动调和
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 能力

能力说明触发方式
部署创建集群创建 CR
扩缩容增减节点修改 nodes 字段
升级版本升级修改 version 字段
故障恢复节点重建Pod 故障
备份数据快照定时/手动
恢复灾难恢复从快照创建

3. Helm Chart

引入 eneros-cloud-helm Crate,提供 Helm Chart 一键部署。

Helm 部署

# 添加 EnerOS Helm 仓库
helm repo add eneros https://charts.eneros.io
helm repo update

# 一键部署
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

# 查看部署状态
kubectl get eneroscluster dispatch-prod

Chart 配置

# 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 覆盖范围

组件Chart 子模板必选默认
Coordinatorcoordinator.yaml3 副本
DataNodedatanode.yaml5 副本
Computecompute.yaml5 副本
Gatewaygateway.yaml2 副本
Prometheusmonitoring.yaml启用
Grafanagrafana.yaml启用
cert-managercerts.yaml启用

4. 容器化

引入 eneros-cloud-container Crate,提供生产级容器镜像。基于 distroless 基础镜像,镜像体积小、攻击面小。

镜像构建

# 多阶段构建
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"]

镜像规格

镜像大小基础说明
eneros/enerosd180MBdistroless主进程
eneros/operator120MBdistrolessOperator
eneros/cli95MBdistroless命令行
eneros/init50MBalpine初始化

健康检查

# Kubernetes 探针配置
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. 弹性伸缩

引入 eneros-cloud-autoscale Crate,提供自动弹性伸缩。根据负载自动增减计算节点。

HPA 自动伸缩

# 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

自定义指标伸缩

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?;

伸缩性能

操作耗时说明
扩容 1 节点45s含镜像拉取
扩容 5 节点60s并行拉取
缩容 1 节点30s含数据迁移
滚动升级3 min/节点零停机

改进

  • 启动加速:镜像分层优化,启动时间从 180s 降至 90s
  • 优雅停机:支持 SIGTERM 优雅退出,数据不丢失
  • 配置热更新:ConfigMap 变更自动生效,无需重启
  • 可观测性:内置 Prometheus exporter 与 OpenTelemetry trace

Bug 修复

  • 修复 eneros-cloud-operator 在 CR 删除时未清理 PV 的问题(#3008)
  • 修复 eneros-cloud-helm 升级时 values 合并冲突的问题(#3013)
  • 修复 eneros-cloud-container 在 ARM64 架构下的编译问题(#3018)
  • 修复 eneros-cloud-autoscale 在指标抖动时的频繁伸缩问题(#3023)

破坏性变更

  • 镜像基础:从 debian 改为 distroless,镜像内不再包含 shell
  • CRD 版本:从 v1beta1 升级至 v1,需更新 kubectl 版本至 1.22+

升级指南

  1. 执行 helm upgrade dispatch-prod eneros/eneros --version 0.30.0
  2. 更新 CRD:kubectl apply -f crds/eneros.io_v1.yaml
  3. 确认 kubectl 版本 >= 1.22
  4. 参考 docs/migration/v0.30.0.md 获取详细迁移步骤

致谢

感谢 15 位贡献者参与本版本开发,特别感谢云原生工作组的辛勤付出。v0.30.0 标志着 EnerOS 完成内部迭代阶段的所有能力建设,即将进入公开发布阶段。