前台级联删除无法像文档建议的那样工作



我有一个CRDA实例和一个CRDB实例。B具有对A的所有者引用,BlockOwnerDeletion设置为true。两个实例都有一个终结器。

当我删除A时,设置了DeletionTimestamp,但没有foregroundDeletion终结器存在。即使我在删除之前将foregroundDeletion终结器显式添加到A。这一切都发生在删除B之前。

文档说:

在前台级联删除中,根对象首先进入"正在进行删除"状态。在"正在删除"状态下,满足以下条件:

  • 该对象仍然通过 REST API 可见
  • 设置对象的删除时间戳
  • 对象的 metadata.finalizers 包含值 "foregroundDelete"。

设置"正在删除"状态后,垃圾回收器将删除对象的依赖项。一旦垃圾回收器删除了所有"阻塞"依赖项(具有 ownerReference.blockOwnerDelete=true 的对象),它将删除所有者对象。

请注意,在"foregroundDelete"中,只有具有 ownerReference.blockOwnerDelete=true 的依赖项才会阻止删除 owner 对象。Kubernetes 版本 1.7 添加了一个准入控制器,用于控制用户访问权限,以根据所有者对象的删除权限将 blockOwnerDelete 设置为 true,以便未经授权的依赖项无法延迟删除所有者对象。

如果对象的所有者引用字段由控制器(如部署或副本集)设置,则会自动设置块所有者删除,您无需手动修改此字段

对我来说,这表明,如果B有一个所有者引用ABlockOwnerDeletion==true,则应将终结器foregroundDeletion添加到A中。

我完全误解了这一点吗?

根据:

对我来说,这表明,如果B有一个所有者引用ABlockOwnerDeletion==true,则应将终结器foregroundDeletion添加到A中。

根据文档,您正确理解了它。

如果您认为观察到的行为与官方文档所说的不同,则应将其报告为 github 页面上的问题。

链接: Github.com: Kubernetes 问题


我试图在基本示例中重现它的某些部分,这是我发现的:

采取:

  • 将映像作为映像NGINX基本容器
  • 具有NGINX映像的基本容器作为儿童

步骤:

  • 创建父级
  • 将父项的uid复制到子项ownerReference并创建它
  • 检查行为:

    • kubectl delete
    • 默认curl
    • curlforegroundDeletion选项

创建父级

下面是基本 pod 定义的示例YAML

apiVersion: v1
kind: Pod
metadata:
name: nginx-owner
namespace: default
spec:
containers:
- image: nginx
imagePullPolicy: IfNotPresent
name: nginx-owner

将父项的uid复制到子项ownerReference并创建它

通过运行命令获取pod 的uid

$ kubectl get pods nginx-owner -o yaml | grep uid | cut -d ":" -f 2

将其粘贴到YAML子项的定义中

apiVersion: v1
kind: Pod
metadata:
name: nginx-child
namespace: default
ownerReferences:
- apiVersion: apps/v1
blockOwnerDeletion: true
kind: Pod
name: nginx-owner
uid: HERE!
spec:
containers:
- image: nginx
imagePullPolicy: IfNotPresent
name: nginx-child

保存并运行它。

检查行为

检查两个 Pod 是否都在运行,以及子级是否ownerReference

kubectl delete

删除pod 并$ kubectl delete pod nginx-owner删除:

  • nginx-owner(家长)
  • nginx-child(儿童)没有任何问题。

删除父 pod后立即在pod 中进行注释:

deletionGracePeriodSeconds: 30
deletionTimestamp: "2020-02-27T14:17:48Z"

默认curl

假设在localhost上访问 Kubernetes API,并使用删除命令移植8080$ curl -X DELETE localhost:8080/api/v1/default/pod/nginx-owner

使用默认选项通过 API 访问删除Pod:

  • 首先删除父项
  • 删除

父项中的注释与kubectl delete中的注释相同

deletionGracePeriodSeconds: 30
deletionTimestamp: "2020-02-27T15:33:18Z"

foregroundDeletion选项curl

假设在localhost上访问 Kubernetes API,并使用修改后的删除命令进行端口8080以包含foregroundDeletion选项:

$ curl -X DELETE localhost:8080/api/v1/namespaces/default/pods/nginx-owner -d '{"kind":"DeleteOptions","apiVersion":"v1","propagationPolicy":"Foreground"}' -H "Content-Type: application/json"

基于 Kubernetes.iocurl:垃圾回收

将:

  • 强制父级进入Terminating状态
  • 不删除子项(Running状态)
  • 卡住的父Pod 处于Terminating状态

Pod 的注释:

deletionGracePeriodSeconds: 30
deletionTimestamp: "2020-02-27T15:44:52Z"
finalizers:
- foregroundDeletion

它添加了finalizersforegroundDeletion的争论,但由于我不知道的原因,pod 没有被删除。

编辑:

我发现了foreGroundDeletion不起作用的错误。存在以下问题:

ownerReferences:
- apiVersion: apps/v1
blockOwnerDeletion: true
kind: Pod
name: nginx-owner
uid: HERE!

它应该是:

ownerReferences:
- apiVersion: v1
blockOwnerDeletion: true
kind: Pod
name: nginx-owner
uid: HERE!

相关内容

最新更新