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

  1. 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)
  2. Upgrade kOps to a version that supports the provider in the spec
  3. 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

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


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