Skip to content

Commit a0b6ab3

Browse files
committed
chore(vm): memory limits on Pod for namespaces with quotas
- Calculate discount quota from Pod limits. - Update 3p-kubevirt to fix regressions: 1) Set proper memory limits when namespace has quotas. 2) Add 60Mi extra to memory limits when cores fraction is specified. Signed-off-by: Ivan Mikheykin <ivan.mikheykin@flant.com>
1 parent 8855371 commit a0b6ab3

3 files changed

Lines changed: 79 additions & 9 deletions

File tree

build/components/versions.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ firmware:
33
libvirt: v10.9.0
44
edk2: stable202411
55
core:
6-
3p-kubevirt: v1.6.2-v12n.27
6+
3p-kubevirt: v1.6.2-v12n.28
77
3p-containerized-data-importer: v1.60.3-v12n.18
88
distribution: 2.8.3
99
package:

images/virtualization-artifact/pkg/controller/vm/internal/statistic.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,9 +160,10 @@ func (h *StatisticHandler) syncResources(changed *v1alpha2.VirtualMachine,
160160
}
161161

162162
memoryKVVMIRequest := kvvmi.Spec.Domain.Resources.Requests[corev1.ResourceMemory]
163-
memoryPodRequest := ctr.Resources.Requests[corev1.ResourceMemory]
163+
// Kubevirt makes memory limits equal or slightly greater than requests. See https://github.com/deckhouse/virtualization/pull/1947
164+
memoryPodLimit := ctr.Resources.Limits[corev1.ResourceMemory]
164165

165-
memoryOverhead := memoryPodRequest.DeepCopy()
166+
memoryOverhead := memoryPodLimit.DeepCopy()
166167
memoryOverhead.Sub(memoryKVVMIRequest)
167168
mi := int64(1024 * 1024)
168169
memoryOverhead = *resource.NewQuantity(int64(math.Ceil(float64(memoryOverhead.Value())/float64(mi)))*mi, resource.BinarySI)

images/virtualization-artifact/pkg/controller/vm/internal/statistic_test.go

