Kubernetes CRI v1

The CRI plugin is Stackie’s separately buildable Kubernetes runtime integration. It serves the official CRI v1 RuntimeService and ImageService used by upstream kubelet, while the Kubernetes plugin separately provisions and operates K3s.

Request path and ownership

stackiedMocker compatibilityStackie CRI pluginUpstream kubeletCRI v1 sandbox, image, and container RPCClassify the requested imageCatalog block or verified OCI identityTransport-neutral workload admissionDurable workload resultCRI v1 response, logs, stats, or event
Stackie documentation diagram: stackied, Mocker compatibility, Stackie CRI plugin, Upstream kubelet, #stackie-mermaid-0{font-family:Inter Variable,Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;font-size:16px;fill:#f8fafc;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#stackie-mermaid-0 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#stackie-mermaid-0 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#stackie-mermaid-0 .error-icon{fill:#111827;}#stackie-mermaid-0 .error-text{fill:#f8fafc;stroke:#f8fafc;}#stackie-mermaid-0 .edge-thickness-normal{stroke-width:1px;}#stackie-mermaid-0 .edge-thickness-thick{stroke-width:3.5px;}#stackie-mermaid-0 .edge-pattern-solid{stroke-dasharray:0;}#stackie-mermaid-0 .edge-thickness-invisible{stroke-width:0;fill:none;}#stackie-mermaid-0 .edge-pattern-dashed{stroke-dasharray:3;}#stackie-mermaid-0 .edge-pattern-dotted{stroke-dasharray:2;}#stackie-mermaid-0 .marker{fill:#facc15;stroke:#facc15;}#stackie-mermaid-0 .marker.cross{stroke:#facc15;}#stackie-mermaid-0 svg{font-family:Inter Variable,Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;font-size:16px;}#stackie-mermaid-0 p{margin:0;}#stackie-mermaid-0 .actor{stroke:#facc15;fill:#1f2937;stroke-width:1;}#stackie-mermaid-0 rect.actor.outer-path[data-look="neo"]{filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#stackie-mermaid-0 rect.note[data-look="neo"]{stroke:hsl(52.6829268293, 60%, 73.9215686275%);fill:#fff5ad;filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#stackie-mermaid-0 text.actor>tspan{fill:#f8fafc;stroke:none;}#stackie-mermaid-0 .actor-line{stroke:#facc15;}#stackie-mermaid-0 .innerArc{stroke-width:1.5;stroke-dasharray:none;}#stackie-mermaid-0 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#facc15;}#stackie-mermaid-0 .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#facc15;}#stackie-mermaid-0 [id$="-arrowhead"] path{fill:#facc15;stroke:#facc15;}#stackie-mermaid-0 .sequenceNumber{fill:#cbd5e1;}#stackie-mermaid-0 [id$="-sequencenumber"]{fill:#facc15;}#stackie-mermaid-0 [id$="-crosshead"] path{fill:#facc15;stroke:#facc15;}#stackie-mermaid-0 .messageText{fill:#f8fafc;stroke:none;}#stackie-mermaid-0 .labelBox{stroke:#facc15;fill:#1f2937;filter:none;}#stackie-mermaid-0 .labelText,#stackie-mermaid-0 .labelText>tspan{fill:#f8fafc;stroke:none;}#stackie-mermaid-0 .loopText,#stackie-mermaid-0 .loopText>tspan{fill:#f8fafc;stroke:none;}#stackie-mermaid-0 .sectionTitle,#stackie-mermaid-0 .sectionTitle>tspan{fill:#f8fafc;stroke:none;}#stackie-mermaid-0 .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:#facc15;fill:#facc15;}#stackie-mermaid-0 .note{stroke:hsl(52.6829268293, 60%, 73.9215686275%);fill:#fff5ad;}#stackie-mermaid-0 .noteText,#stackie-mermaid-0 .noteText>tspan{fill:#333;stroke:none;font-weight:normal;}#stackie-mermaid-0 .activation0{fill:#134e4a;stroke:#2dd4bf;}#stackie-mermaid-0 .activation1{fill:#134e4a;stroke:#2dd4bf;}#stackie-mermaid-0 .activation2{fill:#134e4a;stroke:#2dd4bf;}#stackie-mermaid-0 .actorPopupMenu{position:absolute;}#stackie-mermaid-0 .actorPopupMenuPanel{position:absolute;fill:#1f2937;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#stackie-mermaid-0 .actor-man circle,#stackie-mermaid-0 line{fill:#1f2937;stroke-width:2px;}#stackie-mermaid-0 g rect.rect{filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));stroke:#facc15;}#stackie-mermaid-0 .node .neo-node{stroke:#facc15;}#stackie-mermaid-0 [data-look="neo"].node rect,#stackie-mermaid-0 [data-look="neo"].cluster rect,#stackie-mermaid-0 [data-look="neo"].node polygon{stroke:url(#stackie-mermaid-0-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#stackie-mermaid-0 [data-look="neo"].swimlane.cluster rect{filter:none;}#stackie-mermaid-0 [data-look="neo"].node path{stroke:url(#stackie-mermaid-0-gradient);stroke-width:1px;}#stackie-mermaid-0 [data-look="neo"].node .outer-path{filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#stackie-mermaid-0 [data-look="neo"].node .neo-line path{stroke:#facc15;filter:none;}#stackie-mermaid-0 [data-look="neo"].node circle{stroke:url(#stackie-mermaid-0-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#stackie-mermaid-0 [data-look="neo"].node circle .state-start{fill:#000000;}#stackie-mermaid-0 [data-look="neo"].icon-shape .icon{fill:url(#stackie-mermaid-0-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#stackie-mermaid-0 [data-look="neo"].icon-shape .icon-neo path{stroke:url(#stackie-mermaid-0-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#stackie-mermaid-0 :root{--mermaid-font-family:Inter Variable,Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;}. Use horizontal scrolling when the full diagram is wider than the visible frame. Generated from Stackie public documentation source.

