pub struct DNSZoneSpec {
pub zone_name: String,
pub cluster_ref: Option<String>,
pub cluster_provider_ref: Option<String>,
pub soa_record: SOARecord,
pub ttl: Option<i32>,
pub name_server_ips: Option<HashMap<String, String>>,
pub records_from: Option<Vec<RecordSource>>,
}Expand description
DNSZone defines a DNS zone to be managed by BIND9.
A DNSZone represents an authoritative DNS zone (e.g., example.com) that will be
served by a BIND9 cluster. The zone includes SOA record information and will be
synchronized to all instances in the referenced cluster via AXFR/IXFR.
DNSZones can reference either:
- A namespace-scoped
Bind9Cluster(usingclusterRef) - A cluster-scoped
ClusterBind9Provider(usingclusterProviderRef)
Exactly one of clusterRef or clusterProviderRef must be specified.
§Example: Namespace-scoped Cluster
apiVersion: bindy.firestoned.io/v1beta1
kind: DNSZone
metadata:
name: example-com
namespace: dev-team-alpha
spec:
zoneName: example.com
clusterRef: dev-team-dns # References Bind9Cluster in same namespace
soaRecord:
primaryNs: ns1.example.com.
adminEmail: admin.example.com.
serial: 2024010101
refresh: 3600
retry: 600
expire: 604800
negativeTtl: 86400
ttl: 3600§Example: Cluster-scoped Global Cluster
apiVersion: bindy.firestoned.io/v1beta1
kind: DNSZone
metadata:
name: production-example-com
namespace: production
spec:
zoneName: example.com
clusterProviderRef: shared-production-dns # References ClusterBind9Provider (cluster-scoped)
soaRecord:
primaryNs: ns1.example.com.
adminEmail: admin.example.com.
serial: 2024010101
refresh: 3600
retry: 600
expire: 604800
negativeTtl: 86400
ttl: 3600Fields§
§zone_name: StringDNS zone name (e.g., “example.com”).
Must be a valid DNS zone name. Can be a domain or subdomain. Examples: “example.com”, “internal.example.com”, “10.in-addr.arpa”
cluster_ref: Option<String>Reference to a namespace-scoped Bind9Cluster in the same namespace.
Must match the name of a Bind9Cluster resource in the same namespace.
The zone will be added to all instances in this cluster.
Either clusterRef or clusterProviderRef must be specified (not both).
cluster_provider_ref: Option<String>Reference to a cluster-scoped ClusterBind9Provider.
Must match the name of a ClusterBind9Provider resource (cluster-scoped).
The zone will be added to all instances in this provider.
Either clusterRef or clusterProviderRef must be specified (not both).
soa_record: SOARecordSOA (Start of Authority) record - defines zone authority and refresh parameters.
The SOA record is required for all authoritative zones and contains timing information for zone transfers and caching.
ttl: Option<i32>Default TTL (Time To Live) for records in this zone, in seconds.
If not specified, individual records must specify their own TTL. Typical values: 300-86400 (5 minutes to 1 day).
name_server_ips: Option<HashMap<String, String>>Map of nameserver hostnames to IP addresses for glue records.
Glue records provide IP addresses for nameservers within the zone’s own domain. This is necessary when delegating subdomains where the nameserver is within the delegated zone itself.
Example: When delegating sub.example.com with nameserver ns1.sub.example.com,
you must provide the IP address of ns1.sub.example.com as a glue record.
Format: {"ns1.example.com.": "192.0.2.1", "ns2.example.com.": "192.0.2.2"}
Note: Nameserver hostnames should end with a dot (.) for FQDN.
records_from: Option<Vec<RecordSource>>Sources for DNS records to include in this zone.
This field defines label selectors that automatically associate DNS records with this zone. Records with matching labels will be included in the zone’s DNS configuration.
This follows the standard Kubernetes selector pattern used by Services, NetworkPolicies,
and other resources for declarative resource association.
§Example: Match podinfo records in dev/staging environments
recordsFrom:
- selector:
matchLabels:
app: podinfo
matchExpressions:
- key: environment
operator: In
values:
- dev
- staging§Selector Operators
- In: Label value must be in the specified values list
NotIn: Label value must NOT be in the specified values list- Exists: Label key must exist (any value)
DoesNotExist: Label key must NOT exist
§Use Cases
- Multi-environment zones: Dynamically include records based on environment labels
- Application-specific zones: Group all records for an application using
applabel - Team-based zones: Use team labels to automatically route records to team-owned zones
- Temporary records: Use labels to include/exclude records without changing
zoneRef
Trait Implementations§
Source§impl Clone for DNSZoneSpec
impl Clone for DNSZoneSpec
Source§fn clone(&self) -> DNSZoneSpec
fn clone(&self) -> DNSZoneSpec
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for DNSZoneSpec
impl Debug for DNSZoneSpec
Source§impl<'de> Deserialize<'de> for DNSZoneSpec
impl<'de> Deserialize<'de> for DNSZoneSpec
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl JsonSchema for DNSZoneSpec
impl JsonSchema for DNSZoneSpec
Source§fn schema_id() -> Cow<'static, str>
fn schema_id() -> Cow<'static, str>
Source§fn json_schema(generator: &mut SchemaGenerator) -> Schema
fn json_schema(generator: &mut SchemaGenerator) -> Schema
Source§fn inline_schema() -> bool
fn inline_schema() -> bool
$ref keyword. Read moreAuto Trait Implementations§
impl Freeze for DNSZoneSpec
impl RefUnwindSafe for DNSZoneSpec
impl Send for DNSZoneSpec
impl Sync for DNSZoneSpec
impl Unpin for DNSZoneSpec
impl UnwindSafe for DNSZoneSpec
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more