当前位置: 首页 > news >正文

【k8s】使用Finalizers控制k8s资源删除

文章目录

  • 词汇表
  • 基本删除操作
  • Finalizers是什么?
  • Owner References又是什么?
  • 强制删除命名空间
  • 参考

你有没有在使用k8s过程中遇到过这种情况: 通过kubectl delete指令删除一些资源时,一直处于Terminating状态。
这是为什么呢?

本文将介绍当你执行kubectl delete语句时,K8s内部都执行了哪些操作。
以及为何有些资源’删除不掉’(具体表现为一直Terminating,删除namespace时很容易遇到这种情况)

接下来,我们聚焦讨论以下四个方面:

资源的哪些属性会对删除操作产生影响?

  • finalizers与owner references属性是如何影响删除操作的?
  • 如何利用Propagation Policy(分发策略)更改删除顺序?
  • 删除操作的工作原理?

方便起见,以下所有示例都将使用ConfigMaps和基本shell命令来演示该过程

词汇表

  • 资源: k8s的资源对象(如configmap, secret, pod…)
  • finalizers: 终结器,存放键的列表。列表内的键为空时资源才可被删除
  • owner references: 所有者引用(归谁管理/父资源对象是谁)
  • kubectl: K8s客户端工具

基本删除操作

Kubernetes提供了几个不同的命令,您可以使用它们来创建、读取、更新和删除对象。
出于本文的目的,我们将重点讨论四个kubectl命令:create、get、patch和delete.

下面是kubectl delete命令的基本示例

创建名为mymap的configmap对象:

$ kubectl create configmap mymap
configmap/mymap created

查看名为mymap的configmap对象:

$ kubectl get configmap/mymap
NAME    DATA   AGE
mymap   0      12s

删除名为mymap的configmap对象:

$ kubectl delete configmap/mymap
configmap "mymap" deleted

基本delete命令的删除操作状态图非常简单:

在这里插入图片描述
删除操作看似简单,但是有很多因素可能会干扰删除,包括finalizers与owner references属性

Finalizers是什么?

上面我们提到了两个属性:finalizers与owner references可能会干扰删除操作,导致删除阻塞或失败。
那Finalizers是什么?会对删除有何影响呢?

当要理解Kubernetes中的资源删除原理时,了解finalizers(以下我们称finalizers为终结器)的工作原理是很有帮助的,
可以帮助您理解为什么有些对象无法被删除。

终结器是资源发出预删除操作信号的属性,
控制着资源的垃圾收集,并用于提示控制器在删除资源之前执行哪些清理操作。

finalizers本质是包含键的列表,不具有实际意义。与annotations(注释)类似,finalizers是可以被操作的(增删改)。

以下终结器您可能遇到过:

  • kubernetes.io/pv-protection
  • kubernetes.io/pvc-protection

这两个终结器作用于卷,以防止卷被意外删除。

类似地,一些终结器可用于防止资源被删除,但不由任何控制器管理。
下面是一个自定义的configmap,它没有具体值,但包含一个终结器:

$ cat <<EOF | kubectl create -f -
apiVersion: v1
kind: ConfigMap
metadata:name: mymapfinalizers:- kubernetes
EOF

终结器通常用于名称空间(namespace),而管理configmap资源的控制器不知道该如何处理finalizers字段。
下面我们尝试删除这个configmap对象:

$ kubectl delete configmap/mymap &
configmap "mymap" deleted
$ jobs
[1]+  Running kubectl delete configmap/mymap

Kubernetes返回该对象已被删除,然而它并没有真正意义上被删除,而是在删除的过程中。
当我们试图再次获取该对象时,我们发现该对象多了个deletionTimestamp(删除时间戳)字段。

