summaryrefslogtreecommitdiff
path: root/edge
diff options
context:
space:
mode:
authorfisherxu <xufei40@huawei.com>2020-01-16 18:05:40 +0800
committerfisherxu <xufei40@huawei.com>2020-04-18 14:16:29 +0800
commita773b4174fb4c893b0608c6afd7edb526a44e22c (patch)
tree09a941661994a6095caba9e3e3b0503f30d6c73c /edge
parentMerge pull request #1573 from fisherxu/metrics-edge (diff)
downloadkubeedge-a773b4174fb4c893b0608c6afd7edb526a44e22c.tar.gz
add deletion of pod in edged
Diffstat (limited to 'edge')
-rw-r--r--edge/pkg/edged/edged_pods.go39
-rw-r--r--edge/pkg/edged/status/status_manager.go19
-rw-r--r--edge/pkg/edged/util/pod/pod_deletion.go19
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{}
-}