Skip to main content

Container registry

A private OCI registry for your project's images. Kube-DC offers it as the class registry (zot). It stores no password: CI and people sign in with your organization's short-lived tokens, and Kube-DC keeps the pull Secret of each listed project fresh. Use it with Deploy from GitHub or any CI that can sign in to Kube-DC.

PlanShapeStorageOperations
registry-developmentOne replica, no failoverA volume (10Gi default, up to the plan maximum)Resize, Expand storage
registry-productionTwo members on different nodesA bucket in your project's object storageResize, Expand storage (a bucket the registry created)

There are no backups: images are build artifacts, so rebuild them from source. There is no management fee: you pay for what the registry uses (see Pricing). In Production each repository is served by one member. While that member restarts (about 20 seconds) its repositories are briefly unavailable; the data stays in the bucket.

Create a registry​

In the console: Managed services → Create → Container registry, or with an AI app: "Create a development container registry named images". YAML:

apiVersion: services.kube-dc.com/v1alpha1
kind: ManagedService
metadata:
name: images
namespace: my-project
spec:
classRef: {name: registry}
planRef: {name: registry-development} # or registry-production
placement: {mode: ProviderShared}
connectivity: {classRef: {name: tenant-native}}
engineVersion: "2.1.22"
topology: {instances: 1} # 2 for registry-production
deletionPolicy: Delete
parameters:
projects: [my-previews] # optional, see below

When it is Ready, its address is https://<name>-<project namespace>.<domain>, for example images-shalb-dev.stage.kube-dc.com. The console shows it as the service's https endpoint.

Projects and rights​

Each project gets the path <project>/ in the registry. The registry's own project is always included; list more projects of the same organization in parameters.projects (for example the project that runs pull request previews).

WhoCan
Admins and developers of a listed projectPush and pull <project>/…
Every other member of a listed projectPull <project>/…
Organization adminsPush and pull every project's path
Anyone else, and every path outside <project>/Nothing

Listing a project grants nothing by itself: only a token that already carries that project's right gets in.

A bucket for Production​

registry-production creates its own bucket <name>-images in your project (billed like any bucket, capped at the registry's storage size). To use a bucket you already have, name its claim:

parameters:
bucket: {claimName: my-bucket} # an ObjectBucketClaim on ceph-bucket

The registry marks the bucket with the annotation services.kube-dc.com/registry-bucket-owner. It never deletes a bucket it did not create; deleting the registry with Delete releases it. Only one registry can use a bucket. Production is offered only where the object store is available.

Push​

From GitHub Actions (no stored token). The machine identity's token is exchanged for a registry token, then docker login uses it. The Deploy from GitHub page and connect_repository generate this for you (deploy/registry-login.sh):

deploy/registry-login.sh # needs KUBE_DC_REGISTRY, KUBE_DC_TOKEN_URL,
# KUBE_DC_CLIENT_ID, KUBE_DC_AUDIENCE
docker push images-my-project.<domain>/my-project/app:$GITHUB_SHA

Registry tokens live 15 minutes: sign in right before pushing. A token for the Kubernetes API is refused by the registry, and a registry token is refused by Kubernetes.

From your machine. Open the registry in the console and use docker login in its Push and pull card (or the AI tool registry_login). It shows a command valid for 15 minutes:

echo '<token>' | docker login images-my-project.<domain> --username kube-dc --password-stdin

Builds on push. Set build.kube-dc.com/image to <registry host>/<project>/<app> and no push Secret is needed; see Deploy from GitHub.

Pull​

Kube-DC writes the Secret kdc-registry-<name> in every listed project, refreshes it every 5 minutes and adds it to the project's default ServiceAccount. Pods that use the default ServiceAccount and set no imagePullSecrets of their own pull without any change. A pod that sets its own imagePullSecrets replaces the ServiceAccount's, so add kdc-registry-<name> to that list.

Operations​

OperationDevelopmentProduction
Resize (CPU and memory within the plan bounds, 100m–2 CPU and 256Mi–4Gi)The single replica restarts: a short outagePer member. The members restart one at a time; while a member restarts (about 20 seconds) the repositories it serves are unavailable, the other member keeps serving its own
Expand storage (never shrinks)Grows the volume online, up to 50GiRaises the maximum size of the bucket the registry created, up to 500Gi; nothing restarts. A bucket you named keeps the size you give it: change spec.additionalConfig.maxSize on your own claim

Both are in the console (the service's operations) and as ManagedServiceOperation objects. A registry created before these operations existed gets them once the platform operator adopts the current catalog for it.

Metrics​

The console's health tiles show CPU, memory, the volume (Development), and from the registry itself: requests per second, server errors (5xx), image pushes and pulls per second, repositories and image storage. Production stores images in a bucket, which zot does not measure: its Repositories and Image storage tiles show no data; the bucket's size is in your object storage usage. A registry created before metrics existed shows only CPU, memory and volume until the platform operator adopts the current catalog for it (the members restart once).

The metrics stay inside the platform: the registry's public address answers /metrics with 404.

Pricing​

No management fee. You pay for the resources the registry uses, at your project's rates:

PlanCharged as
DevelopmentCPU and memory of the replica, plus its volume (block storage, by provisioned size)
ProductionCPU and memory of both members, plus the bucket as object storage, by the bytes it holds (not by its maximum size)

Each member also runs a small proxy (50m CPU, 64Mi memory) that serves the public address; it is charged as project CPU and memory. The price preview when you create a registry shows CPU, memory and (Development) the volume; it lists the bucket's object storage and the proxy as costs it does not include.

Delete​

Delete removes the registry, its volume or the bucket it created, and the pull Secrets (and their entries on the default ServiceAccounts). Retain keeps the volume or bucket. Confirm a Delete with the annotation services.kube-dc.com/confirm-delete=<name>, or in the console.