$ kubectl get cm mymap -o yaml
apiVersion: v1
kind: ConfigMap
metadata:creationTimestamp: "2021-09-29T11:04:40Z"deletionGracePeriodSeconds: 0deletionTimestamp: "2021-09-29T11:04:55Z"finalizers:- kubernetesmanagedFields:- apiVersion: v1fieldsType: FieldsV1fieldsV1:f:metadata:f:finalizers:.: {}v:"kubernetes": {}manager: kubectloperation: Updatetime: "2021-09-29T11:04:40Z"name: mymapnamespace: defaultresourceVersion: "1378430"selfLink: /api/v1/namespaces/default/configmaps/mymapuid: 8d6ca0b1-4840-4597-8164-a63b526dbf5f

简而言之,当我们删除带有finalizers字段的对象时,该对象仅仅是被更新了,被标记为待删除状态,而不是被删除了。
这是因为Kubernetes获取到该对象包含终结器,通过添加deletionTimestamp(删除时间戳)字段将其置于只读状态(删除终结器键更新除外)。
换句话说,在删除该对象终结器之前,删除都不会完成。

接下来我们尝试通过patch命令删除终结器,并观察configmap/mymap是否会被’真正’删除。

$ kubectl patch configmap/mymap \--type json \--patch='[ { "op": "remove", "path": "/metadata/finalizers" } ]'
configmap/mymap patched

再次检索该对象:

$ kubectl get cm mymap
Error from server (NotFound): configmaps "mymap" not found

发现该对象已被真正删除,下图描述了带有finalizers字段的对象删除流程:
在这里插入图片描述

总结:当您试图删除一个带有终结器的对象,它将一直处于预删除只读状态,
直到控制器删除了终结器键或使用Kubectl删除了终结器。一旦终结器列表为空,Kubernetes就可以回收该对象,并将其放入要从注册表中删除的队列中

  • 对象存在finalizers,关联的控制器故障未能执行或执行finalizer函数hang住: 比如namespace控制器无法删除完空间内所有的对象,
    特别是在使用aggregated apiserver时,第三方apiserver服务故障导致无法删除其对象。
    此时,需要会恢复第三方apiserver服务或移除该apiserver的聚合,具体选择哪种方案需根据实际情况而定。
  • 集群内安装的控制器给一些对象增加了自定义finalizers,未删除完fianlizers就下线了该控制器,导致这些fianlizers没有控制器来移除他们。
    此时,需要恢复该控制器会手动移除finalizers(多出现于自定义operator),具体选择哪种方案根据实际情况而定。

Owner References又是什么?

上面我们提到了两个属性:finalizers与owner references可能会干扰删除操作,导致删除阻塞或失败。
并介绍了Finalizers,接下来我们聊聊Owner References.

Owner References(所有者引用或所有者归属)描述了对象组之间的关系。
指定了资源彼此关联的属性,因此可以级联删除整个资源树。

当存在所有者引用时,将处理终结器规则。所有者引用由名称和UID组成

所有者引用相同名称空间内的链接资源,它还需要UID以使该引用生效(确保唯一)。
Pods通常具有对所属副本集的所有者引用。 因此,当Deloyment或有StatefulSet被删除时,子ReplicaSet和Pod将在流程中被删除。

我们通过下面的例子,来理解Owner References(所有者引用)的工作原理:

1.创建cm/mymap-parent对象

$ cat <<EOF | kubectl create -f -
apiVersion: v1
kind: ConfigMap
metadata:name: mymap-parent
EOF

2.获取cm/mymap-parent的UID

CM_UID=$(kubectl get configmap mymap-parent -o jsonpath="{.metadata.uid}")

3.创建cm/mymap-child对象,并设置ownerReferences字段声明所有者引用(通过kind、name、uid字段确保选择器可以匹配到)

cat <<EOF | kubectl create -f -
apiVersion: v1
kind: ConfigMap
metadata:name: mymap-childownerReferences:- apiVersion: v1kind: ConfigMapname: mymap-parentuid: $CM_UID
EOF

