Spot instances¶
Managed Nodegroups¶
eksctl
supports Spot worker nodes using EKS Managed Nodegroups, a feature that allows EKS customers with fault-tolerant applications to easily provision and manage EC2 Spot Instances for their EKS clusters. EKS Managed Nodegroup will configure and launch an EC2 Autoscaling group of Spot Instances following Spot best practices and draining Spot worker nodes automatically before the instances are interrupted by AWS. There is no incremental charge to use this feature and customers pay only for using the AWS resources, such as EC2 Spot Instances and EBS volumes.
To create a cluster with a managed nodegroup using Spot instances, pass the --spot
flag and an optional list of instance types:
$ eksctl create cluster --spot --instance-types=c3.large,c4.large,c5.large
To create a managed nodegroup using Spot instances on an existing cluster:
$ eksctl create nodegroup --cluster=<clusterName> --spot --instance-types=c3.large,c4.large,c5.large
To create Spot instances using managed nodegroups via a config file:
# spot-cluster.yaml
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: spot-cluster
region: us-west-2
managedNodeGroups:
- name: spot
instanceTypes: ["c3.large","c4.large","c5.large","c5d.large","c5n.large","c5a.large"]
spot: true
# `instanceTypes` defaults to [`m5.large`]
- name: spot-2
spot: true
# On-Demand instances
- name: on-demand
instanceTypes: ["c3.large", "c4.large", "c5.large"]
$ eksctl create cluster -f spot-cluster.yaml
Note
Unmanaged nodegroups do not support the spot
and instanceTypes
fields, instead the instancesDistribution
field is used to configure Spot instances. See below
Further information¶
Unmanaged Nodegroups¶
eksctl
has support for spot instances through the MixedInstancesPolicy for Auto Scaling Groups.
Here is an example of a nodegroup that uses 50% spot instances and 50% on demand instances:
nodeGroups:
- name: ng-1
minSize: 2
maxSize: 5
instancesDistribution:
maxPrice: 0.017
instanceTypes: ["t3.small", "t3.medium"] # At least one instance type should be specified
onDemandBaseCapacity: 0
onDemandPercentageAboveBaseCapacity: 50
spotInstancePools: 2
Note that the nodeGroups.X.instanceType
field shouldn't be set when using the instancesDistribution
field.
This example uses GPU instances:
nodeGroups:
- name: ng-gpu
instanceType: mixed
desiredCapacity: 1
instancesDistribution:
instanceTypes:
- p2.xlarge
- p2.8xlarge
- p2.16xlarge
maxPrice: 0.50
This example uses the capacity-optimized spot allocation strategy:
nodeGroups:
- name: ng-capacity-optimized
minSize: 2
maxSize: 5
instancesDistribution:
maxPrice: 0.017
instanceTypes: ["t3.small", "t3.medium"] # At least one instance type should be specified
onDemandBaseCapacity: 0
onDemandPercentageAboveBaseCapacity: 50
spotAllocationStrategy: "capacity-optimized"
This example uses the capacity-optimized-prioritized spot allocation strategy:
nodeGroups:
- name: ng-capacity-optimized-prioritized
minSize: 2
maxSize: 5
instancesDistribution:
maxPrice: 0.017
instanceTypes: ["t3a.small", "t3.small"] # At least two instance types should be specified
onDemandBaseCapacity: 0
onDemandPercentageAboveBaseCapacity: 0
spotAllocationStrategy: "capacity-optimized-prioritized"
Note that the spotInstancePools
field shouldn't be set when using the spotAllocationStrategy
field. If the spotAllocationStrategy
is not specified, EC2 will default to use the lowest-price
strategy.
Here is a minimal example:
nodeGroups:
- name: ng-1
instancesDistribution:
instanceTypes: ["t3.small", "t3.medium"] # At least one instance type should be specified
To distinguish nodes between spot or on-demand instances you can use the kubernetes label node-lifecycle
which will have the value spot
or on-demand
depending on its type.
Parameters in instancesDistribution¶
Please see the config parameters for details.