>_ DevTrendszh

语言

首页

语言

板块

前端 后端 移动端 DevOps AI / ML 游戏开发 区块链 嵌入式 安全
Rust

用 Rust 从头重写 Kubernetes:深入了解 Rusternetes 项目

关于系统程序员试图用 Rust 重写一切的玩笑早已成为经典梗。通常这类项目会在"Hello World"阶段或解析基本配置时就止步不前。但 Rusternetes 的故事完全不同。该项目的作者直接瞄准了 Kubernetes,从头开始重写它。

这不是对 Go 代码的包装,也不是精简的测试模拟。该仓库包含一个完整的控制平面和节点组件:API server、scheduler、controller manager、kubelet 和 kube-proxy。所有代码均使用 Rust 编写,不依赖任何第三方 Go 依赖。

该项目包含超过 21.6 万行代码,分布在 10 个 crate、31 个控制器和超过 3100 个单元测试中。开发者通过 Sonobuoy 使用官方 Kubernetes e2e 测试套件(v1.35)来验证兼容性。目前 Rusternetes 成功通过了 94% 的兼容性测试(441 项中的 415 项)。

为什么要再造一个 Kubernetes

原始的 Kubernetes 使用 Go 编写,需要相当多的资源。即使要启动一个最小的本地集群(如 minikube 或 k3s),也必须分配虚拟机或运行多个包含 etcd 的重型容器。

Rusternetes 通过灵活的部署选项解决了这个问题。它有三种运行模式:

  1. 经典集群模式,使用 etcd。 所有组件运行在独立容器中,与 etcd 集群通信。
  2. 用 SQLite 或 Redis 替代 etcd。 连接 Rhino——一个用 Rust 编写的 etcd 兼容 gRPC 服务器。API 配置和二进制文件保持不变,只需修改 compose 文件。
  3. 所有组件打包成单一二进制文件。 API server、scheduler、controller manager、kubelet 和 kube-proxy 作为 Tokio 异步任务运行在单个进程中。集群状态写入单个 SQLite 文件或 Redis 实例。

All-in-One 模式解决了本地开发、CI/CD 流水线以及在边缘设备(Edge/IoT)上运行编排器的痛点,在这些场景中每一兆字节的内存都至关重要。

内置 Web 界面

Rusternetes 有一个内置的监控仪表板。它直接嵌入在 API server 二进制文件中,因此无需额外配置或部署任何东西。

Cluster Topology with Live Logs

该界面展示集群拓扑图(带流量动画)、CPU 和内存负载热力图、容器日志流,并允许你查看 ConfigMap、Secrets、RBAC 清单和部署状态。

项目内部:架构解析

该仓库组织为包含 10 个 crate 的 Cargo workspace。

┌───────────────────────────────────────────────────────────────┐
                       Control Plane                           
                                                               
  ┌──────────────────┐  ┌──────────────┐  ┌────────────────┐   
    API Server          Scheduler       Controller       
    Axum + TLS          Affinity        Taints           
    REST + Watch        Preemption      Manager          
    RBAC + Webhooks                     31 control       
    Web Console                         loops            
  └────────┬─────────┘  └──────────────┘  └────────────────┘   
                                                              
  ┌────────▼─────────┐                                         
   Storage                                                   
   etcd|SQLite|Redis│                                         
  └──────────────────┘                                         
├───────────────────────────────────────────────────────────────┤
                       Node Components                         
                                                               
  ┌──────────────────┐  ┌──────────────────────────────────┐   
    Kubelet             Kube-Proxy                         
    bollard (Docker)    iptables routing                   
    Probes+Volumes      ClusterIP/NodePort/LB              
  └──────────────────┘  └──────────────────────────────────┘   
└───────────────────────────────────────────────────────────────┘

集群的每个部分负责各自的工作领域:

  • api-server:使用 Axum 框架编写。处理 REST API、通过 Server-Sent Events 的 Watch API、验证和变更 webhook、CEL 规则评估以及 RBAC 授权。
  • scheduler:根据亲和性/反亲和性、污点、容忍度和资源约束为 Pod 选择节点。
  • controller-manager:包含 31 个 reconciliation 循环。处理 Deployment、ReplicaSet、StatefulSet、DaemonSet、Job、CronJob、HPA、Ingress 和 CRD。
  • kubelet:通过 bollard crate 与 Docker 或 Podman 通信。跟踪容器生命周期、运行存活探针和就绪探针,并挂载卷(hostPath、configMap、secret)。
  • kube-proxy:管理 ClusterIP、NodePort 和 LoadBalancer 服务类型的 iptables 规则。

如何运行测试

构建需要最新的 Rust、protobuf 编译器以及 Docker 或 Podman。

最快的测试方式是使用 SQLite 的 All-in-One 模式:

cargo build -p rusternetes
./target/release/rusternetes --data-dir ./cluster.db

如果你想通过 Docker Compose 启动一个更接近真实的多组件环境模拟:

git clone https://github.com/calfonso/rusternetes.git
cd rusternetes

export KUBELET_VOLUMES_PATH=$(pwd)/.rusternetes/volumes
docker compose -f docker-compose.sqlite.yml build
docker compose -f docker-compose.sqlite.yml up -d
bash scripts/bootstrap-cluster.sh

export KUBECONFIG=~/.kube/rusternetes-config
kubectl get nodes

启动完成后,你可以使用标准的 kubectl 工具与集群进行交互。

实用价值与结论

现在将 Rusternetes 投入生产还为时过早:虽然该项目通过了 94% 的 e2e 测试,但它仍然是实验性的。尽管如此,它有三个出色的用例。

首先,它是学习 Kubernetes 内部原理的理想学习指南。阅读模块划分清晰的 Rust 源代码比钻研原始 K8s 的巨大单体代码库要愉快得多。

其次,在单个进程中运行集群并使用 SQLite 可以节省测试环境和 CI/CD 的资源。

第三,该项目对在树莓派或嵌入式 IoT 平台等性能较弱的硬件上运行编排器非常有用。

如果你对 Rust 系统开发或编排器的工作原理感兴趣,这个项目绝对值得在 GitHub 上点个 star。

相关项目