2017-02-01 00:45:59 +00:00
|
|
|
/*
|
|
|
|
Copyright 2014 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 container
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
|
|
|
// Specified a policy for garbage collecting containers.
|
|
|
|
type ContainerGCPolicy struct {
|
|
|
|
// Minimum age at which a container can be garbage collected, zero for no limit.
|
|
|
|
MinAge time.Duration
|
|
|
|
|
|
|
|
// Max number of dead containers any single pod (UID, container name) pair is
|
|
|
|
// allowed to have, less than zero for no limit.
|
|
|
|
MaxPerPodContainer int
|
|
|
|
|
|
|
|
// Max number of total dead containers, less than zero for no limit.
|
|
|
|
MaxContainers int
|
|
|
|
}
|
|
|
|
|
|
|
|
// Manages garbage collection of dead containers.
|
|
|
|
//
|
|
|
|
// Implementation is thread-compatible.
|
|
|
|
type ContainerGC interface {
|
|
|
|
// Garbage collect containers.
|
2017-08-04 11:13:19 +00:00
|
|
|
GarbageCollect() error
|
|
|
|
// Deletes all unused containers, including containers belonging to pods that are terminated but not deleted
|
|
|
|
DeleteAllUnusedContainers() error
|
|
|
|
}
|
|
|
|
|
|
|
|
// SourcesReadyProvider knows how to determine if configuration sources are ready
|
|
|
|
type SourcesReadyProvider interface {
|
|
|
|
// AllReady returns true if the currently configured sources have all been seen.
|
|
|
|
AllReady() bool
|
2017-02-01 00:45:59 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// TODO(vmarmol): Preferentially remove pod infra containers.
|
|
|
|
type realContainerGC struct {
|
|
|
|
// Container runtime
|
|
|
|
runtime Runtime
|
|
|
|
|
|
|
|
// Policy for garbage collection.
|
|
|
|
policy ContainerGCPolicy
|
2017-08-04 11:13:19 +00:00
|
|
|
|
|
|
|
// sourcesReadyProvider provides the readyness of kubelet configuration sources.
|
|
|
|
sourcesReadyProvider SourcesReadyProvider
|
2017-02-01 00:45:59 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// New ContainerGC instance with the specified policy.
|
2017-08-04 11:13:19 +00:00
|
|
|
func NewContainerGC(runtime Runtime, policy ContainerGCPolicy, sourcesReadyProvider SourcesReadyProvider) (ContainerGC, error) {
|
2017-02-01 00:45:59 +00:00
|
|
|
if policy.MinAge < 0 {
|
|
|
|
return nil, fmt.Errorf("invalid minimum garbage collection age: %v", policy.MinAge)
|
|
|
|
}
|
|
|
|
|
|
|
|
return &realContainerGC{
|
2017-08-04 11:13:19 +00:00
|
|
|
runtime: runtime,
|
|
|
|
policy: policy,
|
|
|
|
sourcesReadyProvider: sourcesReadyProvider,
|
2017-02-01 00:45:59 +00:00
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
|
2017-08-04 11:13:19 +00:00
|
|
|
func (cgc *realContainerGC) GarbageCollect() error {
|
|
|
|
return cgc.runtime.GarbageCollect(cgc.policy, cgc.sourcesReadyProvider.AllReady(), false)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (cgc *realContainerGC) DeleteAllUnusedContainers() error {
|
|
|
|
return cgc.runtime.GarbageCollect(cgc.policy, cgc.sourcesReadyProvider.AllReady(), true)
|
2017-02-01 00:45:59 +00:00
|
|
|
}
|