diff options
| author | fisherxu <xufei40@huawei.com> | 2020-01-16 18:05:40 +0800 |
|---|---|---|
| committer | fisherxu <xufei40@huawei.com> | 2020-04-18 14:16:29 +0800 |
| commit | a773b4174fb4c893b0608c6afd7edb526a44e22c (patch) | |
| tree | 09a941661994a6095caba9e3e3b0503f30d6c73c /edge | |
| parent | Merge pull request #1573 from fisherxu/metrics-edge (diff) | |
| download | kubeedge-a773b4174fb4c893b0608c6afd7edb526a44e22c.tar.gz | |
add deletion of pod in edged
Diffstat (limited to 'edge')
| -rw-r--r-- | edge/pkg/edged/edged_pods.go | 39 | ||||
| -rw-r--r-- | edge/pkg/edged/status/status_manager.go | 19 | ||||
| -rw-r--r-- | edge/pkg/edged/util/pod/pod_deletion.go | 19 |
3 files changed, 58 insertions, 19 deletions
diff --git a/edge/pkg/edged/edged_pods.go b/edge/pkg/edged/edged_pods.go index 64aeccda1..b5bf1d073 100644 --- a/edge/pkg/edged/edged_pods.go +++ b/edge/pkg/edged/edged_pods.go @@ -1313,3 +1313,42 @@ func (e *edged) validateContainerLogStatus(podName string, podStatus *v1.PodStat return kubecontainer.ParseContainerID(cID), nil } + +// PodResourcesAreReclaimed returns true if all required node-level resources that a pod was consuming have +// been reclaimed by the kubelet. Reclaiming resources is a prerequisite to deleting a pod from the API server. +func (e *edged) PodResourcesAreReclaimed(pod *v1.Pod, status v1.PodStatus) bool { + if !notRunning(status.ContainerStatuses) { + // We shouldn't delete pods that still have running containers + klog.V(3).Infof("Pod %q is terminated, but some containers are still running", format.Pod(pod)) + return false + } + // pod's containers should be deleted + runtimeStatus, err := e.podCache.Get(pod.UID) + if err != nil { + klog.V(3).Infof("Pod %q is terminated, Error getting runtimeStatus from the podCache: %s", format.Pod(pod), err) + return false + } + if len(runtimeStatus.ContainerStatuses) > 0 { + var statusStr string + for _, status := range runtimeStatus.ContainerStatuses { + statusStr += fmt.Sprintf("%+v ", *status) + } + klog.V(3).Infof("Pod %q is terminated, but some containers have not been cleaned up: %s", format.Pod(pod), statusStr) + return false + } + if e.podVolumesExist(pod.UID) { + // We shouldn't delete pods whose volumes have not been cleaned up if we are not keeping terminated pod volumes + klog.V(3).Infof("Pod %q is terminated, but some volumes have not been cleaned up", format.Pod(pod)) + return false + } + + if edgedconfig.Config.CgroupsPerQOS { + pcm := e.containerManager.NewPodContainerManager() + if pcm.Exists(pod) { + klog.V(3).Infof("Pod %q is terminated, but pod cgroup sandbox has not been cleaned up", format.Pod(pod)) + return false + } + } + + return true +} diff --git a/edge/pkg/edged/status/status_manager.go b/edge/pkg/edged/status/status_manager.go index df8bc0103..da8ab5236 100644 --- a/edge/pkg/edged/status/status_manager.go +++ b/edge/pkg/edged/status/status_manager.go @@ -10,6 +10,7 @@ import ( clientset "k8s.io/client-go/kubernetes" "k8s.io/klog" "k8s.io/kubernetes/pkg/kubelet/status" + "k8s.io/kubernetes/pkg/kubelet/util/format" edgeapi "github.com/kubeedge/kubeedge/common/types" "github.com/kubeedge/kubeedge/edge/pkg/edged/podmanager" @@ -24,6 +25,7 @@ type manager struct { podManager podmanager.Manager apiStatusVersions map[types.UID]*v1.PodStatus metaClient client.CoreInterface + podDeletionSafety status.PodDeletionSafetyProvider } //NewManager creates and returns a new manager object @@ -34,9 +36,17 @@ func NewManager(kubeClient clientset.Interface, podManager podmanager.Manager, p metaClient: metaClient, podManager: podManager, apiStatusVersions: make(map[types.UID]*v1.PodStatus), + podDeletionSafety: podDeletionSafety, } } +func (m *manager) canBeDeleted(pod *v1.Pod, status v1.PodStatus) bool { + if pod.DeletionTimestamp == nil { + return false + } + return m.podDeletionSafety.PodResourcesAreReclaimed(pod, status) +} + const syncPeriod = 10 * time.Second func (m *manager) Start() { @@ -56,6 +66,15 @@ func (m *manager) updatePodStatus() { uid := pod.UID podStatus, ok := m.GetPodStatus(uid) if !ok { + // We don't handle graceful deletion of mirror pods. + if m.canBeDeleted(pod, podStatus) { + err := m.metaClient.Pods(pod.Namespace).Delete(pod.Name) + if err != nil { + klog.Warningf("Failed to delete status for pod %q: %v", format.Pod(pod), err) + } else { + klog.Errorf("Successfully sent delete event to cloud for pod: %s", format.Pod(pod)) + } + } continue } latestStatus, ok := m.apiStatusVersions[uid] diff --git a/edge/pkg/edged/util/pod/pod_deletion.go b/edge/pkg/edged/util/pod/pod_deletion.go deleted file mode 100644 index 6efd47c9f..000000000 --- a/edge/pkg/edged/util/pod/pod_deletion.go +++ /dev/null @@ -1,19 +0,0 @@ -package pod - -import ( - "k8s.io/api/core/v1" - "k8s.io/kubernetes/pkg/kubelet/status" -) - -type podDeletionSafety struct{} - -// TODO: add this function -// now assume pod can always be safety delete -func (p *podDeletionSafety) PodResourcesAreReclaimed(pod *v1.Pod, status v1.PodStatus) bool { - return true -} - -//NewPodDeleteSafety returns status of pod deletion safety -func NewPodDeleteSafety() status.PodDeletionSafetyProvider { - return &podDeletionSafety{} -} |
