{"record":{"id":"c10bb8499ab9a7ee","repo":"kubernetes/kops","slug":"dns-provider-does-not-support-zones","errorCode":null,"errorMessage":"DNS provider does not support zones","messagePattern":"DNS provider does not support zones","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"dns-controller/pkg/dns/dnscache.go","lineNumber":45,"sourceCode":"\n// dnsCache is a wrapper around the DNS provider, adding some caching\ntype dnsCache struct {\n\t// zonesProviders is a slice of configured DNS providers\n\tzonesProviders []dnsprovider.Zones\n\n\t// mutex protects the following mutable state\n\tmutex sync.Mutex\n\n\tcachedZones          []dnsprovider.Zone\n\tcachedZonesTimestamp int64\n}\n\nfunc newDNSCache(providers []dnsprovider.Interface) (*dnsCache, error) {\n\tvar zonesProviders []dnsprovider.Zones\n\tfor _, provider := range providers {\n\t\tzonesProvider, ok := provider.Zones()\n\t\tif !ok {\n\t\t\treturn nil, fmt.Errorf(\"DNS provider does not support zones\")\n\t\t}\n\t\tzonesProviders = append(zonesProviders, zonesProvider)\n\t}\n\n\treturn &dnsCache{\n\t\tzonesProviders: zonesProviders,\n\t}, nil\n}\n\n// nanoTime is a stand-in until we get a monotonic clock\nfunc nanoTime() int64 {\n\treturn time.Now().UnixNano()\n}\n\n// ListZones returns the zones, using a cached copy if validity has not yet expired.\n// This is not a cheap call with a large number of hosted zones, hence the caching.\nfunc (d *dnsCache) ListZones(validity time.Duration) ([]dnsprovider.Zone, error) {\n\td.mutex.Lock()","sourceCodeStart":27,"sourceCodeEnd":63,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/dns-controller/pkg/dns/dnscache.go#L27-L63","documentation":"newDNSCache requires every configured DNS provider to expose a Zones() provider. If a provider's Zones() call returns ok=false, dns-controller cannot manage DNS records with it and construction fails with this error.","triggerScenarios":"NewDNSController is called with a dnsprovider.Interface whose Zones() does not return a zones provider — typically a provider plugin that doesn't implement zone listing or was misconfigured.","commonSituations":"Using a DNS provider binary/implementation that lacks zone support; provider plugin initialization silently succeeded but the backend is unsupported; wrong --dns flag selecting an inappropriate provider.","solutions":["Switch to a DNS provider that supports zones (e.g. route53, google-clouddns, aws-route53-sso).","Check which providers were passed to NewDNSController (log the --dns flag value) and confirm it implements dnsprovider.Zones.","Update or reinstall the dnsprovider plugin if a broken build omitted zone support."],"exampleFix":"// before\ndns-controller --dns=unsupported-provider\n// after\ndns-controller --dns=aws-route53","handlingStrategy":"validation","validationCode":"for _, p := range providers {\n\tif _, ok := p.Zones(); !ok {\n\t\treturn fmt.Errorf(\"provider %T does not support zones; choose a zone-capable --dns provider\", p)\n\t}\n}","typeGuard":"func supportsZones(p dnsprovider.Interface) bool {\n\t_, ok := p.Zones()\n\treturn ok\n}","tryCatchPattern":"dnsctl, err := dns.NewDNSController(providers, zoneRules, interval)\nif err != nil {\n\tklog.Fatalf(\"DNS controller init: %v\", err)\n}","preventionTips":["Only select --dns providers documented to support zones (route53, google-clouddns, etc.).","Probe provider.Zones() at startup with a clear fatal message naming the provider type.","Pin dns-controller/provider plugin versions known to support your backend."],"tags":["dns","dns-controller","provider","configuration"],"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"}