kubernetes/kops · error
bare-metal support requires the Metal feature flag to be ena
Error message
bare-metal support requires the Metal feature flag to be enabled
What it means
The Metal (bare-metal) cloud provider is gated behind the experimental `Metal` feature flag. Selecting CloudProviderMetal without enabling that flag returns this error, since bare-metal support is not considered stable.
Source
Thrown at upup/pkg/fi/cloudup/new_cluster.go:389
Monitor: &api.OpenstackMonitor{
Delay: new("15s"),
Timeout: new("10s"),
MaxRetries: new(3),
},
}
initializeOpenstack(opt, cluster)
osCloud, err := openstack.NewOpenstackCloud(cluster, "openstackmodel")
if err != nil {
return nil, err
}
cloud = osCloud
case api.CloudProviderScaleway:
cluster.Spec.CloudProvider.Scaleway = &api.ScalewaySpec{}
case api.CloudProviderLinode:
cluster.Spec.CloudProvider.Linode = &api.LinodeSpec{}
case api.CloudProviderMetal:
if !featureflag.Metal.Enabled() {
return nil, fmt.Errorf("bare-metal support requires the Metal feature flag to be enabled")
}
if cluster.Labels == nil {
cluster.Labels = make(map[string]string)
}
cluster.Labels[api.AlphaLabelCloudProvider] = string(api.CloudProviderMetal)
default:
return nil, fmt.Errorf("unsupported cloud provider %s", opt.CloudProvider)
}
if opt.DiscoveryStore != "" {
discoveryPath, err := clientset.VFSContext().BuildVfsPath(opt.DiscoveryStore)
if err != nil {
return nil, fmt.Errorf("error building DiscoveryStore for cluster: %v", err)
}
cluster.Spec.ServiceAccountIssuerDiscovery = &api.ServiceAccountIssuerDiscoveryConfig{
DiscoveryStore: discoveryPath.Join(cluster.Name).Path(),
}
if cluster.GetCloudProvider() == api.CloudProviderAWS {View on GitHub (pinned to 4c8573c808)
Solutions
- Enable the flag: export KOPS_FEATURE_FLAGS=Metal (or add to existing feature flags)
- Choose a supported stable cloud provider instead
- Upgrade kOps if a newer release has graduated Metal support
Example fix
// before kops create cluster --cloud metal --name c.example.com // after export KOPS_FEATURE_FLAGS=Metal kops create cluster --cloud metal --name c.example.com
Defensive patterns
Strategy: validation
Validate before calling
if opt.CloudProvider == string(api.CloudProviderMetal) && !featureflag.Metal.Enabled() {
return fmt.Errorf("set KOPS_FEATURE_FLAGS=Metal before using --cloud metal")
} Prevention
- Export KOPS_FEATURE_FLAGS=Metal for bare-metal work
- Check featureflag.Metal.Enabled() in automation before selecting metal
- Prefer stable providers unless testing bare metal
When it happens
Trigger: `kops create cluster --cloud metal` (or opt.CloudProvider == "metal") while the KOPS_FEATURE_FLAGS environment variable or featureflag.Metal is not enabled.
Common situations: Trying bare-metal on a stock kOps install; CI environments that enable metal only in some jobs; users following experimental docs without setting the flag.
Related errors
- error building metal node identifier: %w
- creating metal IPAM controller: %w
- bare-metal support requires the Metal feature flag to be ena
- error marshalling host data: %w
- error reading public key %q: %w
AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05).
Data as JSON: /api/errors/7009dbaaeb5a19db.
Report an issue: GitHub.