【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: mymap
  finalizers:
  - 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: 0
  deletionTimestamp: "2021-09-29T11:04:55Z"
  finalizers:
  - kubernetes
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:metadata:
        f:finalizers:
          .: {}
          v:"kubernetes": {}
    manager: kubectl
    operation: Update
    time: "2021-09-29T11:04:40Z"
  name: mymap
  namespace: default
  resourceVersion: "1378430"
  selfLink: /api/v1/namespaces/default/configmaps/mymap
  uid: 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-child
  ownerReferences:
  - apiVersion: v1
    kind: ConfigMap
    name: mymap-parent
    uid: $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-child
  ownerReferences:
  - apiVersion: v1
    kind: ConfigMap
    name: mymap-parent
    uid: $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和优雅终止解析

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/249507.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

『OPEN3D』1.5.2 动手实现点云栅格/体素最近邻

本专栏地址: https://blog.csdn.net/qq_41366026/category_12186023.html?spm=1001.2014.3001.5482 NEARBY6实现的voxel可视化 一种NEARBY14实现的可视化voxel

lwIP 细节之五:accept 回调函数是何时调用的

使用 lwIP 协议栈进行 TCP 裸机编程&#xff0c;其本质就是编写协议栈指定的各种回调函数。将你的应用逻辑封装成函数&#xff0c;注册到协议栈&#xff0c;在适当的时候&#xff0c;由协议栈自动调用&#xff0c;所以称为回调。 注&#xff1a;除非特别说明&#xff0c;以下内…

多维时序 | Matlab实现GA-LSTM-Attention遗传算法优化长短期记忆神经网络融合注意力机制多变量时间序列预测

多维时序 | MATLAB实现BWO-CNN-BiGRU-Multihead-Attention多头注意力机制多变量时间序列预测 目录 多维时序 | MATLAB实现BWO-CNN-BiGRU-Multihead-Attention多头注意力机制多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 多维时序 | Matlab实…

C#上位机与欧姆龙PLC的通信01----项目背景

最近&#xff0c;【西门庆】作为项目经理负责一个70万的北京项目&#xff0c;需要在工控系统集成软件开发中和欧 姆龙PLC对接&#xff0c;考虑项目现场情况优先想到了采用FinsTCP通讯协议&#xff0c;接下来就是记录如何一步步实现这些通讯过程的&#xff0c;希望给电气工程师&…

鸿蒙app获取文本控件按钮控件_修改控件名称_按钮触发事件_提示信息显示

鸿蒙app获取文本控件按钮控件_修改控件名称_按钮触发事件_ 点击启动&#xff1a;提示信息显示 package com.example.myapplication.slice;import com.example.myapplication.ResourceTable; import ohos.aafwk.ability.AbilitySlice; import ohos.aafwk.content.Intent; impor…

vivado约束方法8

无交互的逻辑互斥时钟组 逻辑排他性时钟是指在不同源点上定义但共享部分的时钟由于多路复用器或其他组合逻辑&#xff0c;它们的时钟树。时间限制向导识别此类时钟&#xff0c;并建议在它们这样做时直接对其进行时钟组约束除了连接到其共享时钟的逻辑之外&#xff0c;彼此之间…

ADUM1200ARZ数字隔离器:重新定义技术标准

ADUM1200ARZ数字隔离器成为技术进步领域的关键组件。其创新设计和多方面功能重新定义了数字隔离技术的格局&#xff0c;提供了满足不同工业需求的众多功能。让我们通过本文直观的了解ADUM1200ARZ的功能与技术标准。 窄体且符合ROHS&#xff1a;设定新基准 该数字隔离器采用窄体…

【ITRA】赛事方收费标准-2024

一、查看ITRA收费情况 1、赛事方 必须注册赛事方的账户进入ITRA 看到的这个100欧&#xff0c;只是一个起步价格&#xff0c;并不是所有价格 不过这个对于一个赛事方可以cover一年的费用 2、更多费用 想当更大的怨种可以 往下拉满

MySQL数据存储、索引记录

行格式(每行记录) 行格式(每行记录)&#xff1a; 以记录为单位来向表中插入数据的&#xff0c;这些记录在磁盘上的存放方式也被称为 行格式 或者 记录格式。 InnoDB 存储引擎4种不同类型的 行格式 &#xff0c;分别是 Compact 、 Redundant 、Dynamic 和 Compressed 行格式。组…

Github与Gitlab

