
Automatic merge from submit-queue (batch tested with PRs 51186, 50350, 51751, 51645, 51837) Wait for container cleanup before deletion We should wait to delete pod API objects until the pod's containers have been cleaned up. See issue: #50268 for background. This changes the kubelet container gc, which deletes containers belonging to pods considered "deleted". It adds two conditions under which a pod is considered "deleted", allowing containers to be deleted: Pods where deletionTimestamp is set, and containers are not running Pods that are evicted This PR also changes the function PodResourcesAreReclaimed by making it return false if containers still exist. The eviction manager will wait for containers of previous evicted pod to be deleted before evicting another pod. The status manager will wait for containers to be deleted before removing the pod API object. /assign @vishh
99 lines
3.1 KiB
Go
99 lines
3.1 KiB
Go
/*
|
|
Copyright 2016 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 kuberuntime
|
|
|
|
import (
|
|
"net/http"
|
|
"time"
|
|
|
|
cadvisorapi "github.com/google/cadvisor/info/v1"
|
|
"k8s.io/apimachinery/pkg/types"
|
|
"k8s.io/client-go/tools/record"
|
|
"k8s.io/client-go/util/flowcontrol"
|
|
"k8s.io/kubernetes/pkg/credentialprovider"
|
|
internalapi "k8s.io/kubernetes/pkg/kubelet/apis/cri"
|
|
"k8s.io/kubernetes/pkg/kubelet/cm"
|
|
kubecontainer "k8s.io/kubernetes/pkg/kubelet/container"
|
|
"k8s.io/kubernetes/pkg/kubelet/images"
|
|
"k8s.io/kubernetes/pkg/kubelet/lifecycle"
|
|
proberesults "k8s.io/kubernetes/pkg/kubelet/prober/results"
|
|
)
|
|
|
|
type fakeHTTP struct {
|
|
url string
|
|
err error
|
|
}
|
|
|
|
func (f *fakeHTTP) Get(url string) (*http.Response, error) {
|
|
f.url = url
|
|
return nil, f.err
|
|
}
|
|
|
|
type fakePodDeletionProvider struct {
|
|
pods map[types.UID]struct{}
|
|
}
|
|
|
|
func newFakePodDeletionProvider() *fakePodDeletionProvider {
|
|
return &fakePodDeletionProvider{
|
|
pods: make(map[types.UID]struct{}),
|
|
}
|
|
}
|
|
|
|
func (f *fakePodDeletionProvider) IsPodDeleted(uid types.UID) bool {
|
|
_, found := f.pods[uid]
|
|
return !found
|
|
}
|
|
|
|
func NewFakeKubeRuntimeManager(runtimeService internalapi.RuntimeService, imageService internalapi.ImageManagerService, machineInfo *cadvisorapi.MachineInfo, osInterface kubecontainer.OSInterface, runtimeHelper kubecontainer.RuntimeHelper, keyring credentialprovider.DockerKeyring) (*kubeGenericRuntimeManager, error) {
|
|
recorder := &record.FakeRecorder{}
|
|
kubeRuntimeManager := &kubeGenericRuntimeManager{
|
|
recorder: recorder,
|
|
cpuCFSQuota: false,
|
|
livenessManager: proberesults.NewManager(),
|
|
containerRefManager: kubecontainer.NewRefManager(),
|
|
machineInfo: machineInfo,
|
|
osInterface: osInterface,
|
|
runtimeHelper: runtimeHelper,
|
|
runtimeService: runtimeService,
|
|
imageService: imageService,
|
|
keyring: keyring,
|
|
internalLifecycle: cm.NewFakeInternalContainerLifecycle(),
|
|
}
|
|
|
|
typedVersion, err := runtimeService.Version(kubeRuntimeAPIVersion)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
kubeRuntimeManager.containerGC = NewContainerGC(runtimeService, newFakePodDeletionProvider(), kubeRuntimeManager)
|
|
kubeRuntimeManager.runtimeName = typedVersion.RuntimeName
|
|
kubeRuntimeManager.imagePuller = images.NewImageManager(
|
|
kubecontainer.FilterEventRecorder(recorder),
|
|
kubeRuntimeManager,
|
|
flowcontrol.NewBackOff(time.Second, 300*time.Second),
|
|
false,
|
|
0, // Disable image pull throttling by setting QPS to 0,
|
|
0,
|
|
)
|
|
kubeRuntimeManager.runner = lifecycle.NewHandlerRunner(
|
|
&fakeHTTP{},
|
|
kubeRuntimeManager,
|
|
kubeRuntimeManager)
|
|
|
|
return kubeRuntimeManager, nil
|
|
}
|