kubernetes - 前台级联删除不像文档建议的那样工作
问题描述
我有一个 CRDA
实例和一个 CRD 实例B
。B
具有对设置为的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
添加foregroundDeletion
到A
.
我完全误解了这一点吗?
解决方案
根据:
对我来说,这表明如果
B
有一个拥有者对终结器的引用A
应该BlockOwnerDeletion==true
添加foregroundDeletion
到A
.
您根据文档正确理解它。
如果您认为观察到的行为与官方文档所说的不同,则应在 github 页面上将其报告为问题。
我试图在基本示例中重现其中的某些部分,这就是我发现的:
服用:
NGINX
以图像为父级的基本 pod- 带有小时候
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
子级并创建它
通过运行命令获取uid
父pod :
$ 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
假设使用删除命令
访问 Kubernetes 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"
curl
带foregroundDeletion
选项
假设通过修改删除命令访问 Kubernetes 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!
推荐阅读
- xml - 编码问题,UTF8
- firebase - 安排托管在 firebase 上的 javascript 脚本每 30 分钟运行一次
- flutter - 拨打网络电话的最佳方式是什么?
- c# - 为什么在grant_type="code" 时会执行CustomTokenRequestValidator 服务?
- python - 创建一个while循环来连接熊猫每周excel文件中的列
- javascript - 为什么我不能调用 {}.anymethod 而我可以调用 [].anymethod?
- c++ - 为什么在这种情况下需要取消引用“this”?(赋值运算符)
- javascript - 计算 svg 图像中提供的座位数
- python - pyarrow read_table 没有“镶木地板版本”参数
- javascript - Angular 7 - 如何在 index.html 中分别包含前端模块和管理模块全局资产 css/js?