k8s finalizers和owner references

发布时间 2023-08-12 14:51:05作者: 王景迁

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