Revision history for Kubernetes-Comb 0.001 2026-10-01 03:50:33Z - First release. A Comb is a self-contained "micro collection of Kubernetes parts" that deploys itself, reports its status and publishes its endpoints as a live Perl instance. - Comb custom resource: Kubernetes::Comb::CRD::* classes for the CR, its spec and status conditions; Kubernetes::Comb::CRD generates the IO::K8s resource map for it; Kubernetes::Comb::Endpoint is the resolved-endpoint value object. - spec.config and spec.upstream are free-form: declared as IO::K8s Opaque, so nested values round-trip through the CR untouched (needs IO::K8s 1.109). - Client seam: Kubernetes::Comb::Role::Client defines the request surface every Comb goes through; Kubernetes::Comb::Client::Sync (on Kubernetes::REST) and Kubernetes::Comb::Client::Async (on Net::Async::Kubernetes, an optional dependency) implement it, both returning Futures. Client::Async refuses a Net::Async::Kubernetes older than 0.009 when it is loaded, naming the version needed and the one found. Requires IO::K8s 1.109 and Kubernetes::REST 1.109. - Comb lifecycle: from_crd builds an instance from a CR; deploy, status, healthy, logs, restart, stop, describe and endpoint each return a Future and never throw. restart and stop delete a Job with propagationPolicy Background, so its Pods go with it. - reconcile resolves upstreams, checks dependencies and the contract check, deploys and prunes only what the Comb owns, and writes status -- it never fails itself, turning any error into phase Error instead; a status message never carries Perl's own " at FILE line N.". deploy stamps every resource with a applied-digest annotation, and reconcile deploys a healthy Comb again (phase Pending, then Running) when what it renders no longer matches the live digests. Pruning deletes with propagationPolicy Background too, so a Job's Pods and a Deployment's ReplicaSets go with the resource. - Upstreams and the bridge: Kubernetes::Comb::Role::Upstream, Upstream::Static (fixed endpoints) and Upstream::K8s (a peer Comb in another kube context) let a Comb borrow its service instead of running it; a bridge stays on record until replaced, and a stopped Comb is scaled back while its upstream is healthy. - Kubernetes::Comb::Static and Role::Static load manifests from .pk8s and YAML files, for a Comb with no code of its own. - examples/sync.pl and examples/async.pl show what a manager driving several Combs looks like, synchronously and on IO::Async. - Unit tests (prove -lr t/) need no cluster; the integration suite only runs with TEST_KUBERNETES_COMB_KUBECONFIG set.