即cm/mymap-parent为cm/mymap-child的父对象,此时我们删除cm/mymap-parent对象并观察cm/mymap-child对象状态

$ kubectl get cm
NAME           DATA   AGE
mymap-child    0      2m44s
mymap-parent   0      3m$ kubectl delete cm mymap-parent
configmap "mymap-parent" deleted$ kubectl get cm
No resources found in default namespace.

即我们通过删除父对象,间接删除了父对象下的所有子对象。 这种删除k8s中被称为级联删除。我们可不可以只删除父对象,而不删除子对象呢?

答案是: 可以的,删除时通过添加–cascade=false参数实现,我们通过下面的例子来验证:

$ cat <<EOF | kubectl create -f -
apiVersion: v1
kind: ConfigMap
metadata:name: mymap-parent
EOF$ CM_UID=$(kubectl get configmap mymap-parent -o jsonpath="{.metadata.uid}")$ cat <<EOF | kubectl create -f -
apiVersion: v1
kind: ConfigMap
metadata:name: mymap-childownerReferences:- apiVersion: v1kind: ConfigMapname: mymap-parentuid: $CM_UID
EOF$ kubectl delete --cascade=false configmap/mymap-parent
configmap "mymap-parent" deleted$ kubectl get cm
NAME          DATA   AGE
mymap-child   0      107s

–cascade=false参数实际改变了父-子资源的删除顺序,k8s中关于父-子资源删除策略有以下三种:

  • Foreground: 子资源在父资源之前被删除(post-order)
  • Background: 父资源在子资源之前被删除 (pre-order)
  • Orphan: 忽略所有者引用进行删除

下面这段内容比较晦涩,没太理解:

Keep in mind that when you delete an object and owner references have been specified, finalizers will be honored in the process. 
This can result in trees of objects persisting, and you end up with a partial deletion. 
At that point, you have to look at any existing owner references on your objects,as well as any finalizers, to understand what’s happening

强制删除命名空间

有一种情况可能需要强制删除命名空间:

如果您已经删除了一个命名空间,并删除了它下面的所有对象,但名称空间仍然存在,一般为Terminating状态。
则可以通过更新名称空间的finalize属性来强制删除该名称空间。

会话1:

$ kubectl proxy

会话2:

$ NAMESPACE_NAME=test
cat <<EOF | curl -X PUT \127.0.0.1:8001/api/v1/namespaces/$NAMESPACE_NAME/finalize \-H "Content-Type: application/json" \--data-binary @-
{"kind": "Namespace","apiVersion": "v1","metadata": {"name": "$NAMESPACE_NAME"},"spec": {"finalizers": null}
}
EOF

我们应该谨慎思考是否强制删除命名空间,因为这样做可能只删除名称空间,命名空间下的其他资源删不完全,最终导致留下孤儿对象。
比如资源对象A存在于ddd命名空间,此时若强制删除ddd命名空间, 且对象A又未被删除,那么对象A便成了孤儿对象。

参考

使用Finalizers控制k8s资源删除
[kubernetes]Finalizers和优雅终止解析

相关文章:

【k8s】使用Finalizers控制k8s资源删除

文章目录 词汇表基本删除操作Finalizers是什么&#xff1f;Owner References又是什么&#xff1f;强制删除命名空间参考 你有没有在使用k8s过程中遇到过这种情况: 通过kubectl delete指令删除一些资源时&#xff0c;一直处于Terminating状态。 这是为什么呢&#xff1f; 本文将…...

vscode

文章目录 变量引用Multi-selections(multi-cursor)Column (box) selection在正则表达式替换中改变大小写tasks.jsonlaunch.json vscode工作空间下有一个.vscode文件夹&#xff0c;该文件夹下放置了vscode的配置文件&#xff0c;主要有&#xff1a; settings.json : vscode的设置…...

Jrebel 在 Idea 2023.3中无法以 debug 的模式启动问题

