All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Go toolchain bumped to 1.26.7 (from 1.26.5), clearing five stdlib vulnerabilities flagged by govulncheck (GO-2026-6218, GO-2026-6090, GO-2026-6089, GO-2026-5972, GO-2026-5026; all fixed by 1.26.6). The release image builder is pinned to
golang:1.26.7-alpineso the shipped binary is built with the same toolchain CI tests with. Local builds now require Go >= 1.26.7. make vendor-core-crdsdownloads thesigs.k8s.io/karpentermodule before resolving its directory, fixinggenerateCI failures on any PR that changesgo.mod/go.sum(cold module cache madego list -mreturn an empty dir).
2.1.0 - 2026-08-01
- Pods bound to an hcloud CSI volume can now trigger provisioning. The hcloud CSI driver pins
PersistentVolumenodeAffinityoncsi.hetzner.cloud/location, which Karpenter did not recognize, so volume-topology scheduling rejected every PVC-backed pod withlabel "csi.hetzner.cloud/location" does not have known values. That domain is now aliased to the standardtopology.kubernetes.io/zoneviaNormalizedLabels, mirroring howkarpenter-provider-awsaliasestopology.ebs.csi.aws.com/zone. No NodePool or StorageClass changes are needed (#46).
- Chart:
nodeSelector,affinity,tolerations,topologySpreadConstraints,imagePullSecrets,priorityClassName,commandandargson the controller Deployment. All empty by default, so existing releases render unchanged (#47). - Chart: optional
podDisruptionBudget(off by default;maxUnavailable: 1when enabled).minAvailableandmaxUnavailableare mutually exclusive positive integers, and configurations that would block all voluntary drains (minAvailable >= replicas,maxUnavailable: 0) are rejected at render time.replicasis likewise validated as a non-negative integer (#47).
2.0.0 - 2026-07-28
- BREAKING:
HCloudNodeClassgraduated fromkarpenter.hetzner.cloud/v1alpha1tokarpenter.hetzner.cloud/v1. There is no conversion webhook — updateapiVersionin your manifests and re-apply your node classes (#37).
- k3s agent bootstrap support:
examples/k3s-nodeclass.yamlanddocs/k3s-bootstrap.md. - Artifact Hub repository ID and badge (#32).
- The chart ships the Karpenter core CRDs (
NodePool,NodeClaim), so a clean install no longer leaves the controller crash-looping on its own watches. Both are vendored from the pinnedsigs.k8s.io/karpenterduringmake generate, so a dependency bump that changes either schema fails thegenerate-verifyCI gate instead of shipping a stale CRD (#44). - The operator image is pinned to the chart's
appVersioninstead of floating on:latest, so an installed chart runs the operator it was published with (#45). - Return
NodeClaimNotFoundErrorwhen deleting an already-gone server, instead of a hard error (#40).
- Bumped
sigs.k8s.io/karpenter,hetznercloud/hcloud-go, and GitHub Actions (#34, #35, #36, #39, #41, #42). - CI reads the Go version from
go.modinstead of pinning it.
1.0.0 - 2026-06-16
First stable release: a complete CloudProvider implementation with full drift detection, observability, supply-chain attestations, and adoption docs.
- Image label selector:
HCloudNodeClass.spec.imageSelector.selectorfilters Hetzner images by arbitrary labels, so you can pin the exact image (version plus baked extensions, e.g. a gVisor-Talos snapshot) instead of fuzzy description matching (#23). - Wrong-arch guard: provisioning is rejected when the resolved image architecture does not match the architecture the NodeClaim requires (#23).
- Placement group creation and assignment:
placementGroupStrategy: spreadnow actually creates/assigns a cluster-scoped Hetzner placement group (previously declared but a no-op) (#24). - Location drift detection: servers whose Hetzner location is no longer in the NodeClass
locationsare flagged as drifted (#24). - Label drift detection: servers whose labels no longer cover the NodeClass
labelsare flagged as drifted (#26). - Structured logging across provider operations (server create/delete, image resolution, drift) via the controller-runtime contextual logger (#26).
seccompProfile: RuntimeDefaulton the controller pod for PSSrestrictedcompliance (#26).- Prometheus metrics (
karpenter_hetzner_*: server create/delete results and duration, hcloud API calls, drift detections, instance-type cache hits/misses) plus a HelmServiceMonitor(#29). - Warning Events from the nodeclass controller on every NotReady path, so
kubectl describe hcloudnodeclassexplains why a class is not Ready (#29). - Examples (
talos-nodeclass,ubuntu-nodeclass,nodepool-multiarch) and Talos/Ubuntu bootstrap guides (#28).
- Cosign keyless signing of the release image using GitHub OIDC (no long-lived keys).
- SLSA provenance attestation (
mode=max) attached in-registry via BuildKit. - In-registry SBOM attestation (CycloneDX) attached via BuildKit.
- Standalone SPDX SBOM uploaded as a workflow artifact via
anchore/sbom-action.
0.3.0 - 2026-06-13
HCloudNodeClass.spec.userDataSecretRef: reference a Kubernetes Secret for cloud-init user data instead of inlining it in the NodeClass spec (#20).
0.2.0 - 2026-06-13
- Upgraded to Karpenter v1.13.0 (#18).
- Bumped Helm chart to 0.2.0 (#19).
0.1.0 - 2026-06-13
- Initial
CloudProviderimplementation covering all 8 Karpenter interface methods. - Instance provider: Hetzner Cloud server CRUD (create, get, delete, list).
- Image family provider: Talos and Ubuntu image resolution.
- Instance type provider with pricing data and caching.
HCloudNodeClassCRD with labels and cluster-scope fix.- Helm chart for
karpenter-provider-hetzner. - Multi-arch Docker image (
linux/amd64,linux/arm64) built via cross-compilation (no emulation). - GitHub Actions: test, lint, release, and
govulnchecksecurity workflows. - CI publishes Helm chart to OCI registry on release.
- Resolve images per-architecture; NodeClass is
Readyif any arch resolves (#14). - Grant full Karpenter-core RBAC in Helm chart (#13).
- Treat
unsupported location for server typeas an unavailable offering rather than a hard error (#16).