kubernetes/kops · error
error getting DNS resource records for %q
Error message
error getting DNS resource records for %q
What it means
precreateDNS lists the zone's record sets before pre-creating kOps DNS entries. The dnsprovider interface returns (rrs, ok) when asking a zone for its ResourceRecordSets; ok=false means this DNS provider implementation cannot enumerate record sets. kOps surfaces this as an error and skips pre-creation, failing cluster creation.
Source
Thrown at upup/pkg/fi/cloudup/dns.go:157
recordKeys := buildPrecreateDNSHostnames(cluster)
if len(recordKeys) == 0 {
klog.V(2).Infof("No DNS records to pre-create")
return nil
}
klog.V(2).Infof("Checking DNS records")
zone, err := findZone(cluster, cloud)
if err != nil {
return err
}
if zone == nil {
return nil
}
rrs, ok := zone.ResourceRecordSets()
if !ok {
return fmt.Errorf("error getting DNS resource records for %q", zone.Name())
}
recordsMap := make(map[string]dnsprovider.ResourceRecordSet)
// TODO: We should change the filter to be a suffix match instead
// records, err := rrs.List("", "")
records, err := rrs.List()
if err != nil {
return fmt.Errorf("error listing DNS resource records for %q: %v", zone.Name(), err)
}
for _, record := range records {
name := dns.EnsureDotSuffix(record.Name())
key := string(record.Type()) + "::" + name
recordsMap[key] = record
}
changeset := rrs.StartChangeset()
// TODO: Add ChangeSet.IsEmpty() methodView on GitHub (pinned to 4c8573c808)
Solutions
- Check which DNS provider kOps selected (klog -v=2 output) and confirm it matches your cluster config (e.g. route53 vs gossip)
- Use a supported provider: AWS Route53, Google Cloud DNS, or gossip-based DNS for testing
- Upgrade kOps — older provider implementations lacked record-set support
- If using a custom dnsprovider, implement ResourceRecordSets() properly
Example fix
// before --dns private # with a provider that can't enumerate record sets // after # use gossip for testing clusters export KOPS_DNS_MODE=gossip kops create cluster --name cluster.k8s.local ...
Defensive patterns
Strategy: validation
Validate before calling
// confirm provider support before precreateDNS
zone, ok := provider.Zone(name)
if !ok || zone == nil {
return errors.New("DNS zone not found for provider")
}
if _, ok := zone.ResourceRecordSets(); !ok {
return fmt.Errorf("provider %T cannot enumerate record sets; use route53/cloud-dns/gossip", zone)
} Prevention
- Use gossip DNS (cluster name ending in .k8s.local) for providers lacking record-set support
- Stick to fully supported DNS providers (Route53, Cloud DNS)
- Upgrade kOps before using newer provider integrations
- Check klog -v=2 output for which DNS provider was detected
When it happens
Trigger: Using a dnsprovider whose Zone implementation does not support ResourceRecordSets (returns false) while running `kops create cluster`/`update` with a DNS topology that requires pre-creation (gossip disabled, public DNS).
Common situations: Misconfigured/misdetected DNS provider (e.g. cluster configured for a provider kOps initialized differently); custom or older dnsprovider plugin lacking record-set support; bug after kOps DNS provider refactors.
Related errors
- zone does not support resource records %q
- error querying resource records for zone %q: %v
- error getting DNS zones provider
- error pre-creating DNS records: %v
- unknown DNSType: %q
AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05).
Data as JSON: /api/errors/c1e9167220f69ebf.
Report an issue: GitHub.