mirror of
				https://github.com/k3s-io/kubernetes.git
				synced 2025-11-03 23:40:03 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			155 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			155 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
/*
 | 
						|
Copyright 2015 The Kubernetes Authors.
 | 
						|
 | 
						|
Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
you may not use this file except in compliance with the License.
 | 
						|
You may obtain a copy of the License at
 | 
						|
 | 
						|
    http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
 | 
						|
Unless required by applicable law or agreed to in writing, software
 | 
						|
distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
See the License for the specific language governing permissions and
 | 
						|
limitations under the License.
 | 
						|
*/
 | 
						|
 | 
						|
package cm
 | 
						|
 | 
						|
import (
 | 
						|
	"time"
 | 
						|
 | 
						|
	"k8s.io/apimachinery/pkg/util/sets"
 | 
						|
	// TODO: Migrate kubelet to either use its own internal objects or client library.
 | 
						|
	"k8s.io/api/core/v1"
 | 
						|
	internalapi "k8s.io/kubernetes/pkg/kubelet/apis/cri"
 | 
						|
	"k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig"
 | 
						|
	kubecontainer "k8s.io/kubernetes/pkg/kubelet/container"
 | 
						|
	evictionapi "k8s.io/kubernetes/pkg/kubelet/eviction/api"
 | 
						|
	"k8s.io/kubernetes/pkg/kubelet/status"
 | 
						|
 | 
						|
	"fmt"
 | 
						|
	"strconv"
 | 
						|
	"strings"
 | 
						|
)
 | 
						|
 | 
						|
type ActivePodsFunc func() []*v1.Pod
 | 
						|
 | 
						|
// Manages the containers running on a machine.
 | 
						|
type ContainerManager interface {
 | 
						|
	// Runs the container manager's housekeeping.
 | 
						|
	// - Ensures that the Docker daemon is in a container.
 | 
						|
	// - Creates the system container where all non-containerized processes run.
 | 
						|
	Start(*v1.Node, ActivePodsFunc, status.PodStatusProvider, internalapi.RuntimeService) error
 | 
						|
 | 
						|
	// Returns resources allocated to system cgroups in the machine.
 | 
						|
	// These cgroups include the system and Kubernetes services.
 | 
						|
	SystemCgroupsLimit() v1.ResourceList
 | 
						|
 | 
						|
	// Returns a NodeConfig that is being used by the container manager.
 | 
						|
	GetNodeConfig() NodeConfig
 | 
						|
 | 
						|
	// Returns internal Status.
 | 
						|
	Status() Status
 | 
						|
 | 
						|
	// NewPodContainerManager is a factory method which returns a podContainerManager object
 | 
						|
	// Returns a noop implementation if qos cgroup hierarchy is not enabled
 | 
						|
	NewPodContainerManager() PodContainerManager
 | 
						|
 | 
						|
	// GetMountedSubsystems returns the mounted cgroup subsystems on the node
 | 
						|
	GetMountedSubsystems() *CgroupSubsystems
 | 
						|
 | 
						|
	// GetQOSContainersInfo returns the names of top level QoS containers
 | 
						|
	GetQOSContainersInfo() QOSContainersInfo
 | 
						|
 | 
						|
	// GetNodeAllocatable returns the amount of compute resources that have to be reserved from scheduling.
 | 
						|
	GetNodeAllocatableReservation() v1.ResourceList
 | 
						|
 | 
						|
	// GetCapacity returns the amount of compute resources tracked by container manager available on the node.
 | 
						|
	GetCapacity() v1.ResourceList
 | 
						|
 | 
						|
	// UpdateQOSCgroups performs housekeeping updates to ensure that the top
 | 
						|
	// level QoS containers have their desired state in a thread-safe way
 | 
						|
	UpdateQOSCgroups() error
 | 
						|
 | 
						|
	// Returns RunContainerOptions with devices, mounts, and env fields populated for
 | 
						|
	// extended resources required by container.
 | 
						|
	GetResources(pod *v1.Pod, container *v1.Container, activePods []*v1.Pod) (*kubecontainer.RunContainerOptions, error)
 | 
						|
 | 
						|
	InternalContainerLifecycle() InternalContainerLifecycle
 | 
						|
}
 | 
						|
 | 
						|
