Supervisor Services are powered by the Carvel packaging standard. To support automated reconciliation, Supervisor Services must be packaged using the Carvel toolset. This guide defines the technical “contract” your service must meet to be compatible with the Supervisor platform.
To submit a service, you must provide a single YAML document and a pushed OCI bundle.
An imgpkg bundle is an OCI image that holds your configuration files. The Supervisor uses this to ensure “What You Push is What You Deploy.”
While you can customize your internal directory names, the following is the standard convention:
.
├── .imgpkg/
│ └── images.yml # REQUIRED: Generated by kbld
└── config/ # Your Kubernetes manifests & ytt templates
The Supervisor requires an immutable deployment. You must include a .imgpkg/images.yml file. This ensures that even if a mutable tag (like :latest) is updated in the registry, your service remains pinned to the specific digest you tested.
Tooling tip: Use kbld to generate this automatically. Refer to the imgpkg Basic Workflow for command-line examples.
The PackageMetadata resource defines how your service appears in the Supervisor Service catalog.
metadata.name – The main service identifier: a stable, unique, fully qualified name for the service (e.g. my-service.example.com). It must match the spec.refName of every Package that ships a version of this service, and it is what admins see referenced in the Service Catalog and APIs.spec.displayName – The human-readable name shown in the Service Catalog (e.g. "My Service").spec.shortDescription – A one-line summary used in catalog listings.spec.longDescription – A longer description shown on the service detail page.spec.providerName – The organization that publishes the service (e.g. "Example Inc.").spec.categories – Optional list of category tags used for filtering in the catalog.For the full PackageMetadata CR specification, see the Carvel packaging docs.
The Package resource tells the Supervisor how to actually deploy your code.
Your Package must define a template section that follows this flow:
Simplified snippet of the contract:
template:
spec:
fetch:
- imgpkgBundle:
image: <your-registry-url>/bundle@sha256:...
template:
- ytt:
paths: ["config/"]
- kbld:
paths: ["-", ".imgpkg/images.yml"]
deploy:
- kapp: {}
For the full Package CR specification, see the Carvel packaging docs.