kubernetes/kops · error

scaleway cloud provider currently supports only one…

Error message

scaleway cloud provider currently supports only one availability zone

What it means

setupZones enforces the same single-zone constraint for Scaleway that Hetzner has: kOps can only provision a Scaleway cluster into one availability zone. When opt.Zones contains more than one entry for CloudProviderScaleway, cluster creation is aborted with this error.

Solutions

  1. Pass exactly one Scaleway availability zone, e.g. --zones fr-par-1.
  2. Check the --zones flag (and any generated cluster spec) for stray commas or extra entries.
  3. Move to a multi-zone-capable provider if multiple AZs are a hard requirement.

Example fix

// before
kops create cluster --cloud scaleway --zones fr-par-1,nl-ams-1 mycluster.k8s.local
// after
kops create cluster --cloud scaleway --zones fr-par-1 mycluster.k8s.local
Defensive patterns

Strategy: validation

Validate before calling

zones := strings.Split(*zonesFlag, ",")
if cloud == "scaleway" && len(zones) > 1 {
    return fmt.Errorf("scaleway supports exactly one AZ; got %q", zones)
}

Prevention

When it happens

Trigger: Running `kops create cluster --cloud scaleway --zones fr-par-1,fr-par-2 ...` (any --zones list with more than one Scaleway AZ) triggers this during NewCluster.

Common situations: Attempting multi-AZ HA setups on Scaleway; scripts templated for AWS that expand multiple zones; typos where a comma accidentally splits one AZ into two entries.

Related errors


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

Appendix: source

Thrown at upup/pkg/fi/cloudup/new_cluster.go:856

	case api.CloudProviderAWS:
		if len(opt.Zones) > 0 && len(opt.SubnetIDs) > 0 {
			zoneToSubnetProviderID, err = getAWSZoneToSubnetProviderID(cluster.Spec.Networking.NetworkID, opt.Zones[0][:len(opt.Zones[0])-1], opt.SubnetIDs)
			if err != nil {
				return nil, err
			}
		}

	case api.CloudProviderOpenstack:
		if len(opt.Zones) > 0 && len(opt.SubnetIDs) > 0 {
			zoneToSubnetProviderID, err = getOpenstackZoneToSubnetProviderID(cluster, allZones.List(), opt.SubnetIDs)
			if err != nil {
				return nil, err
			}
		}

	case api.CloudProviderScaleway:
		if len(opt.Zones) > 1 {
			return nil, fmt.Errorf("scaleway cloud provider currently supports only one availability zone")
		}
	}

	for _, zoneName := range allZones.List() {
		// We create default subnets named the same as the zones
		subnetName := zoneName

		subnet := model.FindSubnet(cluster, subnetName)
		if subnet == nil {
			subnet = &api.ClusterSubnetSpec{
				Name:   subnetName,
				Zone:   subnetName,
				Egress: opt.Egress,
			}
			if subnetID, ok := zoneToSubnetProviderID[zoneName]; ok {
				subnet.ID = subnetID
			}
			cluster.Spec.Networking.Subnets = append(cluster.Spec.Networking.Subnets, *subnet)

View on GitHub (pinned to 4c8573c808)