mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-29 22:46:12 +00:00
Allow adding limits
This commit is contained in:
parent
caedccf0e4
commit
25cf2a2aac
@ -1791,19 +1791,31 @@ func allocatedResourcesMatchStatus(allocatedPod *v1.Pod, podStatus *kubecontaine
|
|||||||
|
|
||||||
// Only compare resizeable resources, and only compare resources that are explicitly configured.
|
// Only compare resizeable resources, and only compare resources that are explicitly configured.
|
||||||
if hasCPUReq {
|
if hasCPUReq {
|
||||||
// If both allocated & status CPU requests are at or below MinShares then they are considered equal.
|
if cs.Resources.CPURequest == nil {
|
||||||
if !cpuReq.Equal(*cs.Resources.CPURequest) &&
|
if !cpuReq.IsZero() {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
} else if !cpuReq.Equal(*cs.Resources.CPURequest) &&
|
||||||
(cpuReq.MilliValue() > cm.MinShares || cs.Resources.CPURequest.MilliValue() > cm.MinShares) {
|
(cpuReq.MilliValue() > cm.MinShares || cs.Resources.CPURequest.MilliValue() > cm.MinShares) {
|
||||||
|
// If both allocated & status CPU requests are at or below MinShares then they are considered equal.
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if hasCPULim {
|
if hasCPULim {
|
||||||
if !cpuLim.Equal(*cs.Resources.CPULimit) {
|
if cs.Resources.CPULimit == nil {
|
||||||
|
if !cpuLim.IsZero() {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
} else if !cpuLim.Equal(*cs.Resources.CPULimit) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if hasMemLim {
|
if hasMemLim {
|
||||||
if !memLim.Equal(*cs.Resources.MemoryLimit) {
|
if cs.Resources.MemoryLimit == nil {
|
||||||
|
if !memLim.IsZero() {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
} else if !memLim.Equal(*cs.Resources.MemoryLimit) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6797,6 +6797,38 @@ func TestAllocatedResourcesMatchStatus(t *testing.T) {
|
|||||||
CPURequest: resource.NewMilliQuantity(2, resource.DecimalSI),
|
CPURequest: resource.NewMilliQuantity(2, resource.DecimalSI),
|
||||||
},
|
},
|
||||||
expectMatch: true,
|
expectMatch: true,
|
||||||
|
}, {
|
||||||
|
name: "nil status resources: cpu request mismatch",
|
||||||
|
allocatedResources: v1.ResourceRequirements{
|
||||||
|
Requests: v1.ResourceList{
|
||||||
|
v1.ResourceCPU: resource.MustParse("100m"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
statusResources: &kubecontainer.ContainerResources{},
|
||||||
|
expectMatch: false,
|
||||||
|
}, {
|
||||||
|
name: "nil status resources: cpu limit mismatch",
|
||||||
|
allocatedResources: v1.ResourceRequirements{
|
||||||
|
Requests: v1.ResourceList{
|
||||||
|
v1.ResourceCPU: resource.MustParse("100m"),
|
||||||
|
},
|
||||||
|
Limits: v1.ResourceList{
|
||||||
|
v1.ResourceCPU: resource.MustParse("100m"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
statusResources: &kubecontainer.ContainerResources{
|
||||||
|
CPURequest: resource.NewMilliQuantity(2, resource.DecimalSI),
|
||||||
|
},
|
||||||
|
expectMatch: false,
|
||||||
|
}, {
|
||||||
|
name: "nil status resources: memory limit mismatch",
|
||||||
|
allocatedResources: v1.ResourceRequirements{
|
||||||
|
Limits: v1.ResourceList{
|
||||||
|
v1.ResourceMemory: resource.MustParse("100M"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
statusResources: &kubecontainer.ContainerResources{},
|
||||||
|
expectMatch: false,
|
||||||
}}
|
}}
|
||||||
|
|
||||||
for _, test := range tests {
|
for _, test := range tests {
|
||||||
|
@ -584,8 +584,10 @@ func (m *kubeGenericRuntimeManager) computePodResizeAction(pod *v1.Pod, containe
|
|||||||
cpuRequest: container.Resources.Requests.Cpu().MilliValue(),
|
cpuRequest: container.Resources.Requests.Cpu().MilliValue(),
|
||||||
}
|
}
|
||||||
|
|
||||||
// Default current values to the desired values so that a resize isn't triggered for missing values.
|
currentResources := containerResources{
|
||||||
currentResources := desiredResources
|
// memoryRequest isn't set by the runtime, so default it to the desired.
|
||||||
|
memoryRequest: desiredResources.memoryRequest,
|
||||||
|
}
|
||||||
if kubeContainerStatus.Resources.MemoryLimit != nil {
|
if kubeContainerStatus.Resources.MemoryLimit != nil {
|
||||||
currentResources.memoryLimit = kubeContainerStatus.Resources.MemoryLimit.Value()
|
currentResources.memoryLimit = kubeContainerStatus.Resources.MemoryLimit.Value()
|
||||||
}
|
}
|
||||||
@ -839,16 +841,21 @@ func (m *kubeGenericRuntimeManager) updatePodContainerResources(pod *v1.Pod, res
|
|||||||
}
|
}
|
||||||
switch resourceName {
|
switch resourceName {
|
||||||
case v1.ResourceMemory:
|
case v1.ResourceMemory:
|
||||||
return status.Resources.MemoryLimit.Equal(*container.Resources.Limits.Memory())
|
actualLimit := nonNilQuantity(status.Resources.MemoryLimit)
|
||||||
|
return actualLimit.Equal(*container.Resources.Limits.Memory())
|
||||||
case v1.ResourceCPU:
|
case v1.ResourceCPU:
|
||||||
if !status.Resources.CPULimit.Equal(*container.Resources.Limits.Cpu()) {
|
actualLimit := nonNilQuantity(status.Resources.CPULimit)
|
||||||
|
actualRequest := nonNilQuantity(status.Resources.CPURequest)
|
||||||
|
desiredLimit := container.Resources.Limits.Cpu()
|
||||||
|
desiredRequest := container.Resources.Requests.Cpu()
|
||||||
|
if !actualLimit.Equal(*desiredLimit) {
|
||||||
return false // limits don't match
|
return false // limits don't match
|
||||||
} else if status.Resources.CPURequest.Equal(*container.Resources.Requests.Cpu()) {
|
} else if actualRequest.Equal(*desiredRequest) {
|
||||||
return true // requests & limits both match
|
return true // requests & limits both match
|
||||||
}
|
}
|
||||||
// Consider requests equal if both are at or below MinShares.
|
// Consider requests equal if both are at or below MinShares.
|
||||||
return status.Resources.CPURequest.MilliValue() <= cm.MinShares &&
|
return actualRequest.MilliValue() <= cm.MinShares &&
|
||||||
container.Resources.Requests.Cpu().MilliValue() <= cm.MinShares
|
desiredRequest.MilliValue() <= cm.MinShares
|
||||||
default:
|
default:
|
||||||
return true // Shouldn't happen.
|
return true // Shouldn't happen.
|
||||||
}
|
}
|
||||||
@ -870,6 +877,15 @@ func (m *kubeGenericRuntimeManager) updatePodContainerResources(pod *v1.Pod, res
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// nonNilQuantity returns a non-nil quantity. If the input is non-nil, it is returned. Otherwise a
|
||||||
|
// pointer to the zero value is returned.
|
||||||
|
func nonNilQuantity(q *resource.Quantity) *resource.Quantity {
|
||||||
|
if q != nil {
|
||||||
|
return q
|
||||||
|
}
|
||||||
|
return &resource.Quantity{}
|
||||||
|
}
|
||||||
|
|
||||||
// computePodActions checks whether the pod spec has changed and returns the changes if true.
|
// computePodActions checks whether the pod spec has changed and returns the changes if true.
|
||||||
func (m *kubeGenericRuntimeManager) computePodActions(ctx context.Context, pod *v1.Pod, podStatus *kubecontainer.PodStatus) podActions {
|
func (m *kubeGenericRuntimeManager) computePodActions(ctx context.Context, pod *v1.Pod, podStatus *kubecontainer.PodStatus) podActions {
|
||||||
klog.V(5).InfoS("Syncing Pod", "pod", klog.KObj(pod))
|
klog.V(5).InfoS("Syncing Pod", "pod", klog.KObj(pod))
|
||||||
|
Loading…
Reference in New Issue
Block a user