The primary goal of Hetzner Kubernetes Infrastructure Controller (HKIC) is an ACK-style experience for Hetzner Cloud: broad CRD + reconciler coverage so teams can declare cloud resources in Kubernetes and reconcile them with GitOps (Argo CD, Flux, and so on) like any other workload—simple single resources and composed stacks without a separate Hetzner-specific workflow for day-to-day changes.
Optional (not the product goal): samples and docs showing how those same CRDs can be composed into higher-level outcomes—Kubernetes-on-Hetzner (k3s), multi-tier apps, platform stacks—via userData, Day-2 manifests, optional scripts in contrib/k3s-optional/, Helm, or kro. Users build whatever they need from primitives; k3s is one recipe among many, not a north star.
Two layers:
- Hetzner Cloud API coverage (main track): add and harden CRDs/reconcilers for the resource types teams use (servers, networks, volumes, load balancers, firewalls, placement groups, …). Users adopt any subset. Progress: docs/hcloud-api-coverage.md.
- Composition recipes (optional track): examples that wire primitives together. Includes k3s/hetzner-k3s-oriented docs under
docs/k3s-*andconfig/samples/complex/k3s-*.
Milestones 1–2 are complete (CRD coverage + GitOps platform). Optional deferred work (HCloudSSHKey) remains low priority.
Task tracking: Linear — HCloud Operator project. GitHub Issues are closed; use Linear for active roadmap work.
| Priority | Work | Linear |
|---|---|---|
| High (now) | Multi-cluster / multi-token patterns (documentation) | ARM-71 |
| Deferred | HCloudSSHKey CRD — reference-by-name on Server is enough for most teams |
ARM-72 |
| Optional | k3s parity checklist / E2E runbook | ARM-73 |
| Out of scope (repo) | kro / Crossplane abstractions — users compose HKIC CRDs in their own tooling | — |
| Complete | Milestone 2 — observability, base reconciler, leader election, real-Hetzner E2E | ARM-30 |
All planned CRDs and hardening for this milestone are shipped; optional SSH key lifecycle is deferred in Linear (ARM-72).
-
HCloudServer— create / delete / adopt-by-name, type changes,networkRef, optionalupgradeDisk -
HCloudVolume— lifecycle, attach viaserverRef, resize -
HCloudLoadBalancer— lifecycle, target sync, services + health checks, TLS viacertificateRefs -
HCloudNetwork— private networks, Cloud subnets -
HCloudFirewall— rules, attach viaserverRefs/ label selector -
HCloudPlacementGroup— spread/cluster groups;HCloudServer.spec.placementGroupRef(#2, #3) -
HCloudPrimaryIP— IPv4/IPv6, datacenter, server assignment, DNS PTR (#4) -
HCloudFloatingIP— IPv4/IPv6, location, server assignment, DNS PTR (#5) -
HCloudCertificate— uploaded/managed TLS certs; HTTPS listeners viacertificateRefs(#6) - API coverage matrix — docs/hcloud-api-coverage.md (#1)
- Volume snapshots — N/A; Hetzner Cloud has no volume snapshot API (#7 closed)
- Harden existing CRDs — LB listeners/health,
upgradeDiskon server, volume resize (#9)
-
HCloudSSHKey— optional; track in Linear ARM-72 if fully declarative key lifecycle is required
- Project scaffolding
-
HCloudServerCRD and reconciler (create / delete / adopt-by-name) - Status sync (IPs, state, conditions)
- Finalizer-based cleanup
- Server vertical scaling (
spec.serverTypechanges via power off →change_type→ power on;status.appliedServerType) - Optional
upgradeDiskon type change (HCloudServer.spec.upgradeDisk) -
HCloudVolumeCRD and reconciler - Volume attach / detach via
serverRefand drift correction -
HCloudLoadBalancerCRD withserverSelectorand target sync - Load balancer reconciler watches
HCloudServerso label / status changes re-sync targets without waiting for periodic requeue -
WatchesonHCloudServerfromHCloudVolume— re-attach as soon asstatus.serverIDappears - Conflict-safe status updates — retry-on-conflict for controller status writes
- Observability — Kubernetes
Events, Prometheus metrics (internal/metrics+hcloud.Instrument()API wrapper), richer conditions (#11). Shared generic base reconciler (internal/reconcile) owns the loop skeleton,Syncedcondition, Events, and reconcile metrics; all nine controllers use the base. See docs/observability.md. Leader election defaults on.
-
HCloudNetworkCRD and reconciler - Attach Cloud Servers to
HCloudNetwork(HCloudServer.spec.networkRef) -
HCloudFirewallCRD and reconciler
- Helm chart — charts/hcloud-operator/,
make helm-lint - Argo CD examples — examples/argo/
- CI E2E against real Hetzner —
.github/workflows/e2e-real.yaml,make test-e2e-real - Multi-cluster / multi-token patterns — ARM-71
- Higher-level abstractions (kro, Crossplane) — not shipped in this repo; use
config/samples/complex/*as raw-CRD baselines
Not the operator goal — optional documentation and samples for teams that want to build k3s (or similar) from HKIC primitives. Optional verification: Linear ARM-73.
- k3s sample + doc — docs/k3s-on-hcloud.md,
config/samples/complex/k3s-* - Node bootstrap helpers —
contrib/k3s-optional/ - Cluster-shape recipe — docs/k3s-cluster-shape-recipe.md
- Day-2 manifests — docs/k3s-day2.md,
config/samples/complex/k3s-day2-* - hetzner-k3s mapping — docs/hetzner-k3s-cluster-yaml-mapping.md
- Optional parity checklist / E2E runbook — ARM-73
- Envtest isolation: drain cluster CRs + reset shared
FakeClientbetween Ginkgo specs (random order safe) - Keep
.idea/project-idea.mdand.idea/AGENT_*.mdaligned with README / roadmap when major features land (north star: ACK-style Hetzner API coverage)
Active roadmap and implementation tasks live in the HCloud Operator Linear project.
GitHub Issues and milestones are closed (historical reference only). External contributors may still open GitHub Issues for bugs/PRs; maintainers triage into Linear.