Skip to content

Commit e794dc3

Browse files
authored
[kubectl-plugin] remove CPU limits by default (#3243)
Signed-off-by: Andrew Sy Kim <[email protected]>
1 parent d97e37a commit e794dc3

File tree

2 files changed

+46
-21
lines changed

2 files changed

+46
-21
lines changed

kubectl-plugin/pkg/util/generation/generation.go

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,8 @@ func (rayJobObject *RayJobYamlObject) GenerateRayJobApplyConfig() *rayv1ac.RayJo
6969
return rayJobApplyConfig
7070
}
7171

72-
// generateResources returns a corev1.ResourceList with the given CPU, memory, ephemeral storage, and GPU values for both requests and limits
73-
func generateResources(cpu, memory, ephemeralStorage, gpu string) corev1.ResourceList {
72+
// generateRequestResources returns a corev1.ResourceList with the given CPU, memory, ephemeral storage, and GPU values for only resource requests
73+
func generateRequestResources(cpu, memory, ephemeralStorage, gpu string) corev1.ResourceList {
7474
resources := corev1.ResourceList{
7575
corev1.ResourceCPU: resource.MustParse(cpu),
7676
corev1.ResourceMemory: resource.MustParse(memory),
@@ -87,6 +87,23 @@ func generateResources(cpu, memory, ephemeralStorage, gpu string) corev1.Resourc
8787
return resources
8888
}
8989

90+
// generateLimitResources returns a corev1.ResourceList with the given memory, ephemeral storage, and GPU values for only resource limits
91+
func generateLimitResources(memory, ephemeralStorage, gpu string) corev1.ResourceList {
92+
resources := corev1.ResourceList{
93+
corev1.ResourceMemory: resource.MustParse(memory),
94+
}
95+
if ephemeralStorage != "" {
96+
resources[corev1.ResourceEphemeralStorage] = resource.MustParse(ephemeralStorage)
97+
}
98+
99+
gpuResource := resource.MustParse(gpu)
100+
if !gpuResource.IsZero() {
101+
resources[corev1.ResourceName(util.ResourceNvidiaGPU)] = gpuResource
102+
}
103+
104+
return resources
105+
}
106+
90107
func (rayClusterSpecObject *RayClusterSpecObject) generateRayClusterSpec() *rayv1ac.RayClusterSpecApplyConfiguration {
91108
// TODO: Look for better workaround/fixes for RayStartParams. Currently using `WithRayStartParams()` requires
92109
// a non-empty map with valid key value pairs and will not populate the field with empty/nil values. This
@@ -100,8 +117,10 @@ func (rayClusterSpecObject *RayClusterSpecObject) generateRayClusterSpec() *rayv
100117
maps.Copy(headRayStartParams, rayClusterSpecObject.HeadRayStartParams)
101118
maps.Copy(workerRayStartParams, rayClusterSpecObject.WorkerRayStartParams)
102119

103-
headResources := generateResources(rayClusterSpecObject.HeadCPU, rayClusterSpecObject.HeadMemory, rayClusterSpecObject.HeadEphemeralStorage, rayClusterSpecObject.HeadGPU)
104-
workerResources := generateResources(rayClusterSpecObject.WorkerCPU, rayClusterSpecObject.WorkerMemory, rayClusterSpecObject.WorkerEphemeralStorage, rayClusterSpecObject.WorkerGPU)
120+
headRequestResources := generateRequestResources(rayClusterSpecObject.HeadCPU, rayClusterSpecObject.HeadMemory, rayClusterSpecObject.HeadEphemeralStorage, rayClusterSpecObject.HeadGPU)
121+
headLimitResources := generateLimitResources(rayClusterSpecObject.HeadMemory, rayClusterSpecObject.HeadEphemeralStorage, rayClusterSpecObject.HeadGPU)
122+
workerRequestResources := generateRequestResources(rayClusterSpecObject.WorkerCPU, rayClusterSpecObject.WorkerMemory, rayClusterSpecObject.WorkerEphemeralStorage, rayClusterSpecObject.WorkerGPU)
123+
workerLimitResources := generateLimitResources(rayClusterSpecObject.WorkerMemory, rayClusterSpecObject.WorkerEphemeralStorage, rayClusterSpecObject.WorkerGPU)
105124

106125
rayClusterSpec := rayv1ac.RayClusterSpec().
107126
WithRayVersion(rayClusterSpecObject.RayVersion).
@@ -114,8 +133,8 @@ func (rayClusterSpecObject *RayClusterSpecObject) generateRayClusterSpec() *rayv
114133
WithName("ray-head").
115134
WithImage(rayClusterSpecObject.Image).
116135
WithResources(corev1ac.ResourceRequirements().
117-
WithRequests(headResources).
118-
WithLimits(headResources)).
136+
WithRequests(headRequestResources).
137+
WithLimits(headLimitResources)).
119138
WithPorts(corev1ac.ContainerPort().WithContainerPort(6379).WithName("gcs-server"),
120139
corev1ac.ContainerPort().WithContainerPort(8265).WithName("dashboard"),
121140
corev1ac.ContainerPort().WithContainerPort(10001).WithName("client")))))).
@@ -130,8 +149,8 @@ func (rayClusterSpecObject *RayClusterSpecObject) generateRayClusterSpec() *rayv
130149
WithName("ray-worker").
131150
WithImage(rayClusterSpecObject.Image).
132151
WithResources(corev1ac.ResourceRequirements().
133-
WithRequests(workerResources).
134-
WithLimits(workerResources))))))
152+
WithRequests(workerRequestResources).
153+
WithLimits(workerLimitResources))))))
135154

