From 22ab45b5759b01341a2b030915da68842e9bd135 Mon Sep 17 00:00:00 2001 From: Xing Zhou Date: Tue, 25 Apr 2017 10:17:28 +0800 Subject: [PATCH] While calculating pod's cpu limits, need to count in init-container. Need to count in init-container when calculating a pod's cpu limits. Otherwise, may cause pod start failure due to "invalid argument" error while trying to write "cpu.cfs_quota_us" file. --- pkg/kubelet/cm/helpers_linux.go | 40 ++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/pkg/kubelet/cm/helpers_linux.go b/pkg/kubelet/cm/helpers_linux.go index 2e0d41b9c52..ca2f7235ca0 100644 --- a/pkg/kubelet/cm/helpers_linux.go +++ b/pkg/kubelet/cm/helpers_linux.go @@ -26,6 +26,7 @@ import ( libcontainercgroups "github.com/opencontainers/runc/libcontainer/cgroups" "k8s.io/kubernetes/pkg/api/v1" + "k8s.io/kubernetes/pkg/api/v1/resource" "k8s.io/kubernetes/pkg/kubelet/qos" ) @@ -84,28 +85,41 @@ func MilliCPUToShares(milliCPU int64) int64 { // ResourceConfigForPod takes the input pod and outputs the cgroup resource config. func ResourceConfigForPod(pod *v1.Pod) *ResourceConfig { - // sum requests and limits, track if limits were applied for each resource. + // sum requests and limits. + reqs, limits, err := resource.PodRequestsAndLimits(pod) + if err != nil { + return &ResourceConfig{} + } + cpuRequests := int64(0) cpuLimits := int64(0) memoryLimits := int64(0) - memoryLimitsDeclared := true - cpuLimitsDeclared := true - for _, container := range pod.Spec.Containers { - cpuRequests += container.Resources.Requests.Cpu().MilliValue() - cpuLimits += container.Resources.Limits.Cpu().MilliValue() - if container.Resources.Limits.Cpu().IsZero() { - cpuLimitsDeclared = false - } - memoryLimits += container.Resources.Limits.Memory().Value() - if container.Resources.Limits.Memory().IsZero() { - memoryLimitsDeclared = false - } + if request, found := reqs[v1.ResourceCPU]; found { + cpuRequests = request.MilliValue() + } + if limit, found := limits[v1.ResourceCPU]; found { + cpuLimits = limit.MilliValue() + } + if limit, found := limits[v1.ResourceMemory]; found { + memoryLimits = limit.Value() } // convert to CFS values cpuShares := MilliCPUToShares(cpuRequests) cpuQuota, cpuPeriod := MilliCPUToQuota(cpuLimits) + // track if limits were applied for each resource. + memoryLimitsDeclared := true + cpuLimitsDeclared := true + for _, container := range pod.Spec.Containers { + if container.Resources.Limits.Cpu().IsZero() { + cpuLimitsDeclared = false + } + if container.Resources.Limits.Memory().IsZero() { + memoryLimitsDeclared = false + } + } + // determine the qos class qosClass := qos.GetPodQOS(pod)