Rust implementation of Kubernetes API types, refactored from the official Go codebase.
This project provides a complete Rust implementation of Kubernetes API types, offering type-safe, idiomatic Rust interfaces for working with Kubernetes resources. The types are carefully refactored from the official Kubernetes Go codebase (staging/src/k8s.io/api and pkg/apis).
- Type-safe: Full Rust type system guarantees for Kubernetes API objects
- Serde integration: Built-in JSON/YAML serialization and deserialization
- Modular design: Separated into multiple crates for granular dependencies
- Feature flags: Optional compilation of API groups to minimize binary size
- Validation: Built-in validation logic for API types
- Version conversion: Support for converting between API versions
- External codecs: JSON/Protobuf codecs and strategic-merge-patch content types
The project is organized as a Cargo workspace with the following crates:
-
k8s-api-core - Fundamental types and utilities
- Schema types:
GroupVersionKind,GroupVersionResource - Resource types:
Quantity,IntOrString - Runtime interfaces and traits
- Schema types:
-
k8s-apimachinery - API machinery and metadata types
TypeMeta,ObjectMeta,ListMetaTime,Duration,MicroTimeStatus,Condition,LabelSelectorOwnerReference,ManagedFieldsEntry
- k8s-api - Kubernetes API types for all API groups
core/v1: Pod, Service, ConfigMap, Secret, Volume, etc.apps/v1: Deployment, StatefulSet, DaemonSet, ReplicaSetbatch/v1: Job, CronJob- More API groups coming soon...
-
k8s-api-validation - Validation logic for API types
- Field validation rules
- Business logic validation
- Custom validators
-
k8s-api-conversion - Version conversion between API versions
- Version upgrade/downgrade logic
- Conversion schemes
-
k8s-api-codec - External codecs for JSON/Protobuf and patch content types
Add this to your Cargo.toml:
[dependencies]
k8s-api = "0.1"
k8s-apimachinery = "0.1"use k8s_api::core::v1::{Pod, PodSpec, Container};
use k8s_apimachinery::ObjectMeta;
let pod = Pod {
metadata: ObjectMeta {
name: Some("my-pod".to_string()),
namespace: Some("default".to_string()),
..Default::default()
},
spec: Some(PodSpec {
containers: vec![
Container {
name: "nginx".to_string(),
image: Some("nginx:latest".to_string()),
..Default::default()
}
],
..Default::default()
}),
..Default::default()
};
// Serialize to JSON
let json = serde_json::to_string_pretty(&pod)?;
println!("{}", json);use k8s_api::scheduling::v1::PriorityClass;
use k8s_apimachinery::{ObjectMeta, TypeMeta};
let class = PriorityClass {
type_meta: TypeMeta::new("scheduling.k8s.io/v1", "PriorityClass"),
metadata: ObjectMeta::named("high-priority"),
value: 1000,
global_default: Some(false),
description: "critical workloads".to_string(),
preemption_policy: Some("PreemptLowerPriority".to_string()),
};
let json = serde_json::to_string_pretty(&class)?;
println!("{}", json);Enable only the API groups you need:
[dependencies]
k8s-api = { version = "0.1", default-features = false, features = ["core", "apps"] }Available features:
core- Core API (Pod, Service, ConfigMap, etc.)apps- Apps API (Deployment, StatefulSet, etc.)batch- Batch API (Job, CronJob)all- Enable all API groups
Use k8s-api-codec for protobuf round-trips and patch content types:
use k8s_api::core::v1::Namespace;
use k8s_api_codec::ExternalVersionCodec;
use k8s_apimachinery::apis::meta::v1::ObjectMeta;
use serde_json::json;
let namespace = Namespace {
metadata: ObjectMeta::named("codec-demo"),
..Default::default()
};
let codec = ExternalVersionCodec::from_api_version("v1", "Namespace")?;
let bytes = codec.encode_protobuf(&namespace)?;
let decoded: Namespace = codec.decode_protobuf(&bytes)?;
let patch = ExternalVersionCodec::patch_strategic(json!({ "metadata": { "labels": { "app": "demo" }}}));
assert_eq!(patch.content_type(), "application/strategic-merge-patch+json");k8s-api-rust/
├── Cargo.toml # Workspace definition
├── crates/
│ ├── k8s-api-core/ # Core types and utilities
│ ├── k8s-apimachinery/ # API machinery types
│ ├── k8s-api/ # API group types
│ │ ├── core/v1/ # Core API v1
│ │ ├── apps/v1/ # Apps API v1
│ │ └── batch/v1/ # Batch API v1
│ ├── k8s-api-validation/ # Validation logic
│ ├── k8s-api-conversion/ # Version conversion
│ └── k8s-api-codec/ # JSON/Protobuf codecs and patch types
└── README.md
Total Tests: 628 (all passing)
- External versions support JSON + Protobuf codecs: Done (
crates/k8s-api-codec/src/lib.rs) - External versions support strategic-merge-patch: Done (
crates/k8s-api-codec/src/lib.rs) - External logic considers JSON/Protobuf/strategic-merge-patch together: Done
- Status:
ExternalVersionCodecprovides a version-scoped entry point for JSON/Protobuf encode/decode and patch types.
- Status:
- Only external versions have defaults: Done
- Status: internal types no longer include
#[serde(default)]attributes.
- Status: internal types no longer include
- Bidirectional conversion between internal and external versions: Done
- Conversion implemented in external version modules and every external version supports internal <-> external: Done
- Only internal versions require validation: Done
- Status:
k8s-api-validationexposes internal wrappers that validate internal types via external validators.
- Status:
- Expand tests to cover external JSON/Protobuf/patch helpers across representative groups. Done
- Decide on defaulting infrastructure and port defaults tests (apps, autoscaling, batch, core, etc.).
- Started with scheduling PriorityClass defaulting (v1/v1alpha1/v1beta1).
- Added discovery EndpointSlice port defaults (v1/v1beta1).
- Added networking NetworkPolicy and Ingress path defaults (v1/v1beta1).
- Added admissionregistration defaults (v1/v1alpha1/v1beta1).
- Added apps defaults (v1/v1beta1/v1beta2).
- Added autoscaling defaults (v1/v2/v2beta1/v2beta2).
- Added storage defaults (v1/v1beta1).
- Added batch defaults (v1/v1beta1).
- Added flowcontrol defaults (v1/v1beta1/v1beta2/v1beta3).
- Added extensions defaults (v1beta1).
- Added resource defaults (v1/v1alpha3/v1beta1/v1beta2).
- Added certificates defaults (v1beta1).
- Extended core/v1 defaults (pod/container/probe/volume/secret/pv/pvc/endpoints/node/service/limitrange/namespace/replicationcontroller basics + pod requests from limits + pod-level resources (cpu/memory/hugepages, init container aggregation + feature gate off) + volume source iscsi/rbd/azure/scaleio + ephemeral claim template + pod log options + image volume pull policy feature gates + lifecycle/GRPC defaults + ephemeral container defaults + pod hostNetwork pod-vs-spec behavior + service session affinity config defaults + node allocatable cases + resource list rounding (decimal + binary + exponent) + service load balancer IP mode).
- Added flowcontrol v1 bootstrap defaulting no-op coverage (mandatory + suggested configs).
- Add remaining core/extensions conversion coverage (core/v1 conversion tests).
- Added extensions Ingress backend conversion coverage (v1beta1).
- Added core Pod/PodSpec/PodStatus/NodeSpec conversion coverage (service account/PodIP/PodCIDR aliasing + init-container annotation pruning + pod terminationGracePeriod clamp + Secret stringData merge).
| Module | Types | Status |
|---|---|---|
| core | 309 | ✅ Complete |
| resource | 186 | ✅ Complete |
| flowcontrol | 120 | ✅ Complete |
| admissionregistration | 118 | ✅ Complete |
| apps | 110 | ✅ Complete |
| autoscaling | 101 | ✅ Complete |
| networking | 65 | ✅ Complete |
| storage | 62 | ✅ Complete |
| extensions | 52 | ✅ Complete |
| rbac | 36 | ✅ Complete |
| batch | 34 | ✅ Complete |
| authorization | 30 | ✅ Complete |
| policy | 28 | ✅ Complete |
| certificates | 26 | ✅ Complete |
| authentication | 21 | ✅ Complete |
| discovery | 19 | ✅ Complete |
| apiextensions | 18 | ✅ Complete |
| admission | 16 | ✅ Complete |
| apidiscovery | 16 | ✅ Complete |
| node | 15 | ✅ Complete |
| coordination | 13 | ✅ Complete |
| events | 9 | ✅ Complete |
| apiserverinternal | 8 | ✅ Complete |
| storagemigration | 7 | ✅ Complete |
| scheduling | 6 | ✅ Complete |
| apiregistration | 5 | ✅ Complete |
| imagepolicy | 4 | ✅ Complete |
| abac | 3 | ✅ Complete |
Total: 1437 API types across 28 modules
| Module | Conversions | Types |
|---|---|---|
| abac | 1 | Policy (v0, v1beta1) |
| admission | 1 | AdmissionReview |
| admissionregistration | 12 | MutatingWebhookConfiguration, MutatingWebhookConfigurationList, ValidatingWebhookConfiguration, ValidatingWebhookConfigurationList, ValidatingAdmissionPolicy (v1alpha1, v1beta1), ValidatingAdmissionPolicyList, ValidatingAdmissionPolicyBinding (v1alpha1, v1beta1), ValidatingAdmissionPolicyBindingList, MutatingAdmissionPolicy (v1alpha1, v1beta1), MutatingAdmissionPolicyList, MutatingAdmissionPolicyBinding (v1alpha1, v1beta1), MutatingAdmissionPolicyBindingList |
| apidiscovery | 2 | APIGroupDiscovery, APIGroupDiscoveryList |
| authentication | 2 | TokenReview, SelfSubjectReview |
| authorization | 4 | SubjectAccessReview, SelfSubjectAccessReview, LocalSubjectAccessReview, SelfSubjectRulesReview |
| storage | 12 | StorageClass, StorageClassList, VolumeAttachment, VolumeAttachmentList, CSIDriver, CSIDriverList, CSINode, CSINodeList, CSIStorageCapacity, CSIStorageCapacityList, VolumeAttributesClass, VolumeAttributesClassList |
| resource | 8 | ResourceClaim, ResourceClaimList, ResourceClaimTemplate, ResourceClaimTemplateList, DeviceClass, DeviceClassList, ResourceSlice, ResourceSliceList (v1beta1, v1beta2) |
| rbac | 8 | Role, RoleList, RoleBinding, RoleBindingList, ClusterRole, ClusterRoleList, ClusterRoleBinding, ClusterRoleBindingList (v1alpha1, v1beta1) |
| apps | 11 | Deployment, DeploymentList, StatefulSet, StatefulSetList, DaemonSet, DaemonSetList, ReplicaSet, ReplicaSetList, ControllerRevision, ControllerRevisionList, Scale (v1beta1, v1beta2) |
| batch | 4 | Job, JobList, CronJob, CronJobList |
| networking | 8 | Ingress, IngressList, IngressClass, IngressClassList, IPAddress, IPAddressList, ServiceCIDR, ServiceCIDRList |
| policy | 3 | PodDisruptionBudget, PodDisruptionBudgetList, Eviction |
| autoscaling | 2 | HorizontalPodAutoscaler, HorizontalPodAutoscalerList (v1, v2beta1, v2beta2) |
| discovery | 2 | EndpointSlice, EndpointSliceList |
| events | 2 | Event, EventList |
| certificates | 4 | CertificateSigningRequest, CertificateSigningRequestList, ClusterTrustBundle, ClusterTrustBundleList (v1alpha1, v1beta1) |
| coordination | 4 | Lease, LeaseList, LeaseCandidate, LeaseCandidateList |
| flowcontrol | 4 | FlowSchema, FlowSchemaList, PriorityLevelConfiguration, PriorityLevelConfigurationList |
| node | 2 | RuntimeClass, RuntimeClassList (v1alpha1, v1beta1) |
| scheduling | 2 | PriorityClass, PriorityClassList (v1alpha1, v1beta1) |
Total: 98 version conversions implemented
| Module | Validators | Coverage |
|---|---|---|
| common | 19 | DNS names, labels, selectors, quantities, resources |
| admissionregistration | 8 | Webhook configurations, policies |
| authentication | 5 | TokenReview, TokenRequest, SelfSubjectReview |
| authorization | 8 | SAR/SSAR/LSAR, SelfSubjectRulesReview |
| certificates | 11 | CertificateSigningRequest |
| storage | 9 | StorageClass, VolumeAttachment, CSI types |
| coordination | 10 | Lease |
| node | 12 | RuntimeClass, Toleration |
| apps | 8 | Deployment, StatefulSet, DaemonSet, ReplicaSet |
| core | 8 | Pod, Service, ConfigMap, Namespace |
| networking | 8 | NetworkPolicy, Ingress, IngressClass |
| rbac | 7 | Role, ClusterRole, RoleBinding, Subject |
| batch | 4 | Job, CronJob |
| autoscaling | 3 | HPA metrics, behaviors |
| policy | 3 | PodDisruptionBudget |
| discovery | 1 | EndpointSlice |
| flowcontrol | 4 | FlowSchema, PriorityLevelConfiguration |
| resource | 12 | ResourceClaim, ResourceClass, ResourceSlice |
| abac | 2 | Policy |
| admission | 2 | AdmissionReview |
| apidiscovery | 4 | APIGroupDiscovery, APIGroupDiscoveryList |
| apiextensions | 1 | CustomResourceDefinition |
| apiregistration | 1 | APIService |
| apiserverinternal | 1 | StorageVersion |
| events | 2 | Event |
| extensions | 1 | Ingress |
| imagepolicy | 1 | ImageReview |
| storagemigration | 1 | StorageVersionMigration |
Total: 156 validation functions across 28 modules
- ✅ core/v1: Pod, Service, ConfigMap
- ✅ apps/v1: Deployment, StatefulSet, DaemonSet, ReplicaSet
- ✅ batch/v1: Job, CronJob
- ✅ rbac/v1: Role, ClusterRole, RoleBinding, ClusterRoleBinding
- ✅ scheduling/v1: PriorityClass
- ✅ coordination/v1: Lease
- ✅ admission/v1: AdmissionReview
- ✅ events/v1: Event
- ✅ apiregistration/v1: APIService
- ✅ apiextensions/v1: CustomResourceDefinition
- ✅ apidiscovery/v2: APIGroupDiscovery
- ✅ apiserverinternal/v1alpha1: StorageVersion
- ✅ imagepolicy/v1alpha1: ImageReview
- ✅ storagemigration/v1alpha1: StorageVersionMigration
- ✅ extensions/v1beta1: Ingress
High Priority:
-
resourcemodule validation (102 types) -
admissionregistrationmodule validation (53 types) -
discoveryversion conversion ✅ -
eventsversion conversion ✅
Medium Priority:
-
flowcontrolmodule validation (44 types) -
certificatesmodule validation ✅ -
authenticationmodule validation -
authorizationmodule validation
Low Priority:
-
coordinationmodule validation ✅ -
nodemodule validation ✅ -
schedulingmodule validation ✅ - Additional serialization tests ✅
- Documentation examples ✅
- Expand version conversion coverage for remaining multi-version API groups/types
- Added list conversions and remaining multi-version resources (apps lists/Scale, networking IPAddress/ServiceCIDR, storage lists, etc.)
- Add validation coverage for remaining API groups
- Added
admission,events,extensions,imagepolicy,apiserverinternal,apidiscovery,abac,apiregistration,apiextensions,storagemigration
- Added
- Add serialization round-trip tests for untested modules
- Added tests for admission, events, apiregistration, apiextensions, apidiscovery, imagepolicy, apiserverinternal, storagemigration, and extensions
- Add missing
apiextensions/v1types (ConversionReview/Request/Response, ConditionStatus, JSONSchema* aliases, ResourceScope, ValidationRules) - Add
apiregistration/v1ConditionStatus and APIServiceConditionType enums - Implement
apiextensions/v1beta1module to match Kubernetes v1.34.1 - Implement
apiregistration/v1beta1module to match Kubernetes v1.34.1 - Reconcile Rust-only types vs Go (policy/v1beta1 PodSecurityPolicy*, batch/v1beta1 Job*, resource/v1alpha3 claim types) and decide keep/remove
- Audit duplicated meta types (GroupVersionKind, GroupVersionResource, ObjectReference, UserInfo, EventSource, TypedLocalObjectReference, Toleration) vs apimachinery/core sources
This project refactors types from the official Kubernetes codebase:
- Source:
kubernetes/staging/src/k8s.io/api/ - Version: Kubernetes v1.34.1 only (no other versions targeted)
- Total API groups: 28
- Total code volume: ~18,000+ lines of Go code
cargo buildcargo testcargo build --no-default-features --features "core,apps"Contributions are welcome! Areas where help is needed:
- Type implementations: Help complete remaining API types
- Validation logic: Implement validation rules for API types
- Tests: Add unit tests and integration tests
- Documentation: Improve code documentation and examples
- Conversion logic: Implement version conversion between API versions
Please see the Roadmap section for specific tasks.
Apache-2.0
This project follows the same license as Kubernetes.
This project is based on the official Kubernetes API types:
Special thanks to the Kubernetes community for their excellent work on the API design.