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() method

View on GitHub (pinned to 4c8573c808)

Solutions

  1. Check which DNS provider kOps selected (klog -v=2 output) and confirm it matches your cluster config (e.g. route53 vs gossip)
  2. Use a supported provider: AWS Route53, Google Cloud DNS, or gossip-based DNS for testing
  3. Upgrade kOps — older provider implementations lacked record-set support
  4. 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

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


AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05). Data as JSON: /api/errors/c1e9167220f69ebf. Report an issue: GitHub.