9个版本
0.3.0 | 2021年4月18日 |
---|---|
0.2.1 | 2020年4月26日 |
0.1.5 | 2020年3月2日 |
0.1.4 | 2020年2月26日 |
0.1.2 | 2019年12月26日 |
#178 在 配置 分类中
每月25次下载
285KB
6K SLoC
Roperator
Roperator 允许您轻松使用Rust编写Kubernetes Operators。Roperator 处理了监视和更新资源的所有机制和管道。您只需要编写一个函数,返回您资源的期望状态。Roperator 从优秀的Metacontroller 项目中汲取了大量灵感,该项目似乎已经不再维护。
声明式Operator
本项目的目标是使编写操作符变得非常容易,以应对绝大多数常见情况。Roperator专注于您有一个父自定义资源定义的情况,并且对于每个父资源,您都会想要一组相应的子资源。例如,您可能有一个描述您应用程序的CRD,并且对于该自定义资源的每个实例,您都会想要创建一组可能复杂的子资源。
您的操作符的核心是一个同步函数,该函数接收一个父自定义资源的快照视图以及一个SyncRequest
结构体中存在的任何子资源。此函数将简单地返回给定父资源的期望子资源集,以及应设置为父资源status
的JSON对象。您的同步函数不需要以任何方式直接与Kubernetes API服务器通信。Roperator将处理监视所有资源,在需要时调用您的同步函数,并更新子资源和父状态。
EchoServer示例 是一个很好的端到端示例,可以查看所有事物是如何组合在一起的。
主分支状态
主分支包括即将发布的0.2.0版本的工作。这包括一些小的破坏性更改。如果您想针对0.1.x分支提交错误修复PR,那么请使用release-0.1
作为该分支的基分支。
依赖关系
- Rust 1.46或更高版本
- OpenSSL 库和头文件。Roperator 使用 rust
openssl
crate。您可以在此处查看其构建和链接到 openssl 的文档。
入门指南
首先添加依赖项
# Cargo.toml
[dependencies]
roperator = "*"
[dev-dependencies]
roperator = { version = "*", features = ["testkit"] }
Operator 配置
您首先需要的是一个配置对象,该对象指定了将作为 父级 的 CRD 之间的关系以及可能创建为 子级 的资源类型。
use roperator::prelude::{k8s_types, K8sType, OperatorConfig, ChildConfig, run_operator};
/// The type of our parent Custom Resource. This must match the fields provided in the CRD
pub static PARENT_TYPE: &K8sType = &K8sType {
api_version: "example.com/v1alpha1",
kind: "MyResource",
plural_kind: "myresources",
};
fn main() {
let operator_config = OperatorConfig::new("my-operator-name", PARENT_TYPE)
.with_child(k8s_types::core::v1::Pod, ChildConfig::recreate())
.with_child(k8s_types::core::v1::Service, ChildConfig::replace());
//.... you can have as many child types as you want, but you need to specify all of the types that you may create ahead of time
let my_handler = MyHandler; // we'll look at Handlers further down
run_operator(operator_config, my_handler).expect("failed to run operator");
}
处理器
您的 operator 的主要逻辑位于您的 Handler
实现中。您需要实现的主要函数是 Handler::sync
,它接受一个 SyncRequest
并返回一个 SyncResponse
。自动为所有 Fn(&SyncRequest) -> Result<SyncResponse, Error>
实现了 Handler
trait,但您也可以为您的类型实现它。
use roperator::prelude::{Handler, SyncRequest, SyncResponse, FinalizeResponse, Error};
struct MyHandler;
impl Handler for MyHandler {
fn sync(&self, request: &SyncRequest) -> Result<SyncResponse, Error> {
// some json object that describes the status of the parent. Typically, this will be determined just based on the
// statuses of the child resources
let parent_status = determine_parent_status(request);
// returns all of the desired kubernetes resources that should correspond to this parent
let children = determine_desired_child_resources(request);
Ok(SyncResponse {
status: parent_status,
children
})
}
}
处理器可以可选地实现 finalize
函数。当父级资源正在被删除时,将调用此函数,并允许您清理可能已创建的任何外部资源。Roperator 尽力确保在删除每个父级时至少调用一次 finalize
。然而,由于 Kubernetes 允许客户端在不等待最终化程序的情况下强制删除资源,因此无法保证这一点。
fn finalize(&self, request: &SyncRequest) -> Result<FinalizeResponse, Error> {
// We return a boolean that says whether the finalization was successful or not. If we return false,
// then roperator will continue to regularly re-try your finalize function until it succeeds.
// As soon as we return `true`, roperator will remove itself from the finalizers list of your parent
// resource and allow the deletion to proceed.
let cleanup_succeeded: bool = do_cleanup(request);
let parent_status = determine_parent_status(request);
Ok(FinalizeResponse {
status: parent_status,
finalized: cleanup_succeeded,
})
}
通往 1.0 的道路
Roperator 仍处于初级阶段,尚未达到“生产级”。API 也将在我们达到 1.0 阶段之前保持不稳定。它将非常感谢早期用户的反馈,因此请提交问题或提交拉取请求。目标是尽快确定在 1.0 发布之前需要解决的问题,并尽快专注于发布生产级的 1.0 版本。
在 1.0 发布之前肯定需要解决的问题包括
- 构建一个更完整的测试套件
- 改进从
SyncRequest
访问子资源的 API - 确定
TestKit
的更一致和简单的 API - 确定在同一个进程中运行多个 operator 的更简单 API
欢迎贡献
欢迎并感谢贡献。请查看贡献指南以获取更多信息。
许可
根据您的选择,在 Apache License,Version 2.0 或 MIT 许可证下许可。除非您明确声明,否则根据 Apache-2.0 许可证定义的,您有意提交给 Roperator 的任何贡献均应按上述方式双重许可,而无需任何附加条款或条件。
依赖关系
~15–30MB
~448K SLoC