Pod 删除和 Pod 逐出有什么区别?

What's the difference between pod deletion and pod eviction?

PodInterface来看,DeleteEvict这两个操作似乎具有相同的效果:删除旧的Pod并创建新的Pod。

如果两个操作是一样的效果,为什么我们需要两个API来删除一个Pod并创建一个新的Pod?

pod 的删除由最终用户完成,属于正常情况 activity。这意味着 pod 将从 ETCD 和 kubernetes 控制平面中删除。除非有更高级别的控制器,如 deployment、daemonset、statefulset 等,否则不会再次创建 pod 并将其调度到 kubernetes 工作节点。

如果 pod 的资源消耗超过限制并且 kubelet 触发 pod 的驱逐或用户执行 kubectl drain 或手动调用 eviction API,则会发生驱逐。它通常不是正常的 activity 。有时被驱逐的 pods 不会自动从 ETCD 和 kubernetes 控制平面中删除。除非有更高级别的控制器,如 deployment、daemonset、statefulset 等,否则不会再次创建被逐出的 pod 并将其调度到 kubernetes 工作节点。

最好使用 delete 而不是 evict,因为与 delete 相比,evict 具有更大的风险,因为在某些情况下,如果应用程序的控制器(部署等)创建的替换 pod 被删除,则应用程序可能会导致应用程序崩溃。 ) 没有准备好,或者如果最后一个被逐出的 pod 有很长的终止宽限期

Pod evict 操作(假设您指的是 Eviction API)是一种更智能的删除操作,它尊重 PodDisruptionBudget,因此它确实尊重应用程序的 high-availability 要求(只要 PodDisruptionBudget 配置正确)。通常您不会手动驱逐 Pod,但是 Pod 驱逐可以作为节点清空操作的一部分启动(可以通过 kubectl drain 命令手动调用或通过 Cluster Autoscaler组件)。

另一方面,

Pod delete 操作不遵守 PodDisruptionBudget,因此可以影响应用程序的可用性。与 evict 操作相反,此操作通常手动调用(例如通过 kubectl delete 命令)。

此外,除了 驱逐 API,pods 可以被 kubelet 驱逐,因为 Node-pressure 条件,在这种情况下 PodDisruptionBudget 不受 Kubernetes 的尊重(参见 Node-pressure Eviction