学习目标 能够使用GitHub创建远程仓库并使用能够安装部署GitLab服务器能够使用GitLab创建仓库并使用掌握CI/CD的概念掌握蓝绿部署, 滚动更新,灰度发布的概念 GitHub是目前最火的开源项目代码托管平台。它是基于web的Git仓库&#xff0c;提供公有仓库和私有仓库&#xff0c;但私…

时序分解 | Matlab实现SSA-ICEEMDAN麻雀算法优化ICEEMDAN时间序列信号分解

时序分解 | Matlab实现SSA-ICEEMDAN麻雀算法优化ICEEMDAN时间序列信号分解 目录 时序分解 | Matlab实现SSA-ICEEMDAN麻雀算法优化ICEEMDAN时间序列信号分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现SSA-ICEEMDAN麻雀算法优化ICEEMDAN时间序列信号分解 可…

【基于Python的新闻文本分类系统设计与实现】

基于Python的新闻文本分类系统设计与实现 摘要&#xff1a;1. 引言2. 数据获取与预处理3. 数据分析与可视化4. 文本分类模型设计与实现5. 结果与讨论6. 总结与展望结尾 摘要&#xff1a; 本文介绍了一种基于Python语言、Flask技术以及贝叶斯算法的新闻文本分类系统的设计与实现…

为了吃鸡苦练狙击,避免坑队友自己造一个狙击游戏!

引言 一文教会你造一个简易的狙击游戏。 说到狙击&#xff0c;相信大家都不陌生&#xff0c;无论是影视作品还是网络游戏&#xff0c;都经常能看到狙击枪的身影&#xff0c;最深刻的是它能够从百里之外&#xff0c;一枪爆头。 本文将介绍如何在Cocos Creator中造一个简易的狙…

基于C/C++的libcurl多协议文件传输库dll二次封装开发使用

libcurl 可能是最便携、最强大和最常用的 这个星球上的网络传输库。官方提供的示例&#xff0c;需要在项目中引用到libcurl-imp.lib才能使用。 这里我改造了下工程&#xff0c;将常用的接口导出到了libcurl.dll中方便直接在后续的工程代码中应用&#xff0c;下面可以看到dll常用…

RNN和LSTM学习笔记-初学者

提示&#xff1a; 目录 前言一、RNN介绍二、LSTM介绍总结 前言 提示&#xff1a; 提示&#xff1a; 一、RNN介绍 RNN是一种短时记忆&#xff0c;而LSTM是长短时记忆网络 二、LSTM介绍 总结

用python+opencv+PySimpleGUI实现了一款视频播放器

目录 前言准备工作主要思路主界面视频读取进度条拖拽 源码 前言 本篇将用python实现一个mp4播放器&#xff0c;可以通过windows资源管理器选择需要播放的mp4视频文件或者图片&#xff0c;然后提供播放条的快进回放&#xff0c;播放和暂停功能&#xff1a; 准备工作 python所…

5G工业网关视频传输应用

随着科技的不断进步&#xff0c;5G网络技术已经成为了当前最热门的话题之一。而其中一个引人注目的领域就是5G视频传输和5G工业网关应用。在传统网络通信中&#xff0c;由于带宽和延迟的限制&#xff0c;视频传输常常受到限制&#xff0c;而工业网关应用也存在着链路不稳定、数…

http正向代理测试,nginx反向代理中转正向代理服务器

有3台服务器如下&#xff1a; 192.168.111.201&#xff08;反向代理到正向代理服务器&#xff09; 192.168.111.202&#xff08;正向代理服务器&#xff09; 192.168.111.203&#xff08;目标WEB系统&#xff09; 防火墙网络策略如图所示: 1、192.168.111.200 只能访问 192.168…

主宰无双H5:WIN学习手工服务端通用视频教程及GM授权物品后台,支持三网H5玩法介绍

标题&#xff1a;主宰无双H5&#xff08;游戏源码&#xff09;&#xff1a;WIN学习手工服务端通用视频教程及GM授权物品后台&#xff0c;支持三网H5玩法的百科 一、引言 随着互联网的快速发展&#xff0c;H5游戏逐渐成为人们休闲娱乐的重要方式。主宰无双H5游戏源码作为一款深…

深入理解LightGBM

1. LightGBM简介 GBDT (Gradient Boosting Decision Tree) 是机器学习中一个长盛不衰的模型&#xff0c;其主要思想是利用弱分类器&#xff08;决策树&#xff09;迭代训练以得到最优模型&#xff0c;该模型具有训练效果好、不易过拟合等优点。GBDT不仅在工业界应用广泛&#…