Drop redundant dynamic cluster mode
ci/woodpecker/pr/build Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
ci/woodpecker/pr/test Pipeline was successful

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
This commit is contained in:
2026-07-03 18:32:09 +10:00
parent 4092a25f4f
commit e60080efa2
4 changed files with 12 additions and 13 deletions
+2 -2
View File
@@ -38,7 +38,7 @@ script picks one based on the pod ordinal.
| Kind | Purpose |
|------|---------|
| `BindCluster` | A set of BIND9 servers. `spec.mode`: `authoritative`, `resolver`, or `dynamic`. |
| `BindCluster` | A set of BIND9 servers. `spec.mode`: `authoritative` or `resolver`. |
| `BindZone` | A forward/reverse zone (`primary`/`secondary`/`forward`/`stub`), records inline, optional dynamic-update + DNSSEC + catalog membership. |
| `DNSRecord` | A single record set applied via TSIG `nsupdate` — external-dns as a CRD. |
| `BindView` | A split-horizon view (`match-clients`, ordering, per-view recursion). |
@@ -58,7 +58,7 @@ The three Puppet-managed BIND roles map onto three `BindCluster`s:
|-------------|---------------|------|
| 3× authoritative masters | `auth` | `authoritative` (pod-0 primary, 2 secondaries) |
| 3× only-resolvers | `resolver` | `resolver` (3 identical recursive servers) |
| 3× external-dns | `externaldns` | `dynamic` (RFC2136 TSIG updates on primary) |
| 3× external-dns | `externaldns` | `authoritative` (zones set `dynamicUpdate` for RFC2136 TSIG updates) |
## Development
+6 -7
View File
@@ -7,20 +7,19 @@ import (
// BindMode selects the behaviour of a BindCluster and maps onto a classic
// BIND deployment role.
// - authoritative: serves signed/unsigned authoritative zones. Ordinal-0 is
// the primary that holds zone data; the remaining pods are secondaries that
// replicate via AXFR/IXFR + NOTIFY (optionally driven by a catalog zone).
// - authoritative: serves authoritative zones. Ordinal-0 is the primary that
// holds zone data; the remaining pods are secondaries that replicate via
// AXFR/IXFR + NOTIFY (optionally driven by a catalog zone). Zones that set
// spec.dynamicUpdate accept RFC2136 TSIG updates (the external-dns pattern),
// so no separate mode is needed for external-dns servers.
// - resolver: N identical recursive resolvers, no zone replication.
// - dynamic: like authoritative, but the primary accepts RFC2136 TSIG updates
// (the external-dns pattern); secondaries replicate the result.
//
// +kubebuilder:validation:Enum=authoritative;resolver;dynamic
// +kubebuilder:validation:Enum=authoritative;resolver
type BindMode string
const (
ModeAuthoritative BindMode = "authoritative"
ModeResolver BindMode = "resolver"
ModeDynamic BindMode = "dynamic"
)
// ClusterServiceSpec controls how the cluster is exposed to clients.
@@ -1007,7 +1007,6 @@ spec:
enum:
- authoritative
- resolver
- dynamic
type: string
nodeSelector:
additionalProperties:
+4 -3
View File
@@ -1,13 +1,14 @@
---
# external-dns role (replaces 3x Puppet external-dns servers). The primary
# accepts RFC2136 TSIG updates from external-dns; secondaries replicate.
# external-dns role (replaces 3x Puppet external-dns servers). This is an
# ordinary authoritative cluster; external-dns writes to the zone below via
# RFC2136 because the zone sets dynamicUpdate (allow-update { key ... }).
apiVersion: bind.unkin.net/v1alpha1
kind: BindCluster
metadata:
name: externaldns
namespace: bind-externaldns
spec:
mode: dynamic
mode: authoritative
replicas: 3
service:
type: LoadBalancer