in pkg/common/resource.go [56:109]
func GetPodResource(pod *v1.Pod) (resource *si.Resource) {
podResource := &si.Resource{
Resources: map[string]*si.Quantity{"pods": {Value: 1}},
}
// Init container statuses and pod statuses are reported in separate places, so build a fixed map here to make
// this easier to compute. This is ever so slightly more resource-intensive than computing inline, but is far more
// readable and less error prone. Since resource calculation is only done once per pod update, this overhead is
// negligible.
containerStatuses := make(map[string]*v1.ContainerStatus, len(pod.Status.ContainerStatuses)+len(pod.Status.InitContainerStatuses))
for idx := range pod.Status.ContainerStatuses {
containerStatuses[pod.Status.ContainerStatuses[idx].Name] = &pod.Status.ContainerStatuses[idx]
}
for idx := range pod.Status.InitContainerStatuses {
containerStatuses[pod.Status.InitContainerStatuses[idx].Name] = &pod.Status.InitContainerStatuses[idx]
}
// Add usage for each container
for _, container := range pod.Spec.Containers {
podResource = Add(podResource, computeContainerResource(pod, &container, containerStatuses))
}
// each resource compare between initcontainer and sum of containers
// InitContainers(i) requirement=sum(Sidecar requirement i-1)+InitContainer(i) request
// max(sum(Containers requirement)+sum(Sidecar requirement), InitContainer(i) requirement)
if len(pod.Spec.InitContainers) > 0 {
podResource = checkInitContainerRequest(pod, podResource, containerStatuses)
}
// PodLevelResources feature:
// alpha: v1.32
// beta: v1.33
if pod.Spec.Resources != nil && len(pod.Spec.Resources.Requests) > 0 {
// pod-level resources, if present, override sum of container-level resources
// only memory and cpu are supported
for name, value := range getPodLevelResource(pod.Spec.Resources.Requests).GetResources() {
podResource.Resources[name] = value
}
}
// K8s EnableOverHead feature:
// Enables PodOverhead, for accounting pod overheads which are specific to a given RuntimeClass
if pod.Spec.Overhead != nil {
podOverHeadResource := getResource(pod.Spec.Overhead)
podResource = Add(podResource, podOverHeadResource)
// Logging the overall pod size and pod overhead
log.Log(log.ShimResources).Debug("Pod overhead specified, overall pod size adjusted",
zap.String("taskID", string(pod.UID)),
zap.Stringer("overallSize", podResource),
zap.Stringer("overheadSize", podOverHeadResource))
}
return podResource
}