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
- Fix spec.cloudProvider to a supported value and reapply
- Use a kOps build matching your cluster spec version
- 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
- Match kOps binary version to cluster spec version
- Add builder cases for any custom provider in forks before enabling applies
- Validate specs in CI with the same kOps version used for applies
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
- unknown CloudProvider %q
- DeviceName not set for volume
- Error too many '=' (%d) in %s
- building kubernetes client for node labeler: %w
- clientset is not initialized
AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05).
Data as JSON: /api/errors/89c69afb38075556.
Report an issue: GitHub.