@@ -22,6 +22,7 @@ import (
2222 appsv1 "k8s.io/api/apps/v1"
2323 corev1 "k8s.io/api/core/v1"
2424 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
25+ "k8s.io/apimachinery/pkg/runtime/schema"
2526 "k8s.io/klog/v2"
2627 "k8s.io/utils/pointer"
2728 karpv1 "sigs.k8s.io/karpenter/pkg/apis/v1"
6263 ekstypes .AMITypesAl2023X8664Standard : defaultInstanceTypes_x86_64 ,
6364 ekstypes .AMITypesAl2023Arm64Standard : defaultInstanceTypes_arm64 ,
6465 }
66+ nodeClassResource = schema.GroupVersionResource {Group : "eks.amazonaws.com" , Version : "v1" , Resource : "nodeclasses" }
6567)
6668
6769type nodeManager struct {
@@ -81,6 +83,9 @@ func (m *nodeManager) createNodes(infra *Infrastructure, cluster *Cluster, opts
8183 return fmt .Errorf ("failed to resolve instance types: %v" , err )
8284 }
8385 if opts .AutoMode {
86+ if err := m .createNodeClass (opts , k8sClient ); err != nil {
87+ return err
88+ }
8489 if err := m .createNodePool (opts , k8sClient ); err != nil {
8590 return err
8691 }
@@ -150,6 +155,36 @@ func (m *nodeManager) resolveInstanceTypes(opts *deployerOptions) (err error) {
150155 return nil
151156}
152157
158+ func (m * nodeManager ) createNodeClass (opts * deployerOptions , k8sClient * k8sClient ) error {
159+ nodeclass , err := k8sClient .dclient .Resource (nodeClassResource ).Get (context .Background (), "default" , metav1.GetOptions {})
160+ if err != nil {
161+ return fmt .Errorf ("getting default nodeclass, %w" , err )
162+ }
163+ klog .Infof ("got existing default nodeclass for template.." )
164+
165+ // clear out the metadata and set the name only
166+ nodeclass .Object ["metadata" ] = map [string ]interface {}{}
167+ nodeclass .SetName (m .resourceID )
168+
169+ // clear out the status
170+ delete (nodeclass .Object , "status" )
171+
172+ // update the ephemeral storage spec to be 500Gi
173+ if spec , ok := nodeclass .Object ["spec" ].(map [string ]interface {}); ok {
174+ if ephemeralStorage , ok := spec ["ephemeralStorage" ].(map [string ]interface {}); ok {
175+ ephemeralStorage ["size" ] = "500Gi"
176+ }
177+ }
178+
179+ klog .Infof ("creating new node class..." )
180+ _ , err = k8sClient .dclient .Resource (nodeClassResource ).Create (context .Background (), nodeclass , metav1.CreateOptions {})
181+ if err != nil {
182+ return fmt .Errorf ("creating new nodeclass, %w" , err )
183+ }
184+ klog .Infof ("node class created!" )
185+ return nil
186+ }
187+
153188func (m * nodeManager ) createNodePool (opts * deployerOptions , k8sClient * k8sClient ) error {
154189 nodePool := karpv1.NodePool {
155190 ObjectMeta : metav1.ObjectMeta {
@@ -172,7 +207,7 @@ func (m *nodeManager) createNodePool(opts *deployerOptions, k8sClient *k8sClient
172207 NodeClassRef : & karpv1.NodeClassReference {
173208 Group : "eks.amazonaws.com" ,
174209 Kind : "NodeClass" ,
175- Name : "default" ,
210+ Name : m . resourceID ,
176211 },
177212 Requirements : []karpv1.NodeSelectorRequirementWithMinValues {
178213 {
@@ -209,6 +244,19 @@ func (m *nodeManager) createNodePool(opts *deployerOptions, k8sClient *k8sClient
209244 return nil
210245}
211246
247+ func (m * nodeManager ) deleteNodeClass (k8sClient * k8sClient ) error {
248+ klog .Infof ("deleting node class..." )
249+ if err := k8sClient .dclient .Resource (nodeClassResource ).Delete (context .Background (), m .resourceID , metav1.DeleteOptions {}); err != nil {
250+ if apierrors .IsNotFound (err ) {
251+ klog .Infof ("node class does not exist: %s" , m .resourceID )
252+ return nil
253+ }
254+ return fmt .Errorf ("failed to delete node class, %w" , err )
255+ }
256+ klog .Infof ("deleted node class!" )
257+ return nil
258+ }
259+
212260func (m * nodeManager ) deleteNodePool (k8sClient * k8sClient ) error {
213261 nodePool := karpv1.NodePool {
214262 ObjectMeta : metav1.ObjectMeta {
@@ -221,7 +269,7 @@ func (m *nodeManager) deleteNodePool(k8sClient *k8sClient) error {
221269 klog .Infof ("node pool does not exist: %s" , m .resourceID )
222270 return nil
223271 }
224- return fmt .Errorf ("failed to delete node pool: %v " , err )
272+ return fmt .Errorf ("failed to delete node pool: %w " , err )
225273 }
226274 klog .Infof ("deleted node pool!" )
227275 return nil
@@ -485,6 +533,9 @@ func (m *nodeManager) deleteNodes(k8sClient *k8sClient, opts *deployerOptions) e
485533 if err := m .deletePlaceholderDeployment (k8sClient ); err != nil {
486534 return err
487535 }
536+ if err := m .deleteNodeClass (k8sClient ); err != nil {
537+ return err
538+ }
488539 if err := m .deleteNodePool (k8sClient ); err != nil {
489540 return err
490541 }
0 commit comments