Jrebel 在 Idea 2023.3中无法以 debug 的模式启动问题 Idea 在升级了2023.3以后&#xff0c;Jrebel 无法以 debug 的模式启动&#xff0c;找了半天&#xff0c;最后在插件主页的评论区找到了解决方案 特此记录一下...

【C++】模版初阶(初识模版)

目录 一、引言 二、函数模版 &#xff08;一&#xff09;函数模版的原理 &#xff08;二&#xff09;函数模版的实例化 1.隐式实例化 2.显式实例化 &#xff08;三&#xff09;模板参数的匹配原则 三、类模版 类模版的实例化 一、引言 我们在练习题目的时候总会遇到需…...

智能优化算法应用:基于差分进化算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于差分进化算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于差分进化算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.差分进化算法4.实验参数设定5.算法结果6.…...

10 种隐藏元素的 CSS 技术

10 种隐藏元素的 CSS 技术 在 Web 开发中&#xff0c;在许多情况下我们可能希望操纵网站上某些元素的可见性。本文将考虑各种用例&#xff0c;探讨使用 CSS 隐藏元素的十种不同方法。 隐藏元素的具体行为可能会根据我们的需要而有所不同。我们可能需要为隐藏元素保留空间的方…...

SQL Server数据库使用T-SQL语句简单填充

文章目录 操作步骤&#xff1a;1.新建数据库起名RGB2.新建表起名rgb3.添加三个列名4.点击新建查询5.填入以下T-SQL语句&#xff0c;点击执行&#xff08;F5&#xff09;6.刷新之后&#xff0c;查看数据 操作环境&#xff1a; win10 Microsoft SQL Server Management Studio 20…...

逻辑回归代价函数

逻辑回归的代价函数通常使用交叉熵损失来定义。这种损失函数非常适合于二元分类问题。 本篇来推导一下逻辑回归的代价函数。 首先&#xff0c;我们在之前了解了逻辑回归的定义&#xff1a;逻辑回归模型是一种用于二元分类的模型&#xff0c;其预测值是一个介于0和1之间的概率…...

芯知识 | WT2003Hx系列高品质语音芯片MP3音频解码IC的特征与应用优势

在嵌入式语音领域&#xff0c;唯创知音WT2003Hx系列高品质语音芯片以其卓越的音频解码性能脱颖而出。本文将深入研究该系列芯片的特色与应用优势&#xff0c;重点关注其支持wav、Mp3格式音频解码、高品质播放等方面。 特色一&#xff1a;支持wav、Mp3格式音频解码 1.多格式兼…...

node.js 启一个前端代理服务

文章目录 前言一、分析技术二、操作步骤2.1、下载依赖2.2、创建一个 serve.js 文件2.3、js 文件中写入以下代码 三、运行&#xff1a; node serve四、结果展示五、总结六、感谢 前言 有时候我们需要做一些基础的页面时&#xff0c;在研发过程中需要代理调用接口避免浏览器跨域…...

弹性搜索引擎Elasticsearch:本地部署与远程访问指南

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、Cpolar杂谈 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言系统环境1. Windows 安装Elasticsearch2. 本地访问Elasticsearch3. Windows 安装…...

微信小程序生成二维码海报并分享

背景&#xff1a;点击图标&#xff0c;生成海报后&#xff0c;点击保存相册&#xff0c;可以保存 生成海报&#xff1a;插件wxa-plugin-canvas&#xff0c;此处使用页面异步生成组件方式&#xff0c;官网地址&#xff1a;wxa-plugin-canvas - npm 二维码&#xff1a;调用后端…...

Windows安装Tesseract OCR与Python中使用pytesseract进行文字识别

文章目录 前言一、下载并安装Tesseract OCR二、配置环境变量三、Python中安装使用pytesseract总结 前言 Tesseract OCR是一个开源OCR&#xff08;Optical Character Recognition&#xff09;引擎&#xff0c;用于从图像中提取文本。Pytesseract是Tesseract OCR的Python封装&am…...

