k8s finalizers和owner references
finalizers
终结器,存放键的列表,列表内的键为空时资源才可被删除。
删除指定了Finalizer的对象时,填充.metadata.deletionTimestamp来标记要删除的对象,返回已接受202状态码使其进入只读状态。
# 创建包含finalizers的configmap
cat <<EOF | kubectl create -f -
apiVersion: v1
kind: ConfigMap
metadata:
name: mymap
finalizers:
- kubernetes
EOF
# 因存在finalizers而无法删除configmap
kubectl delete cm mymap
# 去掉configmap的finalizers
kubectl patch configmap/mymap \
--type json \
--patch='[{"op": "remove", "path": "/metadata/finalizers"}]'
一个常见的Finalizer的例子是kubernetes.io/pv-protection,用来防止意外删除PersistentVolume对象。当一个PersistentVolume对象被Pod使用时,k8s会添加pv-protection Finalizer。如果试图删除PersistentVolume,它将进入Terminating状态,但是控制器因为该Finalizer存在而无法删除该资源。当Pod停止使用PersistentVolume时,k8s清除pv-protection Finalizer,控制器就会删除该卷。
owner references
所有者引用,归谁管理/父资源对象是谁,用于级联删除。
不允许出现跨namespace的Owner Reference。
# 创建configmap mymap-parent
cat <<EOF | kubectl create -f -
apiVersion: v1
kind: ConfigMap
metadata:
name: mymap-parent
EOF
# 创建mymap-parent的子对象mymap-child
CM_UID=$(kubectl get configmap mymap-parent -o jsonpath="{.metadata.uid}")
cat <<EOF | kubectl create -f -
apiVersion: v1
kind: ConfigMap
metadata:
name: mymap-child
ownerReferences:
- apiVersion: v1
kind: ConfigMap
name: mymap-parent
uid: $CM_UID
EOF
# 删除mymap-parent后mymap-child也被删除即级联删除
kubectl delete cm mymap-parent
父子资源删除策略有以下3种
Foreground: 先删除子资源再删除父资源(post-order)
Background: 先删除父资源再删除子资源(pre-order,默认策略)
Orphan: 忽略所有者引用进行删除,只删除当前对象
参考资料
https://www.jianshu.com/p/6053e1c3ceb0
https://juejin.cn/post/7153970808480595999