1. pod删除

每当删除namespace或pod 等一些Kubernetes资源时,有时资源状态会卡在terminating,很长时间无法删除,甚至有时增加--force flag(强制删除)之后还是无法正常删除。这时就需要edit该资源,将字段finalizers设置为null,之后Kubernetes资源就正常删除了。

当删除pod时有时会卡住,pod状态变为terminating,无法删除pod

(1)强制删除

kubectl delete pod xxx -n xxx --force --grace-period=0

(2)如果强制删除还不行,设置finalizers为空

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

kubectl patch pod xxx -n xxx -p '{"metadata":{"finalizers":null}}'

这样pod就可以删除了。

2. k8s删除流程

基本的delete命令状态图:

尽管此操作很简单,但其他因素可能会干扰删除,包括finalizers和owner references。

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。

2.1 finalizers介绍

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 条件

2.2 Graceful Deletion

APIServer 在处理 Pod 删除请求时,会根据 pod 的 pod.Spec.TerminationGracePeriodSeconds 和 deleteOptions.GracefulPeriodSeconds 综合判断,是否进行 Graceful 删除。若是,并判断最终的 GracefulPeriodSeconds 该设置为多少。

(1)当删除请求选项中有设置 GracefulPeriodSeconds,以选项中为准。若没有,使用 pod.Spec.TerminationGracePeriodSeconds 。若 pod.Spec.TerminationGracePeriodSeconds 也没有设置,使用默认值 0 。

(2)当 Pod 没有调度,或者已经结束(无论成功还是失败)。GracePeriodSeconds 都重置为 0.

GracePeriodSeconds 为 0 表示不进行优雅删除。非 0 表示进行优雅删除。Pod 的默认优雅删除时间为 30 s ,在对象创建时配置在 pod.Spec.TerminationGracePeriodSeconds 字段。

优雅删除的目的是给予 Kubelet 一定时间对 Pod 实行优雅退出。在用户对 Pod 执行 Delete 操作时,Pod 对象不会立即从 API Server 删除,而只是进入 Termination 阶段。Kubelet 会对运行中的 Pod 的容器发送 TERM 信号,通知其退出。并执行用户配置的 preStop hooks 逻辑。当优雅时间过了之后,再开始使用 KILL 信号尝试强制杀容器。

当 kubelet 将 Pod 清理干净后,就会使用 GracefulPeriodSeconds==0 的参数执行删除操作。

因为 Pod 实现优雅删除目的是为了给予 Kubelet 时间做资源清理操作,所以这也是为什么在设置 GracePeriodSeconds 阶段,若 Pod 没有被调度或者已经退出,也就可以直接允许立即删除 (GracePeriodSeconds = 0)。

注:

  • 理解该流程可以结合 Kubernetes 官网的 Pod Termination 说明:https://kubernetes.io/docs/concepts/workloads/pods/pod/#termination-of-pods
  • 对象第一次执行优雅删除操作时,会将当时 GracefulPeriodSeconds 配置在 metadata.DeletionGracefulPeriodSeconds 字段。
  • Deletion 操作在 API Server 是不可回退的操作。metadata.DeletionTimestamp 设置后不可更改,metadata.DeletionGracefulPeriodSeconds 只能减小,不能增加。

2.3 对象无法删除的原因

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

  • 对象存在 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 的运行即可。

两种机制都有强制跳过的方案:

  • 删除 finalizers ,让关联的逻辑不需要执行
  • kubelet delete --force --grace-period 0 直接删除

但应仅当关联清理工作已经不重要或已手动执行时,才可选择。不然容易照成数据、状态不一致等。

