Create new clusters with updated control plane IG names

This commit is contained in:
John Gardiner Myers 2022-11-22 20:19:46 -08:00
parent 1b4616c9fb
commit 6c0603991b
14 changed files with 144 additions and 127 deletions

View File

@ -63,7 +63,7 @@ type CreateClusterOptions struct {
cloudup.NewClusterOptions
Yes bool
Target string
MasterVolumeSize int32
ControlPlaneVolumeSize int32
NodeVolumeSize int32
ContainerRuntime string
OutDir string
@ -71,7 +71,7 @@ type CreateClusterOptions struct {
NetworkCIDR string
DNSZone string
NodeSecurityGroups []string
MasterSecurityGroups []string
ControlPlaneSecurityGroups []string
AssociatePublicIP *bool
// SSHPublicKeys is a map of the SSH public keys we should configure; required on AWS, not required on GCE
@ -85,12 +85,12 @@ type CreateClusterOptions struct {
// CloudLabels are cloud-provider-level tags for instance groups and volumes.
CloudLabels string
// Specify tenancy (default or dedicated) for masters and nodes
MasterTenancy string
// Specify tenancy (default or dedicated) for control-plane and worker nodes
ControlPlaneTenancy string
NodeTenancy string
// Allow custom public master name
MasterPublicName string
// Allow custom public Kubernetes API name.
APIPublicName string
OpenstackNetworkID string
@ -126,19 +126,19 @@ var (
--zones=us-east-1a \
--node-count=2
# Create a cluster in AWS with High Availability masters. This cluster
# Create a cluster in AWS with a High Availability control plane. This cluster
# has also been configured for private networking in a kops-managed VPC.
# The bastion flag is set to create an entrypoint for admins to SSH.
export KOPS_STATE_STORE="s3://my-state-store"
export MASTER_SIZE="c5.large"
export CONTROL_PLANE_SIZE="c5.large"
export NODE_SIZE="m5.large"
export ZONES="us-east-1a,us-east-1b,us-east-1c"
kops create cluster k8s-cluster.example.com \
--node-count 3 \
--zones $ZONES \
--node-size $NODE_SIZE \
--master-size $MASTER_SIZE \
--master-zones $ZONES \
--control-plane-size $CONTROL_PLANE_SIZE \
--control-plane-zones $ZONES \
--networking cilium \
--topology private \
--bastion="true" \
@ -150,7 +150,7 @@ var (
kops create cluster k8s-cluster.example.com \
--cloud digitalocean \
--zones $ZONES \
--master-zones $ZONES \
--control-plane-zones $ZONES \
--node-count 3 \
--yes
@ -237,8 +237,8 @@ func NewCmdCreateCluster(f *util.Factory, out io.Writer) *cobra.Command {
cmd.Flags().StringSliceVar(&options.Zones, "zones", options.Zones, "Zones in which to run the cluster")
cmd.RegisterFlagCompletionFunc("zones", completeZone(options))
cmd.Flags().StringSliceVar(&options.MasterZones, "master-zones", options.MasterZones, "Zones in which to run masters (must be an odd number)")
cmd.RegisterFlagCompletionFunc("master-zones", completeZone(options))
cmd.Flags().StringSliceVar(&options.ControlPlaneZones, "control-plane-zones", options.ControlPlaneZones, "Zones in which to run control-plane nodes. (must be an odd number)")
cmd.RegisterFlagCompletionFunc("control-plane-zones", completeZone(options))
if featureflag.ClusterAddons.Enabled() {
cmd.Flags().StringSliceVar(&options.AddonPaths, "add", options.AddonPaths, "Paths to addons we should add to the cluster")
@ -261,24 +261,24 @@ func NewCmdCreateCluster(f *util.Factory, out io.Writer) *cobra.Command {
return []string{"pub"}, cobra.ShellCompDirectiveFilterFileExt
})
cmd.Flags().Int32Var(&options.MasterCount, "master-count", options.MasterCount, "Number of masters. Defaults to one master per master-zone")
cmd.Flags().Int32Var(&options.ControlPlaneCount, "control-plane-count", options.ControlPlaneCount, "Number of control-plane nodes. Defaults to one control-plane node per control-plane-zone")
cmd.Flags().Int32Var(&options.NodeCount, "node-count", options.NodeCount, "Total number of worker nodes. Defaults to one node per zone")
cmd.Flags().StringVar(&options.Image, "image", options.Image, "Machine image for all instances")
cmd.RegisterFlagCompletionFunc("image", completeInstanceImage)
cmd.Flags().StringVar(&options.NodeImage, "node-image", options.NodeImage, "Machine image for worker nodes. Takes precedence over --image")
cmd.RegisterFlagCompletionFunc("node-image", completeInstanceImage)
cmd.Flags().StringVar(&options.MasterImage, "master-image", options.MasterImage, "Machine image for masters. Takes precedence over --image")
cmd.RegisterFlagCompletionFunc("master-image", completeInstanceImage)
cmd.Flags().StringVar(&options.ControlPlaneImage, "control-plane-image", options.ControlPlaneImage, "Machine image for control-plane nodes. Takes precedence over --image")
cmd.RegisterFlagCompletionFunc("control-plane-image", completeInstanceImage)
cmd.Flags().StringVar(&options.BastionImage, "bastion-image", options.BastionImage, "Machine image for bastions. Takes precedence over --image")
cmd.RegisterFlagCompletionFunc("bastion-image", completeInstanceImage)
cmd.Flags().StringVar(&options.NodeSize, "node-size", options.NodeSize, "Machine type for worker nodes")
cmd.RegisterFlagCompletionFunc("node-size", completeMachineType)
cmd.Flags().StringVar(&options.MasterSize, "master-size", options.MasterSize, "Machine type for masters")
cmd.RegisterFlagCompletionFunc("master-size", completeMachineType)
cmd.Flags().StringVar(&options.ControlPlaneSize, "control-plane-size", options.ControlPlaneSize, "Machine type for control-plane nodes")
cmd.RegisterFlagCompletionFunc("control-plane-size", completeMachineType)
cmd.Flags().Int32Var(&options.MasterVolumeSize, "master-volume-size", options.MasterVolumeSize, "Instance volume size (in GB) for masters")
cmd.Flags().Int32Var(&options.ControlPlaneVolumeSize, "control-plane-volume-size", options.ControlPlaneVolumeSize, "Instance volume size (in GB) for control-plane nodes")
cmd.Flags().Int32Var(&options.NodeVolumeSize, "node-volume-size", options.NodeVolumeSize, "Instance volume size (in GB) for worker nodes")
cmd.Flags().StringVar(&options.NetworkID, "vpc", options.NetworkID, "Shared Network or VPC to use")
@ -317,14 +317,14 @@ func NewCmdCreateCluster(f *util.Factory, out io.Writer) *cobra.Command {
})
// TODO: Can we deprecate this flag - it is awkward?
cmd.Flags().BoolVar(&associatePublicIP, "associate-public-ip", false, "Specify --associate-public-ip=[true|false] to enable/disable association of public IP for master ASG and nodes. Default is 'true'.")
cmd.Flags().BoolVar(&associatePublicIP, "associate-public-ip", false, "Specify --associate-public-ip=[true|false] to enable/disable association of public IP for control-plane ASG and nodes. Default is 'true'.")
cmd.Flags().BoolVar(&options.IPv6, "ipv6", false, "Use IPv6 for the pod network (AWS only)")
cmd.Flags().StringSliceVar(&options.NodeSecurityGroups, "node-security-groups", options.NodeSecurityGroups, "Additional precreated security groups to add to worker nodes.")
cmd.Flags().StringSliceVar(&options.NodeSecurityGroups, "node-security-groups", options.NodeSecurityGroups, "Additional pre-created security groups to add to worker nodes.")
cmd.RegisterFlagCompletionFunc("node-security-groups", completeSecurityGroup)
cmd.Flags().StringSliceVar(&options.MasterSecurityGroups, "master-security-groups", options.MasterSecurityGroups, "Additional precreated security groups to add to masters.")
cmd.RegisterFlagCompletionFunc("master-security-groups", completeSecurityGroup)
cmd.Flags().StringSliceVar(&options.ControlPlaneSecurityGroups, "control-plane-security-groups", options.ControlPlaneSecurityGroups, "Additional pre-created security groups to add to control-plane nodes.")
cmd.RegisterFlagCompletionFunc("control-plane-security-groups", completeSecurityGroup)
cmd.Flags().StringVar(&options.Channel, "channel", options.Channel, "Channel for default versions and configuration to use")
cmd.RegisterFlagCompletionFunc("channel", completeChannel)
@ -357,9 +357,9 @@ func NewCmdCreateCluster(f *util.Factory, out io.Writer) *cobra.Command {
return nil, cobra.ShellCompDirectiveNoFileComp
})
// Master and Node Tenancy
cmd.Flags().StringVar(&options.MasterTenancy, "master-tenancy", options.MasterTenancy, "Tenancy of the master group (AWS only): default or dedicated")
cmd.RegisterFlagCompletionFunc("master-tenancy", completeTenancy)
// Control Plane and Worker Node Tenancy
cmd.Flags().StringVar(&options.ControlPlaneTenancy, "control-plane-tenancy", options.ControlPlaneTenancy, "Tenancy of the control-plane group (AWS only): default or dedicated")
cmd.RegisterFlagCompletionFunc("control-plane-tenancy", completeTenancy)
cmd.Flags().StringVar(&options.NodeTenancy, "node-tenancy", options.NodeTenancy, "Tenancy of the node group (AWS only): default or dedicated")
cmd.RegisterFlagCompletionFunc("node-tenancy", completeTenancy)
@ -375,9 +375,9 @@ func NewCmdCreateCluster(f *util.Factory, out io.Writer) *cobra.Command {
cmd.Flags().StringVar(&options.APISSLCertificate, "api-ssl-certificate", options.APISSLCertificate, "ARN of the SSL Certificate to use for the Kubernetes API load balancer (AWS only)")
cmd.RegisterFlagCompletionFunc("api-ssl-certificate", completeSSLCertificate)
// Allow custom public master name
cmd.Flags().StringVar(&options.MasterPublicName, "master-public-name", options.MasterPublicName, "Domain name of the public Kubernetes API")
cmd.RegisterFlagCompletionFunc("master-public-name", func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
// Allow custom public Kuberneters API name.
cmd.Flags().StringVar(&options.APIPublicName, "api-public-name", options.APIPublicName, "Domain name of the public Kubernetes API")
cmd.RegisterFlagCompletionFunc("api-public-name", func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
return nil, cobra.ShellCompDirectiveNoFileComp
})
@ -450,6 +450,22 @@ func NewCmdCreateCluster(f *util.Factory, out io.Writer) *cobra.Command {
switch name {
case "override":
name = "set"
case "master-count":
name = "control-plane-count"
case "master-image":
name = "control-plane-image"
case "master-public-name":
name = "api-public-name"
case "master-security-groups":
name = "control-plane-security-groups"
case "master-size":
name = "control-plane-size"
case "master-tenancy":
name = "control-plane-tenancy"
case "master-volume-size":
name = "control-plane-volume-size"
case "master-zones":
name = "control-plane-zones"
}
return pflag.NormalizedName(name)
})
@ -528,12 +544,12 @@ func RunCreateCluster(ctx context.Context, f *util.Factory, out io.Writer, c *Cr
cluster := clusterResult.Cluster
instanceGroups := clusterResult.InstanceGroups
var masters []*api.InstanceGroup
var controlPlanes []*api.InstanceGroup
var nodes []*api.InstanceGroup
for _, ig := range instanceGroups {
switch ig.Spec.Role {
case api.InstanceGroupRoleControlPlane:
masters = append(masters, ig)
controlPlanes = append(controlPlanes, ig)
case api.InstanceGroupRoleNode:
nodes = append(nodes, ig)
}
@ -553,9 +569,9 @@ func RunCreateCluster(ctx context.Context, f *util.Factory, out io.Writer, c *Cr
}
}
if c.MasterTenancy != "" {
for _, group := range masters {
group.Spec.Tenancy = c.MasterTenancy
if c.ControlPlaneTenancy != "" {
for _, group := range controlPlanes {
group.Spec.Tenancy = c.ControlPlaneTenancy
}
}
@ -571,15 +587,15 @@ func RunCreateCluster(ctx context.Context, f *util.Factory, out io.Writer, c *Cr
}
}
if len(c.MasterSecurityGroups) > 0 {
for _, group := range masters {
group.Spec.AdditionalSecurityGroups = c.MasterSecurityGroups
if len(c.ControlPlaneSecurityGroups) > 0 {
for _, group := range controlPlanes {
group.Spec.AdditionalSecurityGroups = c.ControlPlaneSecurityGroups
}
}
if c.MasterVolumeSize != 0 {
for _, group := range masters {
group.Spec.RootVolumeSize = fi.PtrTo(c.MasterVolumeSize)
if c.ControlPlaneVolumeSize != 0 {
for _, group := range controlPlanes {
group.Spec.RootVolumeSize = fi.PtrTo(c.ControlPlaneVolumeSize)
}
}
@ -605,8 +621,8 @@ func RunCreateCluster(ctx context.Context, f *util.Factory, out io.Writer, c *Cr
cluster.Spec.TagSubnets = fi.PtrTo(false)
}
if c.MasterPublicName != "" {
cluster.Spec.API.PublicName = c.MasterPublicName
if c.APIPublicName != "" {
cluster.Spec.API.PublicName = c.APIPublicName
}
if err := commands.UnsetClusterFields(c.Unsets, cluster); err != nil {
@ -782,8 +798,8 @@ func RunCreateCluster(ctx context.Context, f *util.Factory, out io.Writer, c *Cr
if len(nodes) > 0 {
fmt.Fprintf(&sb, " * edit your node instance group: kops edit ig --name=%s %s\n", cluster.Name, nodes[0].ObjectMeta.Name)
}
if len(masters) > 0 {
fmt.Fprintf(&sb, " * edit your master instance group: kops edit ig --name=%s %s\n", cluster.Name, masters[0].ObjectMeta.Name)
if len(controlPlanes) > 0 {
fmt.Fprintf(&sb, " * edit your control-plane instance group: kops edit ig --name=%s %s\n", cluster.Name, controlPlanes[0].ObjectMeta.Name)
}
fmt.Fprintf(&sb, "\n")
fmt.Fprintf(&sb, "Finally configure your cluster with: kops update cluster --name %s --yes --admin\n", cluster.Name)

View File

@ -129,7 +129,7 @@ func (b *DNSModelBuilder) Build(c *fi.ModelBuilderContext) error {
return err
}
// Using EnsureTask as APIInternalName() and MasterPublicName could be the same
// Using EnsureTask as APIInternalName() and APIPublicName could be the same
{
err := c.EnsureTask(&awstasks.DNSName{
Name: fi.PtrTo(b.Cluster.APIInternalName()),

View File

@ -5,7 +5,7 @@ CloudProvider: aws
Networking: cni
KubernetesVersion: v1.24.0
Image: ami-image
MasterImage: ami-control-plane
ControlPlaneImage: ami-control-plane
NodeImage: ami-worker-image
Bastion: true
Topology: private

View File

@ -1,7 +1,7 @@
ClusterName: gce.example.com
Zones:
- us-test1-a
MasterZones:
ControlPlaneZones:
- us-test1-a
CloudProvider: gce
Networking: cni

View File

@ -3,7 +3,7 @@ Zones:
- us-test-1a
- us-test-1b
- us-test-1c
MasterZones:
ControlPlaneZones:
- us-test-1a
- us-test-1b
- us-test-1c

View File

@ -3,7 +3,7 @@ Zones:
- us-test-1a
- us-test-1b
- us-test-1c
MasterZones:
ControlPlaneZones:
- us-test-1a
- us-test-1b
- us-test-1c

View File

@ -3,7 +3,7 @@ Zones:
- us-test1-a
- us-test1-b
- us-test1-c
MasterZones:
ControlPlaneZones:
- us-test1-a
- us-test1-b
- us-test1-c

View File

@ -2,7 +2,7 @@ CloudProvider: hetzner
ClusterName: ha.example.com
Image: ubuntu-20.04
KubernetesVersion: v1.25.0
MasterCount: 3
ControlPlaneCount: 3
NetworkCIDR: 10.0.0.0/16
Networking: cni
Zones:

View File

@ -1,7 +1,7 @@
ClusterName: ha.example.com
Zones:
- us-test-1a
MasterCount: 3
ControlPlaneCount: 3
CloudProvider: aws
Networking: cni
KubernetesVersion: v1.21.0

View File

@ -2,7 +2,7 @@ ClusterName: ha.example.com
Zones:
- us-test-1a
- us-test-1b
MasterCount: 5
ControlPlaneCount: 5
CloudProvider: aws
Networking: cni
KubernetesVersion: v1.21.0

View File

@ -5,4 +5,4 @@ CloudProvider: aws
Networking: cni
KubernetesVersion: v1.26.0
NodeSize: m6g.xlarge
MasterSize: m6g.xlarge
ControlPlaneSize: m6g.xlarge

View File

@ -8,7 +8,7 @@ Bastion: true
NodeSecurityGroups:
- sg-exampleid
- sg-exampleid2
MasterSecurityGroups:
ControlPlaneSecurityGroups:
- sg-exampleid3
- sg-exampleid4
KubernetesVersion: v1.21.0

View File

@ -8,11 +8,11 @@ Bastion: true
NodeSecurityGroups:
- sg-exampleid
- sg-exampleid2
MasterSecurityGroups:
ControlPlaneSecurityGroups:
- sg-exampleid3
- sg-exampleid4
KubernetesVersion: v1.21.0
cloudLabels: "Owner=John Doe,dn=\"cn=John Doe: dc=example dc=com\", foo/bar=fib+baz"
Project: testproject
GCEServiceAccount: test-account@testproject.iam.gserviceaccount.com
MasterSize: e2-standard-2
ControlPlaneSize: e2-standard-2

View File

@ -74,8 +74,8 @@ type NewClusterOptions struct {
CloudProvider string
// Zones are the availability zones in which to run the cluster.
Zones []string
// MasterZones are the availability zones in which to run the masters. Defaults to the list in the Zones field.
MasterZones []string
// ControlPlaneZones are the availability zones in which to run the control-plane nodes. Defaults to the list in the Zones field.
ControlPlaneZones []string
// Project is the cluster's GCE project.
Project string
@ -116,9 +116,9 @@ type NewClusterOptions struct {
AzureRouteTableName string
AzureAdminUser string
// MasterCount is the number of masters to create. Defaults to the length of MasterZones
// if MasterZones is explicitly nonempty, otherwise defaults to 1.
MasterCount int32
// ControlPlaneCount is the number of control-plane nodes to create. Defaults to the length of ControlPlaneZones.
// if ControlPlaneZones is explicitly nonempty, otherwise defaults to 1.
ControlPlaneCount int32
// APIServerCount is the number of API servers to create. Defaults to 0.
APIServerCount int32
// EncryptEtcdStorage is whether to encrypt the etcd volumes.
@ -156,9 +156,9 @@ type NewClusterOptions struct {
Image string
NodeImage string
MasterImage string
ControlPlaneImage string
BastionImage string
MasterSize string
ControlPlaneSize string
NodeSize string
}
@ -285,7 +285,7 @@ func NewCluster(opt *NewClusterOptions, clientset simple.Clientset) (*NewCluster
}
allZones := sets.NewString()
allZones.Insert(opt.Zones...)
allZones.Insert(opt.MasterZones...)
allZones.Insert(opt.ControlPlaneZones...)
if opt.CloudProvider == "" {
for _, zone := range allZones.List() {
@ -382,7 +382,7 @@ func NewCluster(opt *NewClusterOptions, clientset simple.Clientset) (*NewCluster
return nil, err
}
masters, err := setupMasters(opt, &cluster, zoneToSubnetMap)
controlPlanes, err := setupControlPlane(opt, &cluster, zoneToSubnetMap)
if err != nil {
return nil, err
}
@ -420,7 +420,7 @@ func NewCluster(opt *NewClusterOptions, clientset simple.Clientset) (*NewCluster
return nil, err
}
instanceGroups := append([]*api.InstanceGroup(nil), masters...)
instanceGroups := append([]*api.InstanceGroup(nil), controlPlanes...)
instanceGroups = append(instanceGroups, apiservers...)
instanceGroups = append(instanceGroups, nodes...)
instanceGroups = append(instanceGroups, bastions...)
@ -445,7 +445,7 @@ func NewCluster(opt *NewClusterOptions, clientset simple.Clientset) (*NewCluster
if g.Spec.MachineType == "" {
g.Spec.MachineType, err = defaultMachineType(cloud, &cluster, ig)
if err != nil {
return nil, fmt.Errorf("error assigning default machine type for masters: %v", err)
return nil, fmt.Errorf("error assigning default machine type for control plane: %v", err)
}
}
@ -482,7 +482,7 @@ func NewCluster(opt *NewClusterOptions, clientset simple.Clientset) (*NewCluster
if ig.IsControlPlane() {
if len(ig.Spec.Subnets) == 0 {
return nil, fmt.Errorf("master InstanceGroup %s did not specify any Subnets", g.ObjectMeta.Name)
return nil, fmt.Errorf("control-plane InstanceGroup %s did not specify any Subnets", g.ObjectMeta.Name)
}
} else if ig.IsAPIServerOnly() && cluster.Spec.IsIPv6Only() {
if len(ig.Spec.Subnets) == 0 {
@ -811,52 +811,52 @@ func getOpenstackZoneToSubnetProviderID(spec *api.ClusterSpec, zones []string, s
return res, nil
}
func setupMasters(opt *NewClusterOptions, cluster *api.Cluster, zoneToSubnetMap map[string]*api.ClusterSubnetSpec) ([]*api.InstanceGroup, error) {
func setupControlPlane(opt *NewClusterOptions, cluster *api.Cluster, zoneToSubnetMap map[string]*api.ClusterSubnetSpec) ([]*api.InstanceGroup, error) {
cloudProvider := cluster.Spec.GetCloudProvider()
var masters []*api.InstanceGroup
var controlPlanes []*api.InstanceGroup
// Build the master subnets
// The master zones is the default set of zones unless explicitly set
// The master count is the number of master zones unless explicitly set
// We then round-robin around the zones
// Build the control-plane subnets.
// The control-plane zones is the default set of zones unless explicitly set.
// The control-plane count is the number of control-plane zones unless explicitly set.
// We then round-robin around the zones.
{
masterCount := opt.MasterCount
masterZones := opt.MasterZones
if len(masterZones) != 0 {
if masterCount != 0 && masterCount < int32(len(masterZones)) {
return nil, fmt.Errorf("specified %d master zones, but also requested %d masters. If specifying both, the count should match.", len(masterZones), masterCount)
controlPlaneCount := opt.ControlPlaneCount
controlPlaneZones := opt.ControlPlaneZones
if len(controlPlaneZones) != 0 {
if controlPlaneCount != 0 && controlPlaneCount < int32(len(controlPlaneZones)) {
return nil, fmt.Errorf("specified %d control-plane zones, but also requested %d control-plane nodes. If specifying both, the count should match.", len(controlPlaneZones), controlPlaneCount)
}
if masterCount == 0 {
// If master count is not specified, default to the number of master zones
masterCount = int32(len(masterZones))
if controlPlaneCount == 0 {
// If control-plane count is not specified, default to the number of control-plane zones
controlPlaneCount = int32(len(controlPlaneZones))
}
} else {
// masterZones not set; default to same as node Zones
masterZones = opt.Zones
// controlPlaneZones not set; default to same as node Zones
controlPlaneZones = opt.Zones
if masterCount == 0 {
// If master count is not specified, default to 1
masterCount = 1
if controlPlaneCount == 0 {
// If control-plane count is not specified, default to 1
controlPlaneCount = 1
}
}
if len(masterZones) == 0 {
if len(controlPlaneZones) == 0 {
// Should be unreachable
return nil, fmt.Errorf("cannot determine master zones")
return nil, fmt.Errorf("cannot determine control-plane zones")
}
for i := 0; i < int(masterCount); i++ {
zone := masterZones[i%len(masterZones)]
for i := 0; i < int(controlPlaneCount); i++ {
zone := controlPlaneZones[i%len(controlPlaneZones)]
name := zone
if cloudProvider == api.CloudProviderDO {
if int(masterCount) >= len(masterZones) {
name += "-" + strconv.Itoa(1+(i/len(masterZones)))
if int(controlPlaneCount) >= len(controlPlaneZones) {
name += "-" + strconv.Itoa(1+(i/len(controlPlaneZones)))
}
} else {
if int(masterCount) > len(masterZones) {
name += "-" + strconv.Itoa(1+(i/len(masterZones)))
if int(controlPlaneCount) > len(controlPlaneZones) {
name += "-" + strconv.Itoa(1+(i/len(controlPlaneZones)))
}
}
@ -864,7 +864,7 @@ func setupMasters(opt *NewClusterOptions, cluster *api.Cluster, zoneToSubnetMap
g.Spec.Role = api.InstanceGroupRoleControlPlane
g.Spec.MinSize = fi.PtrTo(int32(1))
g.Spec.MaxSize = fi.PtrTo(int32(1))
g.ObjectMeta.Name = "master-" + name
g.ObjectMeta.Name = "control-plane-" + name
subnet := zoneToSubnetMap[zone]
if subnet == nil {
@ -891,33 +891,33 @@ func setupMasters(opt *NewClusterOptions, cluster *api.Cluster, zoneToSubnetMap
}
}
g.Spec.MachineType = opt.MasterSize
g.Spec.Image = opt.MasterImage
g.Spec.MachineType = opt.ControlPlaneSize
g.Spec.Image = opt.ControlPlaneImage
masters = append(masters, g)
controlPlanes = append(controlPlanes, g)
}
}
// Build the Etcd clusters
{
masterAZs := sets.NewString()
controlPlaneAZs := sets.NewString()
duplicateAZs := false
for _, ig := range masters {
for _, ig := range controlPlanes {
zones, err := model.FindZonesForInstanceGroup(cluster, ig)
if err != nil {
return nil, err
}
for _, zone := range zones {
if masterAZs.Has(zone) {
if controlPlaneAZs.Has(zone) {
duplicateAZs = true
}
masterAZs.Insert(zone)
controlPlaneAZs.Insert(zone)
}
}
if duplicateAZs {
klog.Warningf("Running with masters in the same AZs; redundancy will be reduced")
klog.Warningf("Running with control-plane nodes in the same AZs; redundancy will be reduced")
}
clusters := EtcdClusters
@ -933,12 +933,12 @@ func setupMasters(opt *NewClusterOptions, cluster *api.Cluster, zoneToSubnetMap
encryptEtcdStorage = true
}
for _, etcdCluster := range clusters {
etcd := createEtcdCluster(etcdCluster, masters, encryptEtcdStorage, opt.EtcdStorageType)
etcd := createEtcdCluster(etcdCluster, controlPlanes, encryptEtcdStorage, opt.EtcdStorageType)
cluster.Spec.EtcdClusters = append(cluster.Spec.EtcdClusters, etcd)
}
}
return masters, nil
return controlPlanes, nil
}
func trimCommonPrefix(names []string) []string {
@ -1358,7 +1358,7 @@ func setupAPI(opt *NewClusterOptions, cluster *api.Cluster) error {
cluster.Spec.API.LoadBalancer = &api.LoadBalancerAccessSpec{}
default:
return fmt.Errorf("unknown master topology type: %q", cluster.Spec.Topology.ControlPlane)
return fmt.Errorf("unknown control-plane topology type: %q", cluster.Spec.Topology.ControlPlane)
}
}
@ -1421,7 +1421,7 @@ func initializeOpenstackAPI(opt *NewClusterOptions, cluster *api.Cluster) {
}
}
func createEtcdCluster(etcdCluster string, masters []*api.InstanceGroup, encryptEtcdStorage bool, etcdStorageType string) api.EtcdClusterSpec {
func createEtcdCluster(etcdCluster string, controlPlanes []*api.InstanceGroup, encryptEtcdStorage bool, etcdStorageType string) api.EtcdClusterSpec {
etcd := api.EtcdClusterSpec{}
etcd.Name = etcdCluster
@ -1440,17 +1440,18 @@ func createEtcdCluster(etcdCluster string, masters []*api.InstanceGroup, encrypt
etcd.MemoryRequest = &memoryRequest
var names []string
for _, ig := range masters {
for _, ig := range controlPlanes {
name := ig.ObjectMeta.Name
// We expect the IG to have a `master-` prefix, but this is both superfluous
// We expect the IG to have a `control-plane-` or `master-` prefix, but this is both superfluous
// and not how we named things previously
name = strings.TrimPrefix(name, "control-plane-")
name = strings.TrimPrefix(name, "master-")
names = append(names, name)
}
names = trimCommonPrefix(names)
for i, ig := range masters {
for i, ig := range controlPlanes {
m := api.EtcdMemberSpec{}
if encryptEtcdStorage {
m.EncryptedVolume = &encryptEtcdStorage