我有一个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
有一个所有者引用A
与BlockOwnerDeletion==true
,则应将终结器foregroundDeletion
添加到A
中。
我完全误解了这一点吗?
根据:
对我来说,这表明,如果
B
有一个所有者引用A
与BlockOwnerDeletion==true
,则应将终结器foregroundDeletion
添加到A
中。
根据文档,您正确理解了它。
如果您认为观察到的行为与官方文档所说的不同,则应将其报告为 github 页面上的问题。
链接: Github.com: Kubernetes 问题
我试图在基本示例中重现它的某些部分,这是我发现的:
采取:
- 将映像作为父映像
NGINX
基本容器 - 具有
NGINX
映像的基本容器作为儿童
步骤:
- 创建父级
- 将父项的
uid
复制到子项的ownerReference
并创建它 -
检查行为:
kubectl delete
- 默认
curl
curl
foregroundDeletion
选项
创建父级
下面是基本 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
它添加了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!