Skip to content

Commit 25cf2a2

Browse files
committed
Allow adding limits
1 parent caedccf commit 25cf2a2

File tree

3 files changed

+71
-11
lines changed

3 files changed

+71
-11
lines changed

Diff for: pkg/kubelet/kubelet_pods.go

+16-4
Original file line numberDiff line numberDiff line change
@@ -1791,19 +1791,31 @@ func allocatedResourcesMatchStatus(allocatedPod *v1.Pod, podStatus *kubecontaine
17911791

17921792
// Only compare resizeable resources, and only compare resources that are explicitly configured.
17931793
if hasCPUReq {
1794-
// If both allocated & status CPU requests are at or below MinShares then they are considered equal.
1795-
if !cpuReq.Equal(*cs.Resources.CPURequest) &&
1794+
if cs.Resources.CPURequest == nil {
1795+
if !cpuReq.IsZero() {
1796+
return false
1797+
}
1798+
} else if !cpuReq.Equal(*cs.Resources.CPURequest) &&
17961799
(cpuReq.MilliValue() > cm.MinShares || cs.Resources.CPURequest.MilliValue() > cm.MinShares) {
1800+
// If both allocated & status CPU requests are at or below MinShares then they are considered equal.
17971801
return false
17981802
}
17991803
}
18001804
if hasCPULim {
1801-
if !cpuLim.Equal(*cs.Resources.CPULimit) {
1805+
if cs.Resources.CPULimit == nil {
1806+
if !cpuLim.IsZero() {
1807+
return false
1808+
}
1809+
} else if !cpuLim.Equal(*cs.Resources.CPULimit) {
18021810
return false
18031811
}
18041812
}
18051813
if hasMemLim {
1806-
if !memLim.Equal(*cs.Resources.MemoryLimit) {
1814+
if cs.Resources.MemoryLimit == nil {
1815+
if !memLim.IsZero() {
1816+
return false
1817+
}
1818+
} else if !memLim.Equal(*cs.Resources.MemoryLimit) {
18071819
return false
18081820
}
18091821
}

Diff for: pkg/kubelet/kubelet_pods_test.go

+32
Original file line numberDiff line numberDiff line change
@@ -6797,6 +6797,38 @@ func TestAllocatedResourcesMatchStatus(t *testing.T) {
67976797
CPURequest: resource.NewMilliQuantity(2, resource.DecimalSI),
67986798
},
67996799
expectMatch: true,
6800+
}, {
6801+
name: "nil status resources: cpu request mismatch",
6802+
allocatedResources: v1.ResourceRequirements{
6803+
Requests: v1.ResourceList{
6804+
v1.ResourceCPU: resource.MustParse("100m"),
6805+
},
6806+
},
6807+
statusResources: &kubecontainer.ContainerResources{},
6808+
expectMatch: false,
6809+
}, {
6810+
name: "nil status resources: cpu limit mismatch",
6811+
allocatedResources: v1.ResourceRequirements{
6812+
Requests: v1.ResourceList{
6813+
v1.ResourceCPU: resource.MustParse("100m"),
6814+
},
6815+
Limits: v1.ResourceList{
6816+
v1.ResourceCPU: resource.MustParse("100m"),
6817+
},
6818+
},
6819+
statusResources: &kubecontainer.ContainerResources{
6820+
CPURequest: resource.NewMilliQuantity(2, resource.DecimalSI),
6821+
},
6822+
expectMatch: false,
6823+
}, {
6824+
name: "nil status resources: memory limit mismatch",
6825+
allocatedResources: v1.ResourceRequirements{
6826+
Limits: v1.ResourceList{
6827+
v1.ResourceMemory: resource.MustParse("100M"),
6828+
},
6829+
},
6830+
statusResources: &kubecontainer.ContainerResources{},
6831+
expectMatch: false,
68006832
}}
68016833

68026834
for _, test := range tests {

Diff for: pkg/kubelet/kuberuntime/kuberuntime_manager.go

+23-7
Original file line numberDiff line numberDiff line change
@@ -584,8 +584,10 @@ func (m *kubeGenericRuntimeManager) computePodResizeAction(pod *v1.Pod, containe
584584
cpuRequest: container.Resources.Requests.Cpu().MilliValue(),
585585
}
586586

587-
// Default current values to the desired values so that a resize isn't triggered for missing values.
588-
currentResources := desiredResources
587+
currentResources := containerResources{
588+
// memoryRequest isn't set by the runtime, so default it to the desired.
589+
memoryRequest: desiredResources.memoryRequest,
590+
}
589591
if kubeContainerStatus.Resources.MemoryLimit != nil {
590592
currentResources.memoryLimit = kubeContainerStatus.Resources.MemoryLimit.Value()
591593
}
@@ -839,16 +841,21 @@ func (m *kubeGenericRuntimeManager) updatePodContainerResources(pod *v1.Pod, res
839841
}
840842
switch resourceName {
841843
case v1.ResourceMemory:
842-
return status.Resources.MemoryLimit.Equal(*container.Resources.Limits.Memory())
844+
actualLimit := nonNilQuantity(status.Resources.MemoryLimit)
845+
return actualLimit.Equal(*container.Resources.Limits.Memory())
843846
case v1.ResourceCPU:
844-
if !status.Resources.CPULimit.Equal(*container.Resources.Limits.Cpu()) {
847+
actualLimit := nonNilQuantity(status.Resources.CPULimit)
848+
actualRequest := nonNilQuantity(status.Resources.CPURequest)
849+
desiredLimit := container.Resources.Limits.Cpu()
850+
desiredRequest := container.Resources.Requests.Cpu()
851+
if !actualLimit.Equal(*desiredLimit) {
845852
return false // limits don't match
846-
} else if status.Resources.CPURequest.Equal(*container.Resources.Requests.Cpu()) {
853+
} else if actualRequest.Equal(*desiredRequest) {
847854
return true // requests & limits both match
848855
}
849856
// Consider requests equal if both are at or below MinShares.
850-
return status.Resources.CPURequest.MilliValue() <= cm.MinShares &&
851-
container.Resources.Requests.Cpu().MilliValue() <= cm.MinShares
857+
return actualRequest.MilliValue() <= cm.MinShares &&
858+
desiredRequest.MilliValue() <= cm.MinShares
852859
default:
853860
return true // Shouldn't happen.
854861
}
@@ -870,6 +877,15 @@ func (m *kubeGenericRuntimeManager) updatePodContainerResources(pod *v1.Pod, res
870877
return nil
871878
}
872879

880+
// nonNilQuantity returns a non-nil quantity. If the input is non-nil, it is returned. Otherwise a
881+
// pointer to the zero value is returned.
882+
func nonNilQuantity(q *resource.Quantity) *resource.Quantity {
883+
if q != nil {
884+
return q
885+
}
886+
return &resource.Quantity{}
887+
}
888+
873889
// computePodActions checks whether the pod spec has changed and returns the changes if true.
874890
func (m *kubeGenericRuntimeManager) computePodActions(ctx context.Context, pod *v1.Pod, podStatus *kubecontainer.PodStatus) podActions {
875891
klog.V(5).InfoS("Syncing Pod", "pod", klog.KObj(pod))

0 commit comments

Comments
 (0)