kubernetes/kops · error
unknown CloudProvider %q
Error message
unknown CloudProvider %q
What it means
apply_cluster.go Run switches on the cluster's CloudProvider to run provider-specific validation; an unrecognized value falls through to default and returns 'unknown CloudProvider'. This means cluster.Spec.CloudProvider contains a string that this kOps build does not know.
Source
Thrown at upup/pkg/fi/cloudup/apply_cluster.go:513
return nil, fmt.Errorf("exactly one 'admin' SSH public key can be specified when running with Scaleway; please delete a key using `kops delete secret`")
}
scwCloud := cloud.(scaleway.ScwCloud)
scwZone = scwCloud.Zone()
}
case kops.CloudProviderLinode:
{
if !featureflag.Linode.Enabled() {
return nil, fmt.Errorf("Akamai (Linode) support is currently alpha, and is feature-gated. Please export KOPS_FEATURE_FLAGS=Linode")
}
}
case kops.CloudProviderMetal:
// Metal is a special case, we don't need to do anything here (yet)
default:
return nil, fmt.Errorf("unknown CloudProvider %q", cluster.GetCloudProvider())
}
modelContext.SSHPublicKeys = sshPublicKeys
modelContext.Region = cloud.Region()
if cluster.PublishesDNSRecords() {
err = validateDNS(cluster, cloud)
if err != nil {
return nil, err
}
}
addonRenderer := &addonTemplateRenderer{
modelContext: modelContext,
cloud: cloud,
secretStore: secretStore,
}
View on GitHub (pinned to 4c8573c808)
Solutions
- Check the value: `kops get cluster <name> -o yaml | grep cloudProvider` and fix typos (valid: aws, gce, openstack, do, hetzner, scaleway, linode, metal, azure, spot-ocean etc. per your version)
- Upgrade kOps to a version that supports the provider in the spec
- Re-create/repair the cluster spec if it was hand-edited incorrectly
Example fix
// cluster.yaml before spec: cloudProvider: openstackcloud // after spec: cloudProvider: openstack
Defensive patterns
Strategy: validation
Validate before calling
case "$(yq '.spec.cloudProvider' cluster.yaml)" in aws|gce|openstack|do|hetzner|scaleway|linode|metal|azure) echo ok;; *) echo unsupported;; esac
Type guard
func knownCloudProvider(s string) bool { switch kops.CloudProviderID(s) { case kops.CloudProviderAWS, kops.CloudProviderGCE, kops.CloudProviderOpenstack, kops.CloudProviderScaleway, kops.CloudProviderLinode, kops.CloudProviderMetal: return true } return false } Try / catch
if err := Run(ctx); err != nil { var ucpErr bool; if strings.HasPrefix(err.Error(), "unknown CloudProvider") { log.Errorf("fix spec.cloudProvider: %v", err); ucpErr = true } return err } Prevention
- Never hand-edit cloudProvider; use `kops edit cluster` and supported values only
- Keep kOps binary version in sync with the version that wrote the cluster spec
- Lint cluster manifests against the kOps API version in CI
When it happens
Trigger: `kops update cluster` on a cluster whose spec.cloudProvider is misspelled, empty after validation gaps, or from a newer kOps version than the installed binary.
Common situations: Hand-edited cluster manifests with e.g. cloudProvider: openstackcloud instead of openstack; using an old kOps binary against a cluster spec written by a newer kOps that added a provider; YAML case typos.
Related errors
- error populating configuration: %v
- InstanceGroup name is missing
- ClusterName is missing
- unknown load balancer Type: %q
- AttachDetachReconcileSyncPeriod cannot be set to less than 1
AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05).
Data as JSON: /api/errors/13eb729f8b47eab6.
Report an issue: GitHub.