in internal/deployers/eksapi/node.go [298:345]
func (m *nodeManager) createManagedNodegroup(infra *Infrastructure, cluster *Cluster, opts *deployerOptions) error {
klog.Infof("creating nodegroup...")
input := eks.CreateNodegroupInput{
ClusterName: aws.String(m.resourceID),
NodegroupName: aws.String(m.resourceID),
NodeRole: aws.String(infra.nodeRoleARN),
Subnets: infra.subnets(),
DiskSize: aws.Int32(100),
CapacityType: ekstypes.CapacityTypesOnDemand,
ScalingConfig: &ekstypes.NodegroupScalingConfig{
MinSize: aws.Int32(int32(opts.Nodes)),
MaxSize: aws.Int32(int32(opts.Nodes)),
DesiredSize: aws.Int32(int32(opts.Nodes)),
},
AmiType: ekstypes.AMITypes(opts.AMIType),
InstanceTypes: opts.InstanceTypes,
}
out, err := m.clients.EKS().CreateNodegroup(context.TODO(), &input)
if err != nil {
return err
}
klog.Infof("waiting for nodegroup to be active: %s", *out.Nodegroup.NodegroupArn)
err = eks.NewNodegroupActiveWaiter(m.clients.EKS()).
Wait(context.TODO(), &eks.DescribeNodegroupInput{
ClusterName: input.ClusterName,
NodegroupName: input.NodegroupName,
}, opts.NodeCreationTimeout)
if err != nil {
return err
}
klog.Infof("nodegroup is active: %s", *out.Nodegroup.NodegroupArn)
if opts.ExpectedAMI != "" {
out, err := m.clients.EKS().DescribeNodegroup(context.TODO(), &eks.DescribeNodegroupInput{
ClusterName: input.ClusterName,
NodegroupName: input.NodegroupName,
})
if err != nil {
return err
}
asgName := out.Nodegroup.Resources.AutoScalingGroups[0].Name
if ok, err := m.verifyASGAMI(*asgName, opts.ExpectedAMI); err != nil {
return err
} else if !ok {
return fmt.Errorf("ASG %s is not using expected AMI: %s", *asgName, opts.ExpectedAMI)
}
}
return nil
}