kubernetes/kops · error

unknown cloudprovider %q

Error message

unknown cloudprovider %q

What it means

Later in Run, kOps builds cloud-specific builders in another switch over CloudProvider; an unrecognized provider hits default and returns 'unknown cloudprovider' (lowercase variant). Same root cause as the earlier unknown-CloudProvider check but at the builder-selection stage, so it surfaces when validation earlier in the flow was skipped (e.g. alternate entry points) or a provider has validation but no builders.

Source

Thrown at upup/pkg/fi/cloudup/apply_cluster.go:735

				&scalewaymodel.DNSModelBuilder{ScwModelContext: scwModelContext, Lifecycle: networkLifecycle},
				&scalewaymodel.InstanceModelBuilder{ScwModelContext: scwModelContext, BootstrapScriptBuilder: bootstrapScriptBuilder, Lifecycle: clusterLifecycle},
				&scalewaymodel.SSHKeyModelBuilder{ScwModelContext: scwModelContext, Lifecycle: securityLifecycle},
			)

		case kops.CloudProviderLinode:
			linodeModelContext := &linodemodel.LinodeModelContext{
				KopsModelContext: modelContext,
			}
			l.Builders = append(l.Builders,
				&linodemodel.NetworkModelBuilder{LinodeModelContext: linodeModelContext, Lifecycle: networkLifecycle},
				&linodemodel.InstanceModelBuilder{LinodeModelContext: linodeModelContext, BootstrapScriptBuilder: bootstrapScriptBuilder, Lifecycle: clusterLifecycle, SSHKeyLifecycle: securityLifecycle},
			)

		case kops.CloudProviderMetal:
			// No special builders for bare metal (yet)

		default:
			return nil, fmt.Errorf("unknown cloudprovider %q", cluster.GetCloudProvider())
		}
	}
	c.TaskMap, err = l.BuildTasks(ctx, c.LifecycleOverrides)
	if err != nil {
		return nil, fmt.Errorf("error building tasks: %v", err)
	}

	var target fi.CloudupTarget
	shouldPrecreateDNS := true

	deletionProcessingMode := c.DeletionProcessing
	switch c.TargetName {
	case TargetDirect:
		switch cluster.GetCloudProvider() {
		case kops.CloudProviderGCE:
			target = gce.NewGCEAPITarget(cloud.(gce.GCECloud))
		case kops.CloudProviderAWS:
			target = awsup.NewAWSAPITarget(cloud.(awsup.AWSCloud))

View on GitHub (pinned to 4c8573c808)

Solutions

  1. Fix spec.cloudProvider to a supported value and reapply
  2. Use a kOps build matching your cluster spec version
  3. If developing a new provider, add the corresponding case to the builder switch in apply_cluster.go

Example fix

// spec before
cloudProvider: mycloud
// after
cloudProvider: aws
Defensive patterns

Strategy: validation

Validate before calling

kops get cluster "$NAME" -o jsonpath='{.spec.cloudProvider}' | grep -E '^(aws|gce|openstack|do|hetzner|scaleway|linode|metal|azure)$'

Try / catch

if err := Run(ctx); err != nil { if strings.Contains(err.Error(), "unknown cloudprovider") { return fmt.Errorf("unsupported spec.cloudProvider for this kops build: %w", err) } return err }

Prevention

When it happens

Trigger: Run reaches l.BuildTasks preparation with cluster.GetCloudProvider() not matching any known case — invalid spec value or version mismatch between cluster spec and binary.

Common situations: Custom forks adding a provider value in validation but not here; hand-edited specs; running an older binary against newer spec fields.

Related errors


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