From e1d018809dbeb3105d6c2d9321b48218533d1753 Mon Sep 17 00:00:00 2001 From: Abhinav Dahiya Date: Fri, 19 Oct 2018 15:18:27 -0700 Subject: [PATCH] manifests: stripe workers across machinesets in each AZ for aws. --- pkg/asset/machines/aws/worker.go | 125 ++++++++++++++++++------------- pkg/asset/machines/worker.go | 16 +++- 2 files changed, 85 insertions(+), 56 deletions(-) diff --git a/pkg/asset/machines/aws/worker.go b/pkg/asset/machines/aws/worker.go index 5d398a954b..eb751906f9 100644 --- a/pkg/asset/machines/aws/worker.go +++ b/pkg/asset/machines/aws/worker.go @@ -7,12 +7,19 @@ import ( "github.com/openshift/installer/pkg/types" ) -// WorkerConfig is used to generate the worker machineset. +// WorkerConfig is used to generate the worker machinesets. type WorkerConfig struct { - Replicas int64 + Instances []WorkerMachinesetInstance MachineConfig } +// WorkerMachinesetInstance constains information specific to +// one worker machineset. +type WorkerMachinesetInstance struct { + Replicas int64 + AvailabilityZone string +} + // MachineConfig contains fields common to worker and master // machine configurations type MachineConfig struct { @@ -23,60 +30,70 @@ type MachineConfig struct { Machine types.AWSMachinePoolPlatform } -// WorkerMachineSetTmpl is template for worker machineset. -var WorkerMachineSetTmpl = template.Must(template.New("aws-worker-machineset").Parse(` -apiVersion: cluster.k8s.io/v1alpha1 -kind: MachineSet +// WorkerMachineSetsTmpl is template for worker machinesets. +var WorkerMachineSetsTmpl = template.Must(template.New("aws-worker-machinesets").Parse(` +{{- $c := . -}} +kind: List +apiVersion: v1 metadata: - name: {{.ClusterName}}-worker-0 - namespace: openshift-cluster-api - labels: - sigs.k8s.io/cluster-api-cluster: {{.ClusterName}} - sigs.k8s.io/cluster-api-machine-role: worker - sigs.k8s.io/cluster-api-machine-type: worker -spec: - replicas: {{.Replicas}} - selector: - matchLabels: - sigs.k8s.io/cluster-api-machineset: worker - sigs.k8s.io/cluster-api-cluster: {{.ClusterName}} - template: - metadata: - labels: + resourceVersion: "" + selfLink: "" +items: +{{- range $index,$instance := $c.Instances}} +- apiVersion: cluster.k8s.io/v1alpha1 + kind: MachineSet + metadata: + name: {{$c.ClusterName}}-worker-{{$index}} + namespace: openshift-cluster-api + labels: + sigs.k8s.io/cluster-api-cluster: {{$c.ClusterName}} + sigs.k8s.io/cluster-api-machine-role: worker + sigs.k8s.io/cluster-api-machine-type: worker + spec: + replicas: {{$instance.Replicas}} + selector: + matchLabels: sigs.k8s.io/cluster-api-machineset: worker - sigs.k8s.io/cluster-api-cluster: {{.ClusterName}} - sigs.k8s.io/cluster-api-machine-role: worker - sigs.k8s.io/cluster-api-machine-type: worker - spec: - providerConfig: - value: - apiVersion: aws.cluster.k8s.io/v1alpha1 - kind: AWSMachineProviderConfig - ami: - id: {{.AMIID}} - instanceType: {{.Machine.InstanceType}} - placement: - region: {{.Region}} - subnet: - filters: - - name: "tag:Name" - values: - - "{{.ClusterName}}-worker-*" - iamInstanceProfile: - id: "{{.ClusterName}}-worker-profile" - tags: -{{- range $key,$value := .Tags}} - - name: "{{$key}}" - value: "{{$value}}" -{{- end}} - securityGroups: - - filters: + sigs.k8s.io/cluster-api-cluster: {{$c.ClusterName}} + template: + metadata: + labels: + sigs.k8s.io/cluster-api-machineset: worker + sigs.k8s.io/cluster-api-cluster: {{$c.ClusterName}} + sigs.k8s.io/cluster-api-machine-role: worker + sigs.k8s.io/cluster-api-machine-type: worker + spec: + providerConfig: + value: + apiVersion: aws.cluster.k8s.io/v1alpha1 + kind: AWSMachineProviderConfig + ami: + id: {{$c.AMIID}} + instanceType: {{$c.Machine.InstanceType}} + placement: + region: {{$c.Region}} + availabilityZone: {{$instance.AvailabilityZone}} + subnet: + filters: - name: "tag:Name" values: - - "{{.ClusterName}}_worker_sg" - userDataSecret: - name: worker-user-data - versions: - kubelet: "" - controlPlane: "" + - "{{$c.ClusterName}}-worker-{{$instance.AvailabilityZone}}" + iamInstanceProfile: + id: "{{$c.ClusterName}}-worker-profile" + tags: + {{- range $key,$value := $c.Tags}} + - name: "{{$key}}" + value: "{{$value}}" + {{- end}} + securityGroups: + - filters: + - name: "tag:Name" + values: + - "{{$c.ClusterName}}_worker_sg" + userDataSecret: + name: worker-user-data + versions: + kubelet: "" + controlPlane: "" +{{- end}} `)) diff --git a/pkg/asset/machines/worker.go b/pkg/asset/machines/worker.go index 8024d69d77..ec3193049c 100644 --- a/pkg/asset/machines/worker.go +++ b/pkg/asset/machines/worker.go @@ -77,7 +77,6 @@ func (w *Worker) Generate(dependencies asset.Parents) error { case "aws": config := aws.WorkerConfig{} config.ClusterName = ic.ObjectMeta.Name - config.Replicas = numOfWorkers config.Region = ic.Platform.AWS.Region config.Machine = defaultAWSMachinePoolPlatform() @@ -102,7 +101,20 @@ func (w *Worker) Generate(dependencies asset.Parents) error { } config.AMIID = ami - w.MachineSetRaw = applyTemplateData(aws.WorkerMachineSetTmpl, config) + azs, err := aws.AvailabilityZones(config.Region) + if err != nil { + return errors.Wrap(err, "failed to fetch availability zones") + } + numOfAZs := int64(len(azs)) + for idx, az := range azs { + replicas := numOfWorkers / numOfAZs + if int64(idx) < numOfWorkers%numOfAZs { + replicas++ + } + config.Instances = append(config.Instances, aws.WorkerMachinesetInstance{Replicas: replicas, AvailabilityZone: az}) + } + + w.MachineSetRaw = applyTemplateData(aws.WorkerMachineSetsTmpl, config) case "libvirt": config := libvirt.Config{ ClusterName: ic.ObjectMeta.Name,