【答案】2023年国赛信息安全管理与评估第三阶段夺旗挑战CTF(网络安全渗透)

【答案】2023年国赛信息安全管理与评估第三阶段夺旗挑战CTF&#xff08;网络安全渗透&#xff09; 全国职业院校技能大赛高职组信息安全管理与评估 &#xff08;赛项&#xff09; 评分标准 第三阶段 夺旗挑战CTF&#xff08;网络安全渗透&#xff09; *竞赛项目赛题* 本文…...

springboot 集成 redis luttuce redisson ,单机 集群模式(根据不同环境读取不同环境的配置)

luttuce 和redisson配置过程中实际上是独立的&#xff0c;他们两个可以同时集成&#xff0c;但是没有直接相关关系&#xff0c;配置相对独立。 所以分为Lettuce 和 Redisson 两套配置 父pom <!-- Spring Data Redis --><dependency><groupId>org.springframe…...

PPT插件-好用的插件-PPT 素材该怎么积累-大珩助手

PPT 素材该怎么积累&#xff1f; 使用大珩助手中的素材库功能&#xff0c;将Word中的&#xff0c;或系统中的文本文件、图片、其他word文档、pdf&#xff0c;所有见到的好素材&#xff0c;一键收纳。 步骤&#xff1a;选中文件&#xff0c;按住鼠标左键拖到素材库界面中&…...

qt 正则表达式简单介绍

正则表达式即一个文本匹配字符串的一种模式,Qt中使用QRegExp类进行模式匹配.主要应用:字符串验证,搜索,替换,分割..... 正则表达式中字符及字符集 c 匹配字符本身&#xff0c;如a匹配a \c 跟在\后面的字符匹配字符本身&#xff0c;但本表中下面指定的这些字符除外。 \a 匹…...

Redis设计与实现之跳跃表

目录 一、跳跃表 1、跳跃表的实现 2、跳跃表的应用 3、跳跃表的时间复杂度是什么&#xff1f; 二、跳跃表有哪些应用场景&#xff1f; 三、跳跃表和其他数据结构&#xff08;如数组、链表等&#xff09;相比有什么优点和缺点&#xff1f; 四、Redis的跳跃表支持并发操作吗…...

[每周一更]-(第27期):HTTP压测工具之wrk

[补充完善往期内容] wrk是一款简单的HTTP压测工具,托管在Github上,https://github.com/wg/wrkwrk 的一个很好的特性就是能用很少的线程压出很大的并发量. 原因是它使用了一些操作系统特定的高性能 io 机制, 比如 select, epoll, kqueue 等. 其实它是复用了 redis 的 ae 异步事…...

【FunASR】Paraformer语音识别-中文-通用-16k-离线-large-onnx

模型亮点 模型文件: damo/speech_paraformer-large-vad-punc_asr_nat-zh-cn-16k-common-vocab8404-pytorchParaformer-large长音频模型集成VAD、ASR、标点与时间戳功能&#xff0c;可直接对时长为数小时音频进行识别&#xff0c;并输出带标点文字与时间戳&#xff1a; ASR模型…...

手把手教你在麒麟系统用Docker-Compose部署MySQL+ClickHouse联合作业环境

麒麟系统实战&#xff1a;Docker-Compose编排MySQLClickHouse混合数据库环境 在数据分析领域&#xff0c;OLTP&#xff08;在线事务处理&#xff09;与OLAP&#xff08;在线分析处理&#xff09;系统的协同工作已成为现代数据架构的标配。MySQL作为经典的关系型数据库&#xff…...

Graphviz 节点位置控制技巧:从自动排版到精准布局

1. Graphviz自动排版的基本原理 第一次接触Graphviz时&#xff0c;很多人都会被它神奇的自动排版能力惊艳到。你只需要定义节点和边的关系&#xff0c;它就能自动生成整洁美观的图形。但用久了就会发现&#xff0c;这种"自动"有时候会变成"自作主张"。 Gra…...

