Commit bbc90cd9 authored by Brian Grant's avatar Brian Grant

Merge pull request #14035 from feiskyer/kubelet/client/server

Refactor image manager for client/server implementation of the container runtime
parents f6243221 f1124eb0
...@@ -22,12 +22,11 @@ import ( ...@@ -22,12 +22,11 @@ import (
"sync" "sync"
"time" "time"
docker "github.com/fsouza/go-dockerclient"
"github.com/golang/glog" "github.com/golang/glog"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/client/record" "k8s.io/kubernetes/pkg/client/record"
"k8s.io/kubernetes/pkg/kubelet/cadvisor" "k8s.io/kubernetes/pkg/kubelet/cadvisor"
"k8s.io/kubernetes/pkg/kubelet/dockertools" "k8s.io/kubernetes/pkg/kubelet/container"
"k8s.io/kubernetes/pkg/util" "k8s.io/kubernetes/pkg/util"
"k8s.io/kubernetes/pkg/util/sets" "k8s.io/kubernetes/pkg/util/sets"
) )
...@@ -59,8 +58,8 @@ type ImageGCPolicy struct { ...@@ -59,8 +58,8 @@ type ImageGCPolicy struct {
} }
type realImageManager struct { type realImageManager struct {
// Connection to the Docker daemon. // Container runtime
dockerClient dockertools.DockerInterface runtime container.Runtime
// Records of images and their use. // Records of images and their use.
imageRecords map[string]*imageRecord imageRecords map[string]*imageRecord
...@@ -91,7 +90,7 @@ type imageRecord struct { ...@@ -91,7 +90,7 @@ type imageRecord struct {
size int64 size int64
} }
func newImageManager(dockerClient dockertools.DockerInterface, cadvisorInterface cadvisor.Interface, recorder record.EventRecorder, nodeRef *api.ObjectReference, policy ImageGCPolicy) (imageManager, error) { func newImageManager(runtime container.Runtime, cadvisorInterface cadvisor.Interface, recorder record.EventRecorder, nodeRef *api.ObjectReference, policy ImageGCPolicy) (imageManager, error) {
// Validate policy. // Validate policy.
if policy.HighThresholdPercent < 0 || policy.HighThresholdPercent > 100 { if policy.HighThresholdPercent < 0 || policy.HighThresholdPercent > 100 {
return nil, fmt.Errorf("invalid HighThresholdPercent %d, must be in range [0-100]", policy.HighThresholdPercent) return nil, fmt.Errorf("invalid HighThresholdPercent %d, must be in range [0-100]", policy.HighThresholdPercent)
...@@ -100,7 +99,7 @@ func newImageManager(dockerClient dockertools.DockerInterface, cadvisorInterface ...@@ -100,7 +99,7 @@ func newImageManager(dockerClient dockertools.DockerInterface, cadvisorInterface
return nil, fmt.Errorf("invalid LowThresholdPercent %d, must be in range [0-100]", policy.LowThresholdPercent) return nil, fmt.Errorf("invalid LowThresholdPercent %d, must be in range [0-100]", policy.LowThresholdPercent)
} }
im := &realImageManager{ im := &realImageManager{
dockerClient: dockerClient, runtime: runtime,
policy: policy, policy: policy,
imageRecords: make(map[string]*imageRecord), imageRecords: make(map[string]*imageRecord),
cadvisor: cadvisorInterface, cadvisor: cadvisorInterface,
...@@ -130,21 +129,21 @@ func (im *realImageManager) Start() error { ...@@ -130,21 +129,21 @@ func (im *realImageManager) Start() error {
} }
func (im *realImageManager) detectImages(detected time.Time) error { func (im *realImageManager) detectImages(detected time.Time) error {
images, err := im.dockerClient.ListImages(docker.ListImagesOptions{}) images, err := im.runtime.ListImages()
if err != nil { if err != nil {
return err return err
} }
containers, err := im.dockerClient.ListContainers(docker.ListContainersOptions{ pods, err := im.runtime.GetPods(true)
All: true,
})
if err != nil { if err != nil {
return err return err
} }
// Make a set of images in use by containers. // Make a set of images in use by containers.
imagesInUse := sets.NewString() imagesInUse := sets.NewString()
for _, container := range containers { for _, pod := range pods {
imagesInUse.Insert(container.Image) for _, container := range pod.Containers {
imagesInUse.Insert(container.Image)
}
} }
// Add new images and record those being used. // Add new images and record those being used.
...@@ -163,11 +162,11 @@ func (im *realImageManager) detectImages(detected time.Time) error { ...@@ -163,11 +162,11 @@ func (im *realImageManager) detectImages(detected time.Time) error {
} }
// Set last used time to now if the image is being used. // Set last used time to now if the image is being used.
if isImageUsed(&image, imagesInUse) { if isImageUsed(image, imagesInUse) {
im.imageRecords[image.ID].lastUsed = now im.imageRecords[image.ID].lastUsed = now
} }
im.imageRecords[image.ID].size = image.VirtualSize im.imageRecords[image.ID].size = image.Size
} }
// Remove old images from our records. // Remove old images from our records.
...@@ -253,7 +252,7 @@ func (im *realImageManager) freeSpace(bytesToFree int64) (int64, error) { ...@@ -253,7 +252,7 @@ func (im *realImageManager) freeSpace(bytesToFree int64) (int64, error) {
// Remove image. Continue despite errors. // Remove image. Continue despite errors.
glog.Infof("[ImageManager]: Removing image %q to free %d bytes", image.id, image.size) glog.Infof("[ImageManager]: Removing image %q to free %d bytes", image.id, image.size)
err := im.dockerClient.RemoveImage(image.id) err := im.runtime.RemoveImage(container.ImageSpec{Image: image.id})
if err != nil { if err != nil {
lastErr = err lastErr = err
continue continue
...@@ -287,12 +286,12 @@ func (ev byLastUsedAndDetected) Less(i, j int) bool { ...@@ -287,12 +286,12 @@ func (ev byLastUsedAndDetected) Less(i, j int) bool {
} }
} }
func isImageUsed(image *docker.APIImages, imagesInUse sets.String) bool { func isImageUsed(image container.Image, imagesInUse sets.String) bool {
// Check the image ID and all the RepoTags. // Check the image ID and all the RepoTags.
if _, ok := imagesInUse[image.ID]; ok { if _, ok := imagesInUse[image.ID]; ok {
return true return true
} }
for _, tag := range image.RepoTags { for _, tag := range image.Tags {
if _, ok := imagesInUse[tag]; ok { if _, ok := imagesInUse[tag]; ok {
return true return true
} }
......
...@@ -237,10 +237,7 @@ func NewMainKubelet( ...@@ -237,10 +237,7 @@ func NewMainKubelet(
if err != nil { if err != nil {
return nil, err return nil, err
} }
imageManager, err := newImageManager(dockerClient, cadvisorInterface, recorder, nodeRef, imageGCPolicy)
if err != nil {
return nil, fmt.Errorf("failed to initialize image manager: %v", err)
}
diskSpaceManager, err := newDiskSpaceManager(cadvisorInterface, diskSpacePolicy) diskSpaceManager, err := newDiskSpaceManager(cadvisorInterface, diskSpacePolicy)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to initialize disk manager: %v", err) return nil, fmt.Errorf("failed to initialize disk manager: %v", err)
...@@ -278,7 +275,6 @@ func NewMainKubelet( ...@@ -278,7 +275,6 @@ func NewMainKubelet(
recorder: recorder, recorder: recorder,
cadvisor: cadvisorInterface, cadvisor: cadvisorInterface,
containerGC: containerGC, containerGC: containerGC,
imageManager: imageManager,
diskSpaceManager: diskSpaceManager, diskSpaceManager: diskSpaceManager,
statusManager: statusManager, statusManager: statusManager,
volumeManager: volumeManager, volumeManager: volumeManager,
...@@ -360,6 +356,13 @@ func NewMainKubelet( ...@@ -360,6 +356,13 @@ func NewMainKubelet(
return nil, fmt.Errorf("unsupported container runtime %q specified", containerRuntime) return nil, fmt.Errorf("unsupported container runtime %q specified", containerRuntime)
} }
// setup imageManager
imageManager, err := newImageManager(klet.containerRuntime, cadvisorInterface, recorder, nodeRef, imageGCPolicy)
if err != nil {
return nil, fmt.Errorf("failed to initialize image manager: %v", err)
}
klet.imageManager = imageManager
// Setup container manager, can fail if the devices hierarchy is not mounted // Setup container manager, can fail if the devices hierarchy is not mounted
// (it is required by Docker however). // (it is required by Docker however).
containerManager, err := newContainerManager(mounter, cadvisorInterface, dockerDaemonContainer, systemContainer, resourceContainer) containerManager, err := newContainerManager(mounter, cadvisorInterface, dockerDaemonContainer, systemContainer, resourceContainer)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment