// generateLinuxContainerConfig generates linux container config for kubelet runtime v1. func (m *kubeGenericRuntimeManager) generateLinuxContainerConfig(container *v1.Container, pod *v1.Pod, uid *int64, username *string) *runtimeapi.LinuxContainerConfig { lc := &runtimeapi.LinuxContainerConfig{ Resources: &runtimeapi.LinuxContainerResources{}, SecurityContext: m.determineEffectiveSecurityContext(pod, container, uid, username), } // set linux container resources var cpuShares int64 cpuRequest := container.Resources.Requests.Cpu() cpuLimit := container.Resources.Limits.Cpu() memoryLimit := container.Resources.Limits.Memory().Value() oomScoreAdj := int64(qos.GetContainerOOMScoreAdjust(pod, container, int64(m.machineInfo.MemoryCapacity))) // If request is not specified, but limit is, we want request to default to limit. // API server does this for new containers, but we repeat this logic in Kubelet // for containers running on existing Kubernetes clusters. if cpuRequest.IsZero() && !cpuLimit.IsZero() { cpuShares = milliCPUToShares(cpuLimit.MilliValue()) } else { // if cpuRequest.Amount is nil, then milliCPUToShares will return the minimal number // of CPU shares. cpuShares = milliCPUToShares(cpuRequest.MilliValue()) } lc.Resources.CpuShares = &cpuShares if memoryLimit != 0 { lc.Resources.MemoryLimitInBytes = &memoryLimit } // Set OOM score of the container based on qos policy. Processes in lower-priority pods should // be killed first if the system runs out of memory. lc.Resources.OomScoreAdj = &oomScoreAdj if m.cpuCFSQuota { // if cpuLimit.Amount is nil, then the appropriate default value is returned // to allow full usage of cpu resource. cpuQuota, cpuPeriod := milliCPUToQuota(cpuLimit.MilliValue()) lc.Resources.CpuQuota = &cpuQuota lc.Resources.CpuPeriod = &cpuPeriod } return lc }
// generateLinuxContainerConfig generates linux container config for kubelet runtime api. func (m *kubeGenericRuntimeManager) generateLinuxContainerConfig(container *api.Container, pod *api.Pod) *runtimeApi.LinuxContainerConfig { linuxConfig := &runtimeApi.LinuxContainerConfig{ Resources: &runtimeApi.LinuxContainerResources{}, } // set linux container resources var cpuShares int64 cpuRequest := container.Resources.Requests.Cpu() cpuLimit := container.Resources.Limits.Cpu() memoryLimit := container.Resources.Limits.Memory().Value() oomScoreAdj := int64(qos.GetContainerOOMScoreAdjust(pod, container, int64(m.machineInfo.MemoryCapacity))) // If request is not specified, but limit is, we want request to default to limit. // API server does this for new containers, but we repeat this logic in Kubelet // for containers running on existing Kubernetes clusters. if cpuRequest.IsZero() && !cpuLimit.IsZero() { cpuShares = milliCPUToShares(cpuLimit.MilliValue()) } else { // if cpuRequest.Amount is nil, then milliCPUToShares will return the minimal number // of CPU shares. cpuShares = milliCPUToShares(cpuRequest.MilliValue()) } linuxConfig.Resources.CpuShares = &cpuShares if memoryLimit != 0 { linuxConfig.Resources.MemoryLimitInBytes = &memoryLimit } // Set OOM score of the container based on qos policy. Processes in lower-priority pods should // be killed first if the system runs out of memory. linuxConfig.Resources.OomScoreAdj = &oomScoreAdj if m.cpuCFSQuota { // if cpuLimit.Amount is nil, then the appropriate default value is returned // to allow full usage of cpu resource. cpuQuota, cpuPeriod := milliCPUToQuota(cpuLimit.MilliValue()) linuxConfig.Resources.CpuQuota = &cpuQuota linuxConfig.Resources.CpuPeriod = &cpuPeriod } // set security context options if container.SecurityContext != nil { securityContext := container.SecurityContext if securityContext.Capabilities != nil { linuxConfig.Capabilities = &runtimeApi.Capability{ AddCapabilities: make([]string, len(securityContext.Capabilities.Add)), DropCapabilities: make([]string, len(securityContext.Capabilities.Drop)), } for index, value := range securityContext.Capabilities.Add { linuxConfig.Capabilities.AddCapabilities[index] = string(value) } for index, value := range securityContext.Capabilities.Drop { linuxConfig.Capabilities.DropCapabilities[index] = string(value) } } if securityContext.SELinuxOptions != nil { linuxConfig.SelinuxOptions = &runtimeApi.SELinuxOption{ User: &securityContext.SELinuxOptions.User, Role: &securityContext.SELinuxOptions.Role, Type: &securityContext.SELinuxOptions.Type, Level: &securityContext.SELinuxOptions.Level, } } } return linuxConfig }