Declare the outcome
The Image is the durable resource. Build attempts are execution details managed by the controller, with retries and recovery.
Define the image you need. kimage builds it, verifies it, and retains it in a managed local registry, ready for your workloads to run.
apiVersion: kimage.dev/v1alpha1
kind: Image
metadata:
name: service
namespace: apps
spec:
version: "1.2.0"
source:
build:
format: Containerfile
definition:
inline: |
FROM scratch
COPY service /service
ENTRYPOINT ["/service"]
apiVersion: apps/v1
kind: Deployment
metadata:
name: service
namespace: apps
spec:
template:
spec:
containers:
- name: service
image:
"platform://apps/service:^1.2.0"
# Admission selects a published release
# and pins the new Pod to its digest.
Illustrative excerpts. The complete hello example includes input and execution settings.
Apply an Image with a version and production recipe.
The controller manages the attempts, verification, and publication
needed to make it available.
The Image is the durable resource. Build attempts are execution details managed by the controller, with retries and recovery.
A PVC-backed OCI registry is part of the installation. Application images need no separate output registry URL or push credentials. External export is optional.
Verified releases remain available after input objects are removed or builder caches are cleared. A published version cannot be replaced with different content.
Production, retention, and consumption share a Kubernetes API. Each component has a distinct job.
Choose a version, local inputs, a Containerfile, and the default builder.
Image
Pinned BuildKit produces OCI content. Verification checks its graph and bytes.
BuildKit → OCI
Retain the content in cluster-local storage and record the immutable result.
ImageRelease
Admission pins the selected release. Kubelet pulls through a node-local read proxy.
Pod → digest
Use exact versions for uniform rollouts, ranges for compatible releases, or a channel you explicitly map. Each new Pod gets a concrete digest.
Selectors resolve at Pod creation. Publishing a release does not restart existing workloads. Consumption is currently restricted to the same namespace.
platform://apps/service:1.2.4
platform://apps/service:^1.2.0Readable query ranges work too.
platform://apps/service:stable
Install the native CLI with Cargo or choose Helm. Kubernetes pulls component images from GHCR, without a source checkout or packaging script. The hello tutorial takes a static executable through a scratch build, a retained release, and a running Deployment.
Pull pinned native release images, then install the control plane and default builder using the handbook.
Provide the small executable in a ConfigMap. The controller builds and publishes version 1.0.0.
Apply the Deployment and inspect the resulting digest-pinned Pod image.
# Rust 1.99.0
$ cargo install kimage-control \
--version 0.4.0 --locked --bin kimage --bin kimage-install
$ kimage install --application-namespace apps
# After preparing the tutorial inputs
$ kubectl apply -f examples/hello/image.yaml
$ kubectl apply -f examples/hello/deployment.yaml
$ kubectl -n apps wait \
--for=condition=Ready image/hello
Native amd64 and arm64 builds, on-demand or eager, with namespace or cluster scope. Current builds use scratch images and provisioned local inputs. Runtime versions are checked at installation.
Read compatibility and limitsExplore the code, try the tutorial, or help shape what comes next.