Lines changed: 75 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -88,10 +88,11 @@ var _ = Describe("TestStatisticHandler", func() {
8888

8989
// Generate KVVMI with "dynamic cores" specifics: cores and sockets are intentionally
9090
// swapped to bypass kvvm validations.
91-
newKVVMIHotplug := func(cores, sockets, maxCores int, cpuFraction, memory, maxMemory string) *virtv1.VirtualMachineInstance {
91+
newKVVMIHotplug := func(cores, sockets, maxCores int, cpuFraction, memory string) *virtv1.VirtualMachineInstance {
9292
kvvmi := newEmptyKVVMI(vmName, vmNamespace)
9393
memoryGuest := resource.MustParse(memory)
94-
memoryMaxGuest := resource.MustParse(maxMemory)
94+
95+
memoryMaxGuest := resource.NewQuantity(kvbuilder.MaxMemorySizeForHotplug, resource.BinarySI)
9596

9697
kvvmi.SetAnnotations(map[string]string{
9798
kvbuilder.CPUResourcesRequestsFractionAnnotation: cpuFraction,
@@ -107,7 +108,7 @@ var _ = Describe("TestStatisticHandler", func() {
107108
},
108109
Memory: &virtv1.Memory{
109110
Guest: &memoryGuest,
110-
MaxGuest: &memoryMaxGuest,
111+
MaxGuest: memoryMaxGuest,
111112
},
112113
Resources: virtv1.ResourceRequirements{
113114
Requests: corev1.ResourceList{
@@ -261,7 +262,7 @@ var _ = Describe("TestStatisticHandler", func() {
261262
),
262263
Entry("Hotplug enabled: 8 cores, 100% fraction, 2 Gi",
263264
newVM(8, ptr.To("100%"), "2Gi"),
264-
newKVVMIHotplug(8, 1, 16, "100", "2Gi", "256Gi"),
265+
newKVVMIHotplug(8, 1, 16, "100", "2Gi"),
265266
newPod("8", "8", "2Gi", "2Gi"),
266267
expectedValues{
267268
CPUCores: 8,
@@ -278,7 +279,7 @@ var _ = Describe("TestStatisticHandler", func() {
278279
),
279280
Entry("Hotplug enabled: 8 cores, 25% fraction, 2 Gi",
280281
newVM(8, ptr.To("25%"), "2Gi"),
281-
newKVVMIHotplug(8, 1, 16, "25", "2Gi", "256Gi"),
282+
newKVVMIHotplug(8, 1, 16, "25", "2Gi"),
282283
newPod("2", "8", "2Gi", "2Gi"),
283284
expectedValues{
284285
CPUCores: 8,
@@ -295,7 +296,7 @@ var _ = Describe("TestStatisticHandler", func() {
295296
),
296297
Entry("Hotplug enabled: 1 core, 25% fraction, 2 Gi",
297298
newVM(1, ptr.To("25%"), "2Gi"),
298-
newKVVMIHotplug(1, 1, 16, "25", "2Gi", "256Gi"),
299+
newKVVMIHotplug(1, 1, 16, "25", "2Gi"),
299300
newPod("250m", "1", "2Gi", "2Gi"),
300301
expectedValues{
301302
CPUCores: 1,
@@ -310,6 +311,74 @@ var _ = Describe("TestStatisticHandler", func() {
310311
MemoryRuntimeOverhead: 0,
311312
},
312313
),
314+
Entry("Hotplug enabled: 24 cores, 25% fraction, 2 Gi",
315+
newVM(1, ptr.To("25%"), "2Gi"),
316+
newKVVMIHotplug(12, 2, 16, "25", "2Gi"),
317+
newPod("6", "24", "2Gi", "2Gi"),
318+
expectedValues{
319+
CPUCores: 24,
320+
CPUCoreFraction: "25%",
321+
CPURequestedCores: 6000,
322+
CPURuntimeOverhead: 0,
323+
324+
TopologyCoresPerSocket: 12,
325+
TopologySockets: 2,
326+
327+
MemorySize: 2147483648,
328+
MemoryRuntimeOverhead: 0,
329+
},
330+
),
331+
Entry("Hotplug enabled: max cores, 24 cores, 50% fraction, 2 Gi",
332+
newVM(1, ptr.To("50%"), "2Gi"),
333+
newKVVMIHotplug(32, 8, 32, "50", "2Gi"),
334+
newPod("6", "24", "2Gi", "2Gi"),
335+
expectedValues{
336+
CPUCores: 256,
337+
CPUCoreFraction: "50%",
338+
CPURequestedCores: 128000,
339+
CPURuntimeOverhead: 0,
340+
341+
TopologyCoresPerSocket: 32,
342+
TopologySockets: 8,
343+
344+
MemorySize: 2147483648,
345+
MemoryRuntimeOverhead: 0,
346+
},
347+
),
348+
Entry("Memory overhead for Pod with equal limits and requests",
349+
newVM(1, ptr.To("25%"), "2Gi"),
350+
newKVVMIHotplug(1, 1, 16, "25", "3Gi"),
351+
newPod("250m", "1", "4Gi", "4Gi"),
352+
expectedValues{
353+
CPUCores: 1,
354+
CPUCoreFraction: "25%",
355+
CPURequestedCores: 250,
356+
CPURuntimeOverhead: 0,
357+
358+
TopologyCoresPerSocket: 1,
359+
TopologySockets: 1,
360+
361+
MemorySize: 3 * 1024 * 1024 * 1024,
362+
MemoryRuntimeOverhead: 1024 * 1024 * 1024,
363+
},
364+
),
365+
Entry("Memory overhead for Pod with limits greater than requests",
366+
newVM(1, ptr.To("25%"), "2Gi"),
367+
newKVVMIHotplug(1, 1, 16, "25", "3Gi"),
368+
newPod("250m", "1", "4Gi", "4156Mi"), // Overhead is 1Gi+60Mi
369+
expectedValues{
370+
CPUCores: 1,
371+
CPUCoreFraction: "25%",
372+
CPURequestedCores: 250,
373+
CPURuntimeOverhead: 0,
374+
375+
TopologyCoresPerSocket: 1,
376+
TopologySockets: 1,
377+
378+
MemorySize: 3 * 1024 * 1024 * 1024,
379+
MemoryRuntimeOverhead: 1024*1024*1024 + 60*1024*1024,
380+
},
381+
),
313382
)
314383
})
315384

0 commit comments

Comments
 (0)