In text: kubelet calls the CRI plugin. The plugin delegates image classification to Mocker compatibility, sends only transport-neutral evidence to Stackied, and returns the protocol-defined CRI result. It does not translate Docker or Compose fields and never provides an alternate CRI fallback.

Mocker’s mocker.images metadata remains the sole image-to-block authority. Catalog-mapped images keep their Stackie block identity; images required by K3s system pods and other unmatched workloads remain verified OCI images. A future Mocker plugin will provide the same narrow compatibility capability to this plugin without moving Docker semantics into CRI or Bridge.

Supported contract

SurfaceSupport
ProtocolOfficial CRI v1 from k8s.io/cri-api v0.36.2
TransportHost-leased Unix-domain listener
PlatformsLinux amd64 and Linux arm64
Runtime/Image RPCsEvery applicable v1 RPC has a maintained implementation and traceability row
CheckpointingReturns the protocol-defined unsupported result only when the selected runtime lacks checkpoint support
Validation100% applicable CRI v1 traceability and 100% passage of unmodified upstream critest v1.36.0 are release requirements

The vendored upstream protocol is digest-verified before Tonic generates the Rust service surface. There is no handwritten partial protocol, hidden legacy fallback, skipped applicable RPC, or patched conformance suite.

Runtime behavior

  • Pod sandboxes, containers, images, filesystems, resources, status, stats, metrics, runtime configuration, and container events use CRI-native request and response semantics.
  • Image pulls verify registry descriptors, manifests, configuration, layer digests, safe archive paths, and final immutable content identity.
  • ExecSync is bounded and returns captured output and exit status. Interactive exec, attach, and port-forward sessions use short-lived, single-use tokens rather than embedding local authority in URLs.
  • CRI log files preserve stdout/stderr stream identity, timestamps, partial records, rotation, and reopen behavior expected by kubelet.
  • Container events are durably ordered and replayable. Restart does not silently discard known sandboxes, containers, images, or pending events.
  • Garbage collection is bounded and respects active references, leases, snapshots, mounted filesystems, and persistent-volume ownership.

Availability states

CRI uses the same generic package and subscription mechanisms as the Kubernetes plugin. Build inclusion, administrator enablement, subscription entitlement, platform support, dependency health, listener acquisition, and runtime health are reported independently. Both packages currently share the canonical kubernetes_development product module and are therefore commercially gated together. A future catalog may give CRI its own module or tier through descriptor data alone; the host and capability architecture require no CRI-specific billing path.

StateUser-visible result
Package absentCRI is not available and no listener exists
Present but administrator-disabledInstalled, inactive, and data-preserving
Enabled without Kubernetes Development entitlementSubscription required; runtime remains stopped
Entitled on an unsupported hostExplicit Linux amd64/arm64 requirement; no fallback
Dependency, artifact, or listener failureFailed with a redaction-safe reason; never reported as healthy
Enabled, entitled, supported, and healthyHost leases the listener and kubelet can use CRI v1

Listener paths and data namespaces come from host capabilities; the plugin cannot self-grant them. Subscription loss or Kubernetes shutdown stops new runtime work without turning reset or uninstall into persistent-data deletion. The Kubernetes plugin’s separately confirmed purge is the only operation that permanently removes registered cluster volumes.

Conformance promise

Stackie releases this support only when the CRI traceability inventory maps every applicable upstream v1 service and method to implementation, tests, and conformance evidence, and the version-matched upstream critest suite passes unmodified in the real K3s topology. Unit tests, mocks, or a custom smoke suite cannot substitute for either gate.

The checked-in cri-traceability.yaml is the canonical API index. Its source-derived denominator includes all 41 pinned RPCs and all 99 normative proto comment blocks. Each applicable row links its Tonic method, behavior owner, Rustdoc, focused evidence, and unmodified critest selector. Windows-only field rows remain visible with a sourced Linux-profile exclusion. The closed applicability schema cannot configure local focus, skip, retry, patches, alternate tests, or assertion changes.