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 模式

Download history 441/week @ 2024-05-02 1162/week @ 2024-05-09 896/week @ 2024-05-16 724/week @ 2024-05-23 600/week @ 2024-05-30 919/week @ 2024-06-06 643/week @ 2024-06-13 645/week @ 2024-06-20 948/week @ 2024-06-27 258/week @ 2024-07-04 503/week @ 2024-07-11 421/week @ 2024-07-18 598/week @ 2024-07-25 543/week @ 2024-08-01 476/week @ 2024-08-08 601/week @ 2024-08-15

2,445 每月下载量

Apache-2.0

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