你在使用k8s的过程中有没有遇到过这样的情况:通过kubectldelete命令删除一些资源时,一直处于Terminating状态。为什么是这样?本文将介绍执行kubectldelete语句时,K8s内部执行了哪些操作。以及为什么有些资源“不能删除”(具体表现为总是Terminating,删除namespace时容易遇到)。接下来,我们重点关注以下四个方面:资源的哪些属性会影响删除操作?终结器和所有者引用属性如何影响删除操作?如何使用传播策略更改删除顺序?删除操作如何工作?为方便起见,以下所有示例都将使用ConfigMap和基本的shell命令来演示该过程。Glossaryresources:k8s的资源对象(比如configmap,secret,pod...)finalizers:终结器,存放的是key的列表。只有当列表中的key为空时才能删除资源ownerreferences:ownerreference(whomanages/whoistheparentresourceobject)kubectl:K8s客户端工具基本删除操作Kubernetes提供了几个不同的命令,你可以使用它们创建、读取、更新和删除对象。出于本文的目的,我们将重点关注四个kubectl命令:create、get、patch和delete。?以下是kubectldelete命令的基本示例。创建一个名为mymap的configmap对象。$kubectlcreateconfigmapmymapconfigmap/mymapcreated查看一个名为mymap的configmap对象。$kubectlgetconfigmap/mymapNAMEDATAAGEmymap012s删除一个名为mymap的configmap对象。$kubectldeleteconfigmap/mymapconfigmap"mymap"deleted查看名为mymap的configmap对象。$kubectlgetconfigmap/mymapErrorfromserver(NotFound):configmaps"mymap"notfound基本删除命令的删除操作状态图很简单:删除操作看似简单,但可能干扰删除的因素很多,包括终结器和所有者引用属性。什么是终结器?上面我们提到了两个属性:finalizers和ownerreferences可能会干扰删除操作,导致删除阻塞或失败。那么什么是终结器?对删除有什么影响?当你想了解Kubernetes中资源删除的原理时,了解finalizers(以下我们称终结器finalizers)的工作原理是有帮助的,这可以帮助你理解为什么有些对象不能被删除。终结器是资源的一个属性,它发出预删除操作信号,控制资源的垃圾收集,并用于提示控制器在删除资源之前执行哪些清理操作。终结器的本质是一个包含键的列表,没有实际意义。类似于注释(注释),终结器可以被操作(添加、删除、修改)。您可能遇到过以下终结器:kubernetes.io/pv-protectionkubernetes.io/pvc-protection这两个终结器作用于卷以防止卷被意外删除。?类似地,一些终结器可用于防止资源被删除,但不受任何控制器管理。下面是一个没有具体值的自定义配置映射,但包含一个终结器:$cat<
