首页 > 其他分享 >K8s 删除Terminating状态Pod

K8s 删除Terminating状态Pod

时间:2022-08-21 17:11:54浏览次数:52  
标签:控制器 删除 kubelet 对象 finalizers Terminating Pod K8s metadata

K8s 删除Terminating状态Pod

删除nfs的svc之后删除pod一直卡在Terminating状态

 

 

分析无法删除的原因

在了解以上机制后,对象无法删除无外乎以下两个原因:

  • 对象存在 finalizers,关联的控制器故障未能执行或执行 finalizer 函数卡住
    • 比如namespace控制器无法删除完空间内所有的对象,特别是在使用 aggregated apiserver 时,第三方 apiserver 服务故障导致无法删除其对象。此时,需要会恢复第三方 apiserver 服务或移除该 apiserver 的聚合,具体选择哪种方案需根据实际情况而定。
    • 集群内安装的控制器给一些对象增加了自定义 finalizers ,未删除完 fianlizers 就下线了该控制器,导致这些 fianlizers 没有控制器来移除他们。此时,需要恢复该控制器会手动移除 finalizers,具体选择哪种方案根据实际情况而定。
  • 对象需要优雅删除,但执行者不能完成删除。比如 Pod 因为 kubelet 无法下线节点上 node 容器、存储卷而无法删除。比较常见有以下原因:
    • kubelet 无法通过 container runtime 杀死进程。比如进程进入 D (Uninterruptible) 状态,container runtime 或操作内核遇到 bug 等。对于进程进入 D 状态,若能恢复照成 D 的故障,比如恢复关联的外设访问等,能解决问题。若不能,或者是因为后者内核 bug,一般并不能走正常流程让 kubelet 杀死进程。一般需要重启操作系统才能解决。
    • kubelet 进程停止或者 node 失去联系。 该情况下,并没有 kubelet 运行或者运行中的 kubelet 与 apiserver 已经断开,无法收到 pod 需要删除下线的消息。所以,没有执行者来进行优雅删除。该情况下,需要恢复节点以及 kubelet 的运行即可。

方法一: 强制删除

#kubectl delete pod app-nfs --force --grace-period=0
warning: Immediate deletion does not wait for confirmation that the runningresource has been terminated. The resource may continue to run on the cluster indefinitely.
pod "app-nfs" force deleted

方法二: 设置finalizers为空

如果一个容器已经在运行,这时需要对一些容器属性进行修改,又不想删除容器,或不方便通过replace的方式进行更新。kubernetes还提供了一种在容器运行时,直接对容器进行修改的方式,就是patch命令。

Finalizers 字段属于 Kubernetes GC 垃圾收集器,是一种删除拦截机制,能够让控制器实现异步的删除前(Pre-delete)回调。其存在于任何一个资源对象的 Meta中,在 k8s 源码中声明为 []string,该 Slice 的内容为需要执行的拦截器名称。

常见用途:

(1)控制器在对象刚创建时,在 metadata.finalizers 写入一个自定义字符串
(2)APIServer 在 metadata.finalizers 数组不为空时,不会删除对象。此逻辑是硬性,对所有对象生效。
(3)当有客户端删除对象时,控制器可以发现对象出于删除状态,然后执行相应的 pre-delete 逻辑。执行完成后,将之前写入的自定义字符串移除。
(4)当所有控制器都将各自写入到 metadata.finalizers 的字符串移除后。API Server 就自动将对象删除。
   注:若对象同时实现了 graceful 删除策略,删除请求需要满足 GracefulPeriodSeconds = 0 条件

#kubectl patch pod app-nfs  -p '{"metadata":{"finalizers":null}}'

 

k8s删除流程

基本的delete命令状态图

 

 

 

K8s 中对象删除基本流程如下:

(1)客户端提交删除请求到 API Server(可选传递 GracePeriodSeconds 参数)
(2)API Server 做 Graceful Deletion 检查(若对象实现了 RESTGracefulDeleteStrategy 接口,会调用对应的实现并返回是否需要进行 Graceful 删除)
(3)API Server 检查 Finalizers 并结合是否需要进行 graceful 删除,来决定是否立即删除对象(若对象需要进行 graceful 删除,更新 metadata.DeletionGracePeriodSecond 和metadata.DeletionTimestamp 字段,不从存储中删除对象;若对象不需要进行 Graceful 删除时 metadata.Finalizers 为空,直接删除。metadata.Finalizers 不为空,不删除,只更新 metadata.DeletionTimestamp。

 

标签:控制器,删除,kubelet,对象,finalizers,Terminating,Pod,K8s,metadata
From: https://www.cnblogs.com/weiweirui/p/16610336.html

相关文章

  • k8s部署Wordpress(定义不同的资源对象文件)
    1)新建namespace(名称空间)新建wordpress-blognamespace,将应用都部署到wordpress-blog这个命名空间下面。[23:17:36root@k8s-master~]#llnamespace.yamlpod.ymlse......
  • k8s--HPA 控制器
    HorizontalPodAutoscaler(HPA)控制器介绍在前面的学习中,我们已经可以实现通过手工执行kubectlscale命令实现pod扩容或缩容,但是这显示不符合kubernetes的定位目......
  • k8s
    架构与组件Master——控制节点APIServer,由API组件构成,负责提供API服务Scheduler,负责集群调度ControllerManagerNode——计算节点,本质是通过各种协议对简单容......
  • 基于NFS实现pod数据持久化
    一、nfs-server服务端:挂载一块新磁盘1.1、格式化并挂载parted/dev/vdbmklablexfsparted/dev/vdbprimay0%100%mkfs.xfs/dev/vdb1 echo"/dev/vdb1/nfs_sharex......
  • Kubernetes学习笔记(十四):Static Pods
    kubelet依赖于kube-apiserver来获得关于在其node上加载哪些pod的指令,这是基于存储在etcd数据库中的kube-scheduler所做的决定。kubelet也可以独立运行,可以创建pod,可以指定......
  • 定义pod的hosts文件(HostAliases)
    通过HostAliases向Pod/etc/hosts文件添加条目当DNS配置以及其它选项不合理的时候,通过向Pod的/etc/hosts文件中添加条目,可以在Pod级别覆盖对主机名的解析。......
  • 在Ubuntu20.04上使用kubeadm搭建k8s集群(2022年8月版本为v1.24.4)
    1.一些真心话在开始之前,需要将重要的事情说三遍:一定要认真阅读官方文档!一定要认真阅读官方文档!!一定要认真阅读官方文档!!!我在搭建k8s之前看了网上很多教程,也尝试的执行了......
  • k8s--DaemonSet(DS) 控制器
    介绍DaemonSet类型的控制器可以保证在集群中的每一台(或指定)节点上都运行一个副本。一般用于日志收集、节点监控等场景。也就是说,如果一个pod提供的功能是节点级别的(每......
  • k8s构建LNMP
    构建nginx资源      创建nginx配置文件root@deploy:/dockerfile/project/nginx#catnginx.confusernginx;worker_processesauto;#error_loglogs/erro......
  • 基于Jenkins+k8s+Git等技术构建DeOps平台
    一、DeOps简介1.什么是DeOps?   1.1敏捷开发提高开发效率,及时跟进用户需求,缩短开发周期。敏捷开发包括编写代码和构建代码两个阶段,可以使用git或者svn......