{"record":{"id":"c1e9167220f69ebf","repo":"kubernetes/kops","slug":"error-getting-dns-resource-records-for-q","errorCode":null,"errorMessage":"error getting DNS resource records for %q","messagePattern":"error getting DNS resource records for %q","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"upup/pkg/fi/cloudup/dns.go","lineNumber":157,"sourceCode":"\n\trecordKeys := buildPrecreateDNSHostnames(cluster)\n\tif len(recordKeys) == 0 {\n\t\tklog.V(2).Infof(\"No DNS records to pre-create\")\n\t\treturn nil\n\t}\n\n\tklog.V(2).Infof(\"Checking DNS records\")\n\tzone, err := findZone(cluster, cloud)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif zone == nil {\n\t\treturn nil\n\t}\n\n\trrs, ok := zone.ResourceRecordSets()\n\tif !ok {\n\t\treturn fmt.Errorf(\"error getting DNS resource records for %q\", zone.Name())\n\t}\n\n\trecordsMap := make(map[string]dnsprovider.ResourceRecordSet)\n\t// TODO: We should change the filter to be a suffix match instead\n\t// records, err := rrs.List(\"\", \"\")\n\trecords, err := rrs.List()\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error listing DNS resource records for %q: %v\", zone.Name(), err)\n\t}\n\n\tfor _, record := range records {\n\t\tname := dns.EnsureDotSuffix(record.Name())\n\t\tkey := string(record.Type()) + \"::\" + name\n\t\trecordsMap[key] = record\n\t}\n\n\tchangeset := rrs.StartChangeset()\n\t// TODO: Add ChangeSet.IsEmpty() method","sourceCodeStart":139,"sourceCodeEnd":175,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/upup/pkg/fi/cloudup/dns.go#L139-L175","documentation":"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.","triggerScenarios":"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).","commonSituations":"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.","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"],"exampleFix":"// before\n--dns private   # with a provider that can't enumerate record sets\n// after\n# use gossip for testing clusters\nexport KOPS_DNS_MODE=gossip\nkops create cluster --name cluster.k8s.local ...","handlingStrategy":"validation","validationCode":"// confirm provider support before precreateDNS\nzone, ok := provider.Zone(name)\nif !ok || zone == nil {\n    return errors.New(\"DNS zone not found for provider\")\n}\nif _, ok := zone.ResourceRecordSets(); !ok {\n    return fmt.Errorf(\"provider %T cannot enumerate record sets; use route53/cloud-dns/gossip\", zone)\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["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"],"tags":["dns","dnsprovider","cluster-creation"],"backgroundTag":"dns-provider-unsupported","analyzedSha":"4c8573c808a73d578c5eadc86d410646ea0b0d73","analyzedAt":"2026-09-05T04:13:19.212Z","contentChangedAt":"2026-09-05T04:13:19.212Z","schemaVersion":2},"datasetVersion":"2026-09-12T07:17:12.445Z"}