Initial bind-operator: 9 CRDs + controllers #1
Reference in New Issue
Block a user
Delete Branch "benvin/initial-operator"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Bootstraps the bind-operator: a Kubernetes operator that manages fleets of BIND9 servers declaratively (controller-runtime, matching forgebot conventions).
Why
Migrates the Puppet-managed BIND estate (3x authoritative masters, 3x only-resolvers, 3x external-dns) to three operator-managed
BindClusters in Kubernetes.Design
rndc addzone+ TSIGnsupdateagainst the primary pod (ordinal-0). Secondaries replicate via AXFR/IXFR and a catalog zone (no per-zone reconfig).named.conf(primary/secondary variants selected by pod ordinal) and reloaded withrndc reconfig. The BindCluster controller watches dependent CRs to re-render.CRDs
BindCluster(modes: authoritative / resolver / dynamic),BindZone,BindView,BindTSIGKeyBindACL,BindCatalogZone,BindPolicy(RPZ),BindDNSSECPolicy,DNSRecord(external-dns-style)Changes
api/v1alpha1: 9 CRD types + generated deepcopy/CRDs/RBACinternal/controller: 9 reconcilers + shared helpersinternal/bind: pod exec, rndc, nsupdate, named.conf rendering, catalog hashing (unit-tested)config/samples: worked examples mapping the three Puppet rolesTest
make test(go test -race),go vet,gofmt -lall clean locally.The dynamic mode produced a byte-identical cluster to authoritative: RFC2136 update capability is a per-zone property (BindZone.dynamicUpdate + updateKeyRef render allow-update { key ... }), not a cluster role. The external-dns tier is just an authoritative cluster whose zones allow dynamic updates. - remove BindMode dynamic from the enum and constants - switch the external-dns sample to mode authoritative - update README migration mapping