kubernetes/kops · error

CloudProvider %q not supported with etcd-manager

Error message

CloudProvider %q not supported with etcd-manager

What it means

etcd-manager replaces the legacy etcd implementation, but kOps only knows how to configure it (volume providers, tags, naming) for a fixed set of cloud providers (AWS, GCE, DO, Hetzner, Linode, OpenStack, Scaleway, metal). buildPod hits the switch's default case when the cluster's cloudProvider is not one of those, and aborts the model build with this error naming the unsupported provider.

Source

Thrown at pkg/model/components/etcdmanager/model.go:550

				fmt.Sprintf("%s--%s--", b.Cluster.Name, etcdCluster.Name),
			}

			staticConfig := &StaticConfig{
				EtcdVersion: etcdCluster.Version,
			}
			staticConfig.Nodes = append(staticConfig.Nodes, StaticConfigNode{
				ID: fmt.Sprintf("%s--%s--%d", b.Cluster.Name, etcdCluster.Name, 0),
				// TODO: Support multiple control-plane nodes (will be interesting!)
				IP: []string{"node0" + "." + etcdCluster.Name + "." + b.Cluster.Name},
			})
			b, err := json.Marshal(staticConfig)
			if err != nil {
				return nil, fmt.Errorf("building static config: %w", err)
			}
			config.StaticConfig = string(b)

		default:
			return nil, fmt.Errorf("CloudProvider %q not supported with etcd-manager", b.Cluster.GetCloudProvider())
		}
	}

	args, err := flagbuilder.BuildFlagsList(config)
	if err != nil {
		return nil, err
	}

	{
		container.Command = []string{"/go-runner"}
		container.Args = []string{
			"--log-file=/var/log/etcd.log",
			"--also-stdout",
			"/ko-app/etcd-manager",
		}
		container.Args = append(container.Args, args...)

		cpuRequest := resource.MustParse("200m")

View on GitHub (pinned to 4c8573c808)

Solutions

  1. Set spec.cloudProvider in the cluster spec to a supported provider (aws, gce, digitalocean, hetzner, linode, openstack, scaleway, or metal)
  2. Re-create the cluster on a supported provider if migrating from a removed provider (e.g. vsphere/aliyun are no longer supported)
  3. Check for typos/case mismatches in cloudProvider; kops get cluster -o yaml to verify the actual value
  4. If etcd-manager should support the provider, disable it by using legacy etcd or contribute a new case to buildPod

Example fix

// before (cluster.yaml)
spec:
  cloudProvider: vsphere
// after
spec:
  cloudProvider: aws
Defensive patterns

Strategy: validation

Validate before calling

// Validate cloudProvider before kops update cluster
provider := cluster.Spec.GetCloudProvider()
supported := map[string]bool{
    "aws": true, "gce": true, "digitalocean": true, "hetzner": true,
    "linode": true, "openstack": true, "scaleway": true, "metal": true,
}
if !supported[provider] {
    return fmt.Errorf("provider %q does not support etcd-manager; migrate cluster first", provider)
}

Try / catch

// Wrap and surface the provider name
if err := buildManifest(); err != nil {
    if strings.Contains(err.Error(), "not supported with etcd-manager") {
        return fmt.Errorf("unsupported provider for etcd-manager, see kops docs: %w", err)
    }
    return err
}

Prevention

When it happens

Trigger: `kops update cluster`/`create cluster` with spec.cloudProvider set to a provider lacking an etcd-manager case in buildPod — e.g. the legacy "vsphere", "aliyun", or "baiducloud" providers, or an empty/invalid provider value.

Common situations: Users migrating clusters from a deprecated cloud provider, copy-pasting a cluster spec from another platform, or leaving cloudProvider unset/corrupted in the cluster spec.

Related errors


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