用 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 通过灵活的部署选项解决了这个问题。它有三种运行模式:
- 经典集群模式,使用 etcd。 所有组件运行在独立容器中,与 etcd 集群通信。
- 用 SQLite 或 Redis 替代 etcd。 连接 Rhino——一个用 Rust 编写的 etcd 兼容 gRPC 服务器。API 配置和二进制文件保持不变,只需修改 compose 文件。
- 所有组件打包成单一二进制文件。 API server、scheduler、controller manager、kubelet 和 kube-proxy 作为 Tokio 异步任务运行在单个进程中。集群状态写入单个 SQLite 文件或 Redis 实例。
All-in-One 模式解决了本地开发、CI/CD 流水线以及在边缘设备(Edge/IoT)上运行编排器的痛点,在这些场景中每一兆字节的内存都至关重要。
内置 Web 界面
Rusternetes 有一个内置的监控仪表板。它直接嵌入在 API server 二进制文件中,因此无需额外配置或部署任何东西。

该界面展示集群拓扑图(带流量动画)、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:通过
bollardcrate 与 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。
相关项目