PVCs and CloudNativePG Clusters need S3 buckets and backup schedules
provisioned consistently. This operator watches the
backups.unkin.net/{schedule,destination} annotations on those objects and
provisions everything needed to back them up, with no new CRDs.
- Add a PVC controller that provisions cephrgw ObjectStoreUser/Bucket/BucketAccess,
auto-generates a restic repo-password Secret and creates a k8up Schedule scoped
to the PVC via spec.backup.volumes[].persistentVolumeClaim.claimName.
- Add a CNPG Cluster controller that provisions the same bucket stack, idempotently
patches spec.backup.barmanObjectStore (leaving a user-set destinationPath alone
with a Warning event) and creates a ScheduledBackup.
- Resolve destinations through a ConfigMap lookup table; requeue until the
BucketAccess is Ready before creating schedule resources; own-reference created
resources and retain bucket data by default.
- Add schedule-mapping helpers (k8up 5-field/shortcut pass-through, CNPG 6-field
seconds-first) and deterministic, length-bounded name derivation.
- Add unit tests (schedule mapping, name derivation, destination resolution) and
envtest controller tests for both paths, wiring the external CRDs into envtest.
- Add kubebuilder-generated RBAC, a Dockerfile (distroless/nonroot), Woodpecker
lint/test/build pipelines and a tag-triggered image push to the artifactapi
docker-internal registry, plus a version-bump Makefile and deploy manifests.
Kubernetes controller-runtime Project
The Kubernetes controller-runtime Project is a set of go libraries for building Controllers. It is leveraged by Kubebuilder and Operator SDK. Both are a great place to start for new projects. See Kubebuilder's Quick Start to see how it can be used.
Documentation:
- Package overview
- Basic controller using builder
- Creating a manager
- Creating a controller
- Examples
- Designs
Versioning, Maintenance, and Compatibility
The full documentation can be found at VERSIONING.md, but TL;DR:
Users:
- We stick to a zero major version
- We publish a minor version for each Kubernetes minor release and allow breaking changes between minor versions
- We publish patch versions as needed and we don't allow breaking changes in them
Contributors:
- All code PR must be labeled with 🐛 (patch fixes), ✨ (backwards-compatible features), or ⚠️ (breaking changes)
- Breaking changes will find their way into the next major release, other changes will go into an semi-immediate patch or minor release
- For a quick PR template suggesting the right information, use one of these PR templates:
Compatibility
Every minor version of controller-runtime has been tested with a specific minor version of client-go. A controller-runtime minor version may be compatible with other client-go minor versions, but this is by chance and neither supported nor tested. In general, we create one minor version of controller-runtime for each minor version of client-go and other k8s.io/* dependencies.
The minimum Go version of controller-runtime is the highest minimum Go version of our Go dependencies. Usually, this will be identical to the minimum Go version of the corresponding k8s.io/* dependencies.
Compatible k8s.io/*, client-go and minimum Go versions can be looked up in our go.mod file.
| k8s.io/*, client-go | minimum Go version | |
|---|---|---|
| CR v0.22 | v0.34 | 1.24 |
| CR v0.21 | v0.33 | 1.24 |
| CR v0.20 | v0.32 | 1.23 |
| CR v0.19 | v0.31 | 1.22 |
| CR v0.18 | v0.30 | 1.22 |
| CR v0.17 | v0.29 | 1.21 |
| CR v0.16 | v0.28 | 1.20 |
| CR v0.15 | v0.27 | 1.20 |
FAQ
See FAQ.md
Community, discussion, contribution, and support
Learn how to engage with the Kubernetes community on the community page.
You can reach the maintainers of this project at:
- Slack channel: #controller-runtime
- Google Group: kubebuilder@googlegroups.com
Contributing
Contributions are greatly appreciated. The maintainers actively manage the issues list, and try to highlight issues suitable for newcomers. The project follows the typical GitHub pull request model. See CONTRIBUTING.md for more details. Before starting any work, please either comment on an existing issue, or file a new one.
Code of conduct
Participation in the Kubernetes community is governed by the Kubernetes Code of Conduct.