9 个不稳定版本 (3 个重大更改)
新 0.4.0 | 2024 年 8 月 22 日 |
---|---|
0.3.3 | 2024 年 8 月 20 日 |
0.3.2 | 2024 年 7 月 24 日 |
0.3.1 | 2024 年 6 月 6 日 |
0.1.1 | 2023 年 7 月 14 日 |
#904 in Rust 模式
2,445 每月下载量
24KB
338 代码行
k8s-controller
此软件包实现了围绕 kube_runtime::Controller
的轻量级框架,该框架提供了一个更简单的接口来处理常见的控制器模式。要使用它,您需要定义控制器将要操作的数据,并在该结构上实现 Context
特质。
#[derive(Default, Clone)]
struct PodCounter {
pods: Arc<Mutex<BTreeSet<String>>>,
}
impl PodCounter {
fn pod_count(&self) -> usize {
let mut pods = self.pods.lock().unwrap();
pods.len()
}
}
#[async_trait::async_trait]
impl k8s_controller::Context for PodCounter {
type Resource = Pod;
type Error = kube::Error;
const FINALIZER_NAME: &'static str = "example.com/pod-counter";
async fn apply(
&self,
client: Client,
pod: &Self::Resource,
) -> Result<Option<Action>, Self::Error> {
let mut pods = self.pods.lock().unwrap();
pods.insert(pod.meta().uid.as_ref().unwrap().clone());
Ok(None)
}
async fn cleanup(
&self,
client: Client,
pod: &Self::Resource,
) -> Result<Option<Action>, Self::Error> {
let mut pods = self.pods.lock().unwrap();
pods.remove(pod.meta().uid.as_ref().unwrap());
Ok(None)
}
}
然后您可以通过创建一个 Controller
来在您的 Kubernetes 集群中运行它
let kube_config = Config::infer().await.unwrap();
let kube_client = Client::try_from(kube_config).unwrap();
let context = PodCounter::default();
let controller = k8s_controller::Controller::namespaced_all(
kube_client,
context.clone(),
ListParams::default(),
);
task::spawn(controller.run());
loop {
println!("{} pods running", context.pod_count());
sleep(Duration::from_secs(1));
}
依赖关系
~70MB
~1M SLoC