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 追踪。
关键数据
| 指标 | 数值 | 说明 |
|---|---|---|
| 集群启动时间 | < 90s | 3 节点 |
| 滚动升级停机 | 0 | 零停机 |
| 弹性扩容时间 | < 60s | 新节点就绪 |
| 容器镜像大小 | 180MB | distroless |
| Operator CRD 数 | 5 | 声明式 API |
| 新增 Crate | 4 | 云原生相关 |
新特性
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 子模板 | 必选 | 默认 |
|---|---|---|---|
| Coordinator | coordinator.yaml | 是 | 3 副本 |
| DataNode | datanode.yaml | 是 | 5 副本 |
| Compute | compute.yaml | 是 | 5 副本 |
| Gateway | gateway.yaml | 是 | 2 副本 |
| Prometheus | monitoring.yaml | 否 | 启用 |
| Grafana | grafana.yaml | 否 | 启用 |
| cert-manager | certs.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/enerosd | 180MB | distroless | 主进程 |
| eneros/operator | 120MB | distroless | Operator |
| eneros/cli | 95MB | distroless | 命令行 |
| eneros/init | 50MB | alpine | 初始化 |
健康检查
# 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+
升级指南
- 执行
helm upgrade dispatch-prod eneros/eneros --version 0.30.0 - 更新 CRD:
kubectl apply -f crds/eneros.io_v1.yaml - 确认 kubectl 版本 >= 1.22
- 参考
docs/migration/v0.30.0.md获取详细迁移步骤
致谢
感谢 15 位贡献者参与本版本开发,特别感谢云原生工作组的辛勤付出。v0.30.0 标志着 EnerOS 完成内部迭代阶段的所有能力建设,即将进入公开发布阶段。