136155
return rayClusterSpec
137156
}

kubectl-plugin/pkg/util/generation/generation_test.go

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,6 @@ spec:
171171
name: client
172172
resources:
173173
limits:
174-
cpu: "1"
175174
memory: 5Gi
176175
nvidia.com/gpu: "1"
177176
requests:
@@ -191,7 +190,6 @@ spec:
191190
name: ray-worker
192191
resources:
193192
limits:
194-
cpu: "2"
195193
memory: 10Gi
196194
requests:
197195
cpu: "2"
@@ -202,42 +200,52 @@ spec:
202200

203201
func TestGenerateResources(t *testing.T) {
204202
tests := []struct {
205-
expectedResources corev1.ResourceList
206-
name string
207-
cpu string
208-
memory string
209-
ephemeralStorage string
210-
gpu string
203+
expectedRequestResources corev1.ResourceList
204+
expectedLimitResources corev1.ResourceList
205+
name string
206+
cpu string
207+
memory string
208+
ephemeralStorage string
209+
gpu string
211210
}{
212211
{
213212
name: "should generate resources with CPU, memory, ephemeral storage, and GPU",
214213
cpu: "1",
215214
memory: "5Gi",
216215
ephemeralStorage: "10Gi",
217216
gpu: "1",
218-
expectedResources: corev1.ResourceList{
217+
expectedRequestResources: corev1.ResourceList{
219218
corev1.ResourceCPU: resource.MustParse("1"),
220219
corev1.ResourceMemory: resource.MustParse("5Gi"),
221220
corev1.ResourceEphemeralStorage: resource.MustParse("10Gi"),
222221
corev1.ResourceName(util.ResourceNvidiaGPU): resource.MustParse("1"),
223222
},
223+
expectedLimitResources: corev1.ResourceList{
224+
corev1.ResourceMemory: resource.MustParse("5Gi"),
225+
corev1.ResourceEphemeralStorage: resource.MustParse("10Gi"),
226+
corev1.ResourceName(util.ResourceNvidiaGPU): resource.MustParse("1"),
227+
},
224228
},
225229
{
226230
name: "should only generate resources with CPU and memory if ephemeral storage isn't set and GPUs are 0",
227231
cpu: "1",
228232
memory: "5Gi",
229233
ephemeralStorage: "",
230234
gpu: "0",
231-
expectedResources: corev1.ResourceList{
235+
expectedRequestResources: corev1.ResourceList{
232236
corev1.ResourceCPU: resource.MustParse("1"),
233237
corev1.ResourceMemory: resource.MustParse("5Gi"),
234238
},
239+
expectedLimitResources: corev1.ResourceList{
240+
corev1.ResourceMemory: resource.MustParse("5Gi"),
241+
},
235242
},
236243
}
237244

238245
for _, test := range tests {
239246
t.Run(test.name, func(t *testing.T) {
240-
assert.Equal(t, test.expectedResources, generateResources(test.cpu, test.memory, test.ephemeralStorage, test.gpu))
247+
assert.Equal(t, test.expectedRequestResources, generateRequestResources(test.cpu, test.memory, test.ephemeralStorage, test.gpu))
248+
assert.Equal(t, test.expectedLimitResources, generateLimitResources(test.memory, test.ephemeralStorage, test.gpu))
241249
})
242250
}
243251
}
@@ -285,7 +293,6 @@ func TestGenerateRayClusterSpec(t *testing.T) {
285293
corev1.ResourceName(util.ResourceNvidiaGPU): resource.MustParse("1"),
286294
},
287295
Limits: &corev1.ResourceList{
288-
corev1.ResourceCPU: resource.MustParse("1"),
289296
corev1.ResourceMemory: resource.MustParse("5Gi"),
290297
corev1.ResourceEphemeralStorage: resource.MustParse("10Gi"),
291298
corev1.ResourceName(util.ResourceNvidiaGPU): resource.MustParse("1"),
@@ -331,7 +338,6 @@ func TestGenerateRayClusterSpec(t *testing.T) {
331338
corev1.ResourceMemory: resource.MustParse("10Gi"),
332339
},
333340
Limits: &corev1.ResourceList{
334-
corev1.ResourceCPU: resource.MustParse("2"),
335341
corev1.ResourceMemory: resource.MustParse("10Gi"),
336342
},
337343
},

0 commit comments

Comments
 (0)