type NodeConfig struct {
 | 
						|
	RuntimeCgroupsName    string
 | 
						|
	SystemCgroupsName     string
 | 
						|
	KubeletCgroupsName    string
 | 
						|
	ContainerRuntime      string
 | 
						|
	CgroupsPerQOS         bool
 | 
						|
	CgroupRoot            string
 | 
						|
	CgroupDriver          string
 | 
						|
	ProtectKernelDefaults bool
 | 
						|
	NodeAllocatableConfig
 | 
						|
	ExperimentalQOSReserved               map[v1.ResourceName]int64
 | 
						|
	ExperimentalCPUManagerPolicy          string
 | 
						|
	ExperimentalCPUManagerReconcilePeriod time.Duration
 | 
						|
}
 | 
						|
 | 
						|
type NodeAllocatableConfig struct {
 | 
						|
	KubeReservedCgroupName   string
 | 
						|
	SystemReservedCgroupName string
 | 
						|
	EnforceNodeAllocatable   sets.String
 | 
						|
	KubeReserved             v1.ResourceList
 | 
						|
	SystemReserved           v1.ResourceList
 | 
						|
	HardEvictionThresholds   []evictionapi.Threshold
 | 
						|
}
 | 
						|
 | 
						|
type Status struct {
 | 
						|
	// Any soft requirements that were unsatisfied.
 | 
						|
	SoftRequirements error
 | 
						|
}
 | 
						|
 | 
						|
const (
 | 
						|
	// Uer visible keys for managing node allocatable enforcement on the node.
 | 
						|
	NodeAllocatableEnforcementKey = "pods"
 | 
						|
	SystemReservedEnforcementKey  = "system-reserved"
 | 
						|
	KubeReservedEnforcementKey    = "kube-reserved"
 | 
						|
)
 | 
						|
 | 
						|
// containerManager for the kubelet is currently an injected dependency.
 | 
						|
// We need to parse the --qos-reserve-requests option in
 | 
						|
// cmd/kubelet/app/server.go and there isn't really a good place to put
 | 
						|
// the code.  If/When the kubelet dependency injection gets worked out,
 | 
						|
// maybe there will be a better place for it.
 | 
						|
func parsePercentage(v string) (int64, error) {
 | 
						|
	if !strings.HasSuffix(v, "%") {
 | 
						|
		return 0, fmt.Errorf("percentage expected, got '%s'", v)
 | 
						|
	}
 | 
						|
	percentage, err := strconv.ParseInt(strings.TrimRight(v, "%"), 10, 0)
 | 
						|
	if err != nil {
 | 
						|
		return 0, fmt.Errorf("invalid number in percentage '%s'", v)
 | 
						|
	}
 | 
						|
	if percentage < 0 || percentage > 100 {
 | 
						|
		return 0, fmt.Errorf("percentage must be between 0 and 100")
 | 
						|
	}
 | 
						|
	return percentage, nil
 | 
						|
}
 | 
						|
 | 
						|
// ParseQOSReserved parses the --qos-reserve-requests option
 | 
						|
func ParseQOSReserved(m kubeletconfig.ConfigurationMap) (*map[v1.ResourceName]int64, error) {
 | 
						|
	reservations := make(map[v1.ResourceName]int64)
 | 
						|
	for k, v := range m {
 | 
						|
		switch v1.ResourceName(k) {
 | 
						|
		// Only memory resources are supported.
 | 
						|
		case v1.ResourceMemory:
 | 
						|
			q, err := parsePercentage(v)
 | 
						|
			if err != nil {
 | 
						|
				return nil, err
 | 
						|
			}
 | 
						|
			reservations[v1.ResourceName(k)] = q
 | 
						|
		default:
 | 
						|
			return nil, fmt.Errorf("cannot reserve %q resource", k)
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return &reservations, nil
 | 
						|
}
 |