参考自(http://cache.baiducontent.com/c?m=0xZGNnAjSzsVUWz26c6ab6_xOZAVpF9kIAa06vEoIPs5q2EdFL8vYpWPCdzecF_UtC-022Xad3qrPTvPURmF3vdMwmhIVA8_oAiZVHhP5zdPvUBc6kxLNsvFKbYAdbyj&p=906cc54ad3c717be499fc7710f56&newp=8b2a9715d9c645f20abfca22584092695d0fc20e38dcd601298ffe0cc4241a1a1a3aecbf2c281706d6c27d6c07af4b5cebf230743d0034f1f689df08d2ecce7e&s=cfcd208495d565ef&user=baidu&fm=sc&query=k8s+finalizers&qid=c7766d2b00019dc6&p1=10)

(https://www.stackovercloud.com/2021/05/14/blog-using-finalizers-to-control-deletion/)

K8s无法删除状态为terminating的pod解决方法相关推荐

  1. 服务器无法拖动文件复制文件,​IT服务器运维:艾锑人为您整理Win10系统下移动、复制、删除文件需要管理员权限的解决方法...

    影响我们一生百倍差距的四大效应 观察者效应:你的世界是什么样是由你的观察决定的. 这个效应是在[潜能突破]研习营课堂上发现的,我们有个练习叫三生万物,每个人都会成为一次观察者角色,当大家在成为其他角色 ...

  2. php zpo框架,Yii使用DeleteAll连表删除出现报错问题的解决方法

    本文实例讲述了Yii使用DeleteAll连表删除出现报错问题的解决方法.分享给大家供大家参考,具体如下: 删除数据的时候,经常会遇到连联判断删除数据的条件,今天用Yii 的CDbCriteria生成 ...

  3. win10计算机无法复制文件,Win10系统下移动、复制、删除文件需要管理员权限的解决方法...

    我们在使用Win10系统的时候,肯定会使用到移动.复制或者删除文件/文件夹的操作,但是你在操作的时候,却系统提示你需要管理员权限才可以进行操作,那么遇到这个问题我们要如何解决?下面装机之家分享一下Wi ...

  4. Oracle11g adump目录下面.aud增长导致空间撑满无法删除导致CRS无法启动的解决方法

    Oracle11g adump目录下面.aud增长导致空间撑满无法删除导致CRS无法启动的解决方法 参考文章: (1)Oracle11g adump目录下面.aud增长导致空间撑满无法删除导致CRS无 ...

  5. 磁盘管理器显示状态良好 计算机不显示,win7系统打开磁盘管理显示显示状态良好(有危险)的解决方法...

    win7系统打开磁盘管理显示显示状态良好(有危险)的解决方法? 我们在操作win7系统电脑的时候,常常会遇到win7系统打开磁盘管理显示显示状态良好(有危险)的问题.那么出现win7系统打开磁盘管理显 ...

  6. 怎么删除计算机的打印机设备,win7系统的打印机删除不掉怎么办?完美解决方法看这里!...

    平时我们在使用win7系统电脑来进行学习.娱乐或办公的时候,我们往往会在电脑上添加上打印机,以此来更方便的将我们学习.工作或娱乐时所需要的东西打印出来,这样既不用跑去打印店打印,而且相比去打印店还更方 ...

  7. 计算机搜索记录为什么删除不掉,删除电脑上搜索引擎记录的解决方法

    现如今,网络的发展给我们的生活带来了很多的便利,让我们的生活与外界紧密联系在一起.但是也给我们带来了不少的困扰,我们的隐私安全得不到保障.特别是我们在利用浏览器搜索东西的记录,几乎是完全曝光的.因此, ...

  8. 在win7中访问删除linux硬盘分区,win7和linux双系统下,删除linux不能启动win7的解决方法...

    win7和linux双系统下,删除linux不能启动win7的解决方法 (6页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.90 积分 双系统下删除 ...

  9. 压缩包需要计算机管理员权限,压缩文件删除不了要访问权限解决方法

    很多的小伙伴最近再删除压缩文件的时候都遇到了一个问题就是提示需要管理员权限才能删除,那么该怎么解决这个问题呢?下面就为大家带来了解决方法. 压缩文件删除不了需要管理员权限: 方法一.制作管理员授权文件 ...

最新文章

  1. AI一分钟 | 英伟达发布Tesla T4 GPU新品;腾讯发布《2018 年全球自动驾驶法律政策研究报告》...
  2. [图]为C# Windows服务添加安装程序
  3. zabbix专题:第三章 Zabbix Agent客户端安装详解
  4. cocos工程里面“”invalid ''cobl” in fuction xxx原理与解决方案
  5. java学习之路--面试之多线程基础
  6. java实现ldap服务器_Java到LDAP教程(包括如何安装LDAP服务器/客户端)
  7. H.264中IDR帧和I帧区别
  8. FTP上传下载使用ASCII与binary的区别
  9. Android查看CPU和GPU使用率
  10. loongson龙芯屏幕分辨率设置1280×1024
  11. 人机交互-8-交互式系统设计
  12. axure 侧滑抽屉式菜单_Axure教程之抽屉菜单
  13. coffeescript基本语法
  14. 最新版WIN10安装教程(官方纯净版)(适用于新机以及旧机重装系统或升级系统)
  15. 吃透JAVA的Stream流操作,多年实践总结
  16. linux网络编程中端口号和ip地址转换方法
  17. 系统对接方案_钉钉报销单对接财务系统解决方案
  18. 总线体现在硬件上就是计算机主板,计算机考试练习题
  19. 推荐这几个前端公众号,助力学习前端
  20. 如何调用Revit API实现风道末端与风管连接?

热门文章

  1. 使用接口回调实现Activity的通信
  2. 金山实习日记·第二天(2008-07-15)
  3. 基于stm32f103c8t6的智能小车
  4. 田间作物高通量表型信息获取与分析技术研究进展(论文笔记)
  5. Quartz (1) 入门例子
  6. 滤波器设计(3):维纳(Wiener)滤波器的设计
  7. 差分晶振LVPECL与LVDS的区别
  8. (OK) MIMP - 18 ( 5 nodes) - 抓包-缺少 MPTCP-JION - 分析 mptcp-kmsg-client-5-nodes-ping.txt
  9. 写出一个程序,接受一个由字母、数字和空格组成的字符串,和一个字符,然后输出输入字符串中该字符的出现次数。(不区分大小写字母)
  10. javabean+servlet+Jsp