Skip to content

Commit 69a0b95

Browse files
authored
increase ephemeral storage on the auto mode test nodes (#682)
Some of the K8s conformance tests need more storage. This is currently satisifed by launching instances with local storage, but that requires new instances to be launched. We can just add more storage to the nodes to avoid that.
1 parent f06b9db commit 69a0b95

File tree

2 files changed

+56
-2
lines changed

2 files changed

+56
-2
lines changed

internal/deployers/eksapi/k8s.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1616
"k8s.io/apimachinery/pkg/util/sets"
1717
"k8s.io/apimachinery/pkg/watch"
18+
"k8s.io/client-go/dynamic"
1819
"k8s.io/client-go/kubernetes"
1920
"k8s.io/client-go/rest"
2021
"k8s.io/client-go/tools/clientcmd"
@@ -35,6 +36,7 @@ type k8sClient struct {
3536
config *rest.Config
3637
clientset kubernetes.Interface
3738
client client.Client
39+
dclient *dynamic.DynamicClient
3840
}
3941

4042
func newK8sClient(kubeconfigPath string) (*k8sClient, error) {
@@ -46,6 +48,7 @@ func newK8sClient(kubeconfigPath string) (*k8sClient, error) {
4648
config: config,
4749
clientset: kubernetes.NewForConfigOrDie(config),
4850
client: util.Must(client.New(config, client.Options{})),
51+
dclient: util.Must(dynamic.NewForConfig(config)),
4952
}, nil
5053
}
5154

internal/deployers/eksapi/node.go

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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"
@@ -62,6 +63,7 @@ var (
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

6769
type 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+
153188
func (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+
212260
func (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

Comments
 (0)