首页 > 解决方案 > 前台级联删除不像文档建议的那样工作

问题描述

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

当我删除A一个DeletionTimestamp被设置但没有foregroundDeletion终结器存在时。即使我在删除之前明确添加foregroundDeletion终结器。A这一切都发生在B被删除之前。

文档说:

在前台级联删除中,根对象首先进入“删除中”状态。在“正在删除”状态下,以下情况属实:

  • 该对象仍可通过 REST API 看到
  • 设置了对象的删除时间戳
  • 对象的 metadata.finalizers 包含值“foregroundDeletion”。

一旦设置了“正在删除”状态,垃圾收集器就会删除对象的依赖项。一旦垃圾收集器删除了所有“阻塞”依赖项(ownerReference.blockOwnerDeletion=true 的对象),它就会删除所有者对象。

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

如果对象的 ownerReferences 字段由控制器(例如 Deployment 或 ReplicaSet)设置,blockOwnerDeletion 会自动设置,您无需手动修改该字段

对我来说,这表明如果B有一个拥有者对终结器的引用A应该BlockOwnerDeletion==true添加foregroundDeletionA.

我完全误解了这一点吗?

标签: kubernetes

解决方案


根据:

对我来说,这表明如果B有一个拥有者对终结器的引用A应该BlockOwnerDeletion==true添加foregroundDeletionA.

您根据文档正确理解它。

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

链接:Github.com:Kubernetes 问题


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

服用:

  • NGINX以图像为父级的基本 pod
  • 带有小时候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子级创建它

通过运行命令获取uidpod :

$ 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

使用 deletes删除pod $ kubectl delete pod nginx-owner

  • nginx-owner (父母)
  • nginx-child (孩子) 没有任何问题。

删除父 pod 后立即在pod 中添加注释:

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

默认curl

假设使用删除命令 访问 K​​ubernetes API onlocalhost和 port :8080$ curl -X DELETE localhost:8080/api/v1/default/pod/nginx-owner

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

  • 首先删除父级
  • 删除第二个孩子

级中存在相同的注释kubectl delete

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

curlforegroundDeletion选项

假设通过修改删除命令访问 K​​ubernetes APIlocalhost和端口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"

curl基于Kubernetes.io:垃圾收集

将要:

  • 强制父母进入Terminating状态
  • 不要删除Running状态)
  • 将父pod卡在Terminating状态

pod的注释:

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

它添加了finalizers参数,foregroundDeletion但由于我不知道的原因,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!

推荐阅读