convoy
A Kubernetes-native continuous delivery system.
convoy deploys applications to Kubernetes clusters. You describe what to deploy, from where, and to which cluster as Kubernetes objects. convoy fetches the source, renders it and applies the result with Server-Side Apply. Then it reports two things on the status. Does the live state match the render (drift)? Are the workloads healthy?
convoy is an aggregated API server plus controllers. Its resources are real Kubernetes API
objects. You manage them with kubectl, RBAC and admission. They are not CRDs.
Components#
convoy has three server components and a kubectl plugin.
| Component | What it does |
|---|---|
convoy-apiserver | Serves the convoy API groups as an aggregated API server. Stores objects in etcd. Handles the /pin, /sync, /mutations and /lifecycle subresources. Sends /preview, /diff, /health and /history requests to the observer. |
convoy-controller-manager | Reconciles Cluster, GitRepository, HelmRegistry, OCIRegistry and Release objects. For a Release, it fetches, renders, mutates, dry-runs, stores and applies. |
convoy-observer | Compares the live state with the render and writes InSync. Assesses health with CEL rules and writes Healthy. Serves the on-demand subresources. |
kubectl convoy | CLI plugin for the Release subresources: sync, pin, unpin, preview, diff, history, health, mutations, lifecycle. |
Delivery steps#
A Release is one application, rendered from one source, applied to one cluster. For each
Release, the controller-manager does these steps:
- Fetch the content from a
GitRepository,HelmRegistryorOCIRegistry. - Render the content: raw manifests, a Helm chart (rendered in-process), or a kustomization.
- Mutate the rendered objects with the
spec.mutationspipeline. - Dry-run the render with Server-Side Apply. A render that the cluster rejects stops here.
- Store the render in the render store, if one is configured.
- Apply the render with Server-Side Apply, in sync-wave order. Then prune the objects that the render no longer contains.
Then the observer reads the cluster:
- The drift loop compares live objects with the render and writes the
InSynccondition. In automatic mode, drift starts a new sync. - The health loop evaluates the selected health rules and writes the
Healthycondition.
Where to go next#
- Concepts: how each part of convoy works. Start with Sources and Rendering.
- Guides: step-by-step tasks, for example Deploy a Helm chart.
- Reference: the API groups, the fields, conditions and subresources of each kind, and the
kubectl convoyplugin. - Architecture and Operations: how convoy is built and how to run it.
- Roadmap: what is built and what is planned.
- Known Bugs: bugs that we know about, with workarounds.
In the code
convoy v0.9.0
internal/controller/release.(*Controller).reconcileinternal/controller/release/controller.go:824internal/observer.(*Controller).syncHandlerinternal/observer/observer.go:121internal/observer.(*HealthController).syncHandlerinternal/observer/health.go:115