// Helper for getting the docker version. func getDockerVersion(cadvisor cadvisor.Interface) *utilversion.Version { versions, err := cadvisor.VersionInfo() if err != nil { glog.Errorf("Error requesting cAdvisor VersionInfo: %v", err) return utilversion.MustParseSemantic("0.0.0") } dockerVersion, err := utilversion.ParseSemantic(versions.DockerVersion) if err != nil { glog.Errorf("Error parsing docker version %q: %v", versions.DockerVersion, err) return utilversion.MustParseSemantic("0.0.0") } return dockerVersion }
// Helper for getting the docker version. func getDockerVersion(cadvisor cadvisor.Interface) semver.Version { var fallback semver.Version // Fallback to zero-value by default. versions, err := cadvisor.VersionInfo() if err != nil { glog.Errorf("Error requesting cAdvisor VersionInfo: %v", err) return fallback } dockerVersion, err := semver.Parse(versions.DockerVersion) if err != nil { glog.Errorf("Error parsing docker version %q: %v", versions.DockerVersion, err) return fallback } return dockerVersion }
// TODO(vmarmol): Add limits to the system containers. // Takes the absolute name of the specified containers. // Empty container name disables use of the specified container. func newContainerManager(cadvisorInterface cadvisor.Interface, dockerDaemonContainerName, systemContainerName, kubeletContainerName string) (containerManager, error) { systemContainers := []*systemContainer{} if dockerDaemonContainerName != "" { cont := newSystemContainer(dockerDaemonContainerName) info, err := cadvisorInterface.MachineInfo() var capacity = api.ResourceList{} if err != nil { } else { capacity = CapacityFromMachineInfo(info) } memoryLimit := (int64(capacity.Memory().Value() * DockerMemoryLimitThresholdPercent / 100)) if memoryLimit < MinDockerMemoryLimit { glog.Warningf("Memory limit %d for container %s is too small, reset it to %d", memoryLimit, dockerDaemonContainerName, MinDockerMemoryLimit) memoryLimit = MinDockerMemoryLimit } glog.V(2).Infof("Configure resource-only container %s with memory limit: %d", dockerDaemonContainerName, memoryLimit) dockerContainer := &fs.Manager{ Cgroups: &configs.Cgroup{ Name: dockerDaemonContainerName, Memory: memoryLimit, MemorySwap: -1, AllowAllDevices: true, }, } cont.ensureStateFunc = func(manager *fs.Manager) error { return ensureDockerInContainer(cadvisorInterface, -900, dockerContainer) } systemContainers = append(systemContainers, cont) } if systemContainerName != "" { if systemContainerName == "/" { return nil, fmt.Errorf("system container cannot be root (\"/\")") } rootContainer := &fs.Manager{ Cgroups: &configs.Cgroup{ Name: "/", }, } manager := createManager(systemContainerName) err := ensureSystemContainer(rootContainer, manager) if err != nil { return nil, err } systemContainers = append(systemContainers, newSystemContainer(systemContainerName)) } if kubeletContainerName != "" { systemContainers = append(systemContainers, newSystemContainer(kubeletContainerName)) } // TODO(vmarmol): Add Kube-proxy container. return &containerManagerImpl{ systemContainers: systemContainers, }, nil }