如何在Mac M1上通过qemu-system-x86_64运行最小Linux系统(附性能优化技巧)

在Apple Silicon Mac上高效运行x86 Linux&#xff1a;QEMU跨架构模拟实战与深度调优 如果你手头只有一台搭载M1或M2芯片的Mac&#xff0c;但手头的项目、测试环境或学习资料偏偏需要一个x86架构的Linux系统&#xff0c;那种感觉就像拿着一把精密的瑞士军刀&#xff0c;却发现需…...

通过场分布分析光子晶体的色散

通过场分布得到光子晶体的色散光子晶体那彩虹般的色散特性总让人着迷&#xff0c;但真正上手计算时总有种「知道原理却不知怎么操作」的尴尬。今天咱们来点硬核实操&#xff0c;直接通过电磁场分布数据倒推色散关系——这个思路在缺陷态分析里尤其好用。先看核心逻辑&#xff1…...

终极指南:解决ShuffleNet-V2 PyTorch Caffe项目的常见问题

终极指南&#xff1a;解决ShuffleNet-V2 PyTorch & Caffe项目的常见问题 【免费下载链接】ShuffleNet_V2_pytorch_caffe ShuffleNet-V2 for both PyTorch and Caffe. 项目地址: https://gitcode.com/gh_mirrors/sh/ShuffleNet_V2_pytorch_caffe ShuffleNet-V2是一款…...

威联通QNAP通过Container快速部署Tranmission及美化UI实战

1. 为什么选择在威联通上跑Transmission&#xff1f; 如果你和我一样&#xff0c;是个喜欢折腾家庭影音库、有大量下载需求的人&#xff0c;那么一台威联通&#xff08;QNAP&#xff09;NAS绝对是你的好帮手。它不仅仅是个存储数据的“大硬盘”&#xff0c;更是一个功能强大的…...

Faiss 实战指南:从基础索引到高级应用

1. 初识Faiss&#xff1a;向量搜索的“超级引擎” 如果你正在处理海量的图片、文本或者音频数据&#xff0c;并且想快速找到其中相似的内容&#xff0c;那么你很可能已经遇到了“向量相似性搜索”这个难题。简单来说&#xff0c;就是把一段内容&#xff08;比如一张猫的图片&am…...

无人机铁路轨道安全监测 铁路周围施工区域识别 铁路安全区域监测 无人机工地监测 工地场景目标检测数据集 YOLO数据集第10550期 (1)

工地场景目标检测数据集 README数据集核心信息概览项目内容类别数量6类类别中文名称施工区域、区域、水泥板、人员、电力砖、牵引供电系统图像数量700数据集格式YOLO格式核心应用价值面向工地场景的多类别目标检测&#xff0c;支撑工地安全监控与施工进度智能化管理往期热门主题…...

MiniCPM-o-4.5-nvidia-FlagOS开发环境搭建:从Android到AI的全栈准备

MiniCPM-o-4.5-nvidia-FlagOS开发环境搭建&#xff1a;从Android到AI的全栈准备 想开发一个能看图说话、智能对话的Android应用吗&#xff1f;是不是觉得从云端AI模型到手机App的链路太复杂&#xff0c;不知道从哪里下手&#xff1f;别担心&#xff0c;这篇文章就是为你准备的…...

仅限核心开发者查阅:MCP本地DB连接器v2.4.0源码加密配置模块逆向还原(含AES-256密钥派生流程图)

第一章&#xff1a;MCP本地DB连接器v2.4.0源码加密配置模块逆向还原总览MCP本地DB连接器v2.4.0的加密配置模块采用混合式保护策略&#xff0c;结合编译期混淆、运行时密钥派生与AES-256-GCM动态解密三重机制。该模块不依赖外部密钥管理服务&#xff08;KMS&#xff09;&#xf…...