1、finalizers: 对象终结器,列表内的键为空时资源才可被删除。
        当我们删除带有 finalizers 字段的对象时,该对象首先会被添加 deletionTimestamp(删除时间戳)字段,并一直处于预删除只读状态(删除终结器键更新除外),直到某些控制器删除或使用 Kubectl 删除该对象终结器之前,真正的删除都不会完成,同时一旦终结器列表为空,k8s gc就会回收该对象,将其放入要从注册表中删除的队列中。

2、owner references: 所有者引用,即父资源对象是谁
        通过 GVR和uid 字段确保选择器可以匹配到,实现父子对象的级联删除,同时可以指定--cascade=false实现非级联删除。

3、强制删除命名空间

$ kubectl proxy

$ NAMESPACE_NAME=test
cat <<EOF | curl -X PUT \
  127.0.0.1:8001/api/v1/namespaces/$NAMESPACE_NAME/finalize \
  -H "Content-Type: application/json" \
  --data-binary @-
{
  "kind": "Namespace",
  "apiVersion": "v1",
  "metadata": {
    "name": "$NAMESPACE_NAME"
  },
  "spec": {
    "finalizers": null
  }
}
EOF

        同时要谨慎思考是否强制删除命名空间,因为这样做可能只删除名称空间,命名空间下的其他资源删不完全,最终导致留下孤儿对象。当出现孤儿对象时,可以手动重新创建该命名空间,然后可以手动清理和恢复该对象。

4、kubectl delete 策略

Foreground策略:先删除附属对象,再删除属主对象。将对象的metadata.finalizers字段值设置为foregroundDeletion,控制器需要主动处理foregroundDeletion的finalizers。

Background策略(默认):先删除属主对象,再删除附属对象。在Background模式下,k8s会立即删除属主对象,之后k8s垃圾收集器会在后台删除其附属对象。

Orphan策略:不会自动删除它的附属对象,这些残留的依赖被称为原对象的孤儿对象。

v1.9之前,大部分控制器默认的和删除策略为Orphan,从v1.9开始,对app/v1下的资源默认使用Background模式。

使用Foreground或者孤立级联删除时,K8s会向主资源添加Finalizer,且需要控制器单独处理该Finalizer。
在Foreground删除中,会添加Foreground Finalizer,这样控制器必须在删除了拥有ownerReferences.blockOwnerDeletion=true的附属资源后,才能删除属主对象。
如果你指定了孤立删除策略,K8s会添加Orphan Finalizer,这样控制器在删除属主对象之后,会忽略附属资源。
 

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