4 releases

1.0.0 Sep 24, 2024
0.2.0 Jan 6, 2026
0.1.4 Oct 29, 2024
0.1.2 Oct 26, 2024
0.1.1 Oct 9, 2024

#13 in #kubernetes-client


Used in fleetmod

Apache-2.0

22KB

cri-api

本项目基于k8s-cri。 在此基础上,只支持v1规范,并完善examples,以方便用户开发使用。

研制计划

  • 0.1.0:支持v1和v1alpha2规范。
  • 0.2.0:只支持v1规范。

lib.rs:

Examples

Connecting over TCP:

use cri_api::v1::runtime_service_client::RuntimeServiceClient;
use cri_api::v1::ListContainersRequest;
use tokio::main;

#[tokio::main]
async fn main() {
    let mut client = RuntimeServiceClient::connect("http://[::1]:50051")
        .await
        .expect("Could not create client.");

    let request = tonic::Request::new(ListContainersRequest { filter: None });
    let response = client
        .list_containers(request)
        .await
        .expect("Request failed.");
    println!("{:?}", response);
}

Connecting to a Unix domain socket:

use std::convert::TryFrom;
use tokio::main;

use cri_api::v1::runtime_service_client::RuntimeServiceClient;
use tokio::net::UnixStream;
use tonic::transport::{Channel, Endpoint, Uri};
use tower::service_fn;

#[tokio::main]
async fn main() {
    let path = "/run/containerd/containerd.sock";

    let channel = Endpoint::try_from("http://[::]")
        .unwrap()
        .connect_with_connector(service_fn(move |_: Uri| UnixStream::connect(path)))
        .await
        .expect("Could not create client.");

    let mut client = RuntimeServiceClient::new(channel);
}

List sandboxes

use cri_api::v1::{ListPodSandboxRequest};
use cri_api::v1::runtime_service_client::RuntimeServiceClient;
use tokio::net::UnixStream;
use tonic::transport::{Endpoint, Uri};
use tower::service_fn;
use tokio::main;

#[tokio::main]
async fn main() {


    let mut client = RuntimeServiceClient::new(channel);

    let request = ListPodSandboxRequest {
        filter: None
    };

    let response =  client.list_pod_sandbox(request).await;
    println!("{:#?}", response);
}

List containers

use cri_api::v1::{ListContainersRequest};
use cri_api::v1::runtime_service_client::RuntimeServiceClient;
use tokio::net::UnixStream;
use tonic::transport::{Endpoint, Uri};
use tower::service_fn;
use tokio::main;

#[tokio::main]
async fn main() {
    let path = "/run/containerd/containerd.sock";
    let channel = Endpoint::try_from("http://[::]")
        .unwrap()
        .connect_with_connector(service_fn(move |_: Uri| UnixStream::connect(path)))
        .await
        .expect("Could not create client.");

    let mut client = RuntimeServiceClient::new(channel);

    let request = ListContainersRequest {
        filter: None
    };

    let response =  client.list_containers(request).await;
    println!("{:#?}", response);
}

Container Stats

use cri_api::v1::{ListContainersRequest, ContainerStatsRequest};
use cri_api::v1::runtime_service_client::RuntimeServiceClient;
use tokio::net::UnixStream;
use tonic::transport::{Endpoint, Uri};
use tower::service_fn;
use tokio::main;

#[tokio::main]
async fn main() {
    let path = "/run/containerd/containerd.sock";
    let channel = Endpoint::try_from("http://[::]")
        .unwrap()
        .connect_with_connector(service_fn(move |_: Uri| UnixStream::connect(path)))
        .await
        .expect("Could not create client.");

    let mut client = RuntimeServiceClient::new(channel);

    let containers = client.list_containers(
        ListContainersRequest::default()).await.expect("REASON").into_inner();
    for container in containers.containers {
        let stats = client.container_stats(ContainerStatsRequest {
            container_id: container.id.clone(),
        }).await.expect("REASON").into_inner();

        println!("Container ID: {:?}", container.id);
        println!("Usage: {:?}", stats);

    }
}

API version v1, original Protocol Buffers file.

Dependencies

~13–28MB
~299K SLoC