ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

09-K8S Basic-kubernetes垃圾回收器 Garbage Collection(GC)

2021-06-13 23:02:55  阅读:322  来源: 互联网

标签:kubectl 级联 删除 kubernetes v1 对象 Collection ReplicaSet Garbage


一、Kubernetes之Garbage Collection

  • 在以前的博文中介绍过如何配置kubelet,按策略删除无用image、正常或者异常终止不会再启动的container,以节省资源。kubelet回收的对象在容器层面。那么kubernetes层面的对象,比如podReplicaSet、Replication Controller、Deployment、StatefulSet、DaemonSet等类型的对象,垃圾回收又是如何呢?
  • 实际上,按理说以上的kubernetes对象并不会产生垃圾,对象一直都存在,除非用户或者某种控制器将对象删除。这里称为"Garbage Collection"不太准确,实际上它想讲的是在执行删除操作时如何控制对象之间的依赖关系。比如,Deployment对象创建ReplicaSet对象,ReplicaSet对象又创建pod对象,那么在删除Deployment时,是否需要删除与之相依赖的ReplicaSet与pod呢?

1.1、从对象与根对象(Owners and dependents)

  • 某些kubernetes对象是其它对象的owner。比如ReplicaSet对象就是其所管理的pod对象的owner,本文称这类对象为“根对象”。而被管理的pod对ReplicaSet存在dependent,pod对象通过metadata.ownerReferences字段指向其依赖的对象,本文称这类对象为“从对象”。在kubernetes1.8中,ReplicationController, ReplicaSet, StatefulSet, DaemonSet, Deployment, Job and CronJob自动向其创建、收养的对象添加metadata.ownerReferences字段的值,当然也可以手动设置。以下是拥有3个pod的ReplicaSet设置文件:
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: my-repset
spec:
  replicas: 3
  selector:
    matchLabels:
      pod-is-for: garbage-collection-example
  template:
    metadata:
      labels:
        pod-is-for: garbage-collection-example
    spec:
      containers:
      - name: nginx
 
 
创建此ReplicaSet:
    kubectl create -f https://k8s.io/examples/controllers/replicaset.yaml
 
 
查看:
    kubectl get pods --output=yaml
 
 
结果如下:确认ownerReferences的值
apiVersion: v1
kind: Pod
metadata:
  ...
  ownerReferences:
  - apiVersion: apps/v1
    controller: true
    blockOwnerDeletion: true
    kind: ReplicaSet
    name: my-repset
    uid: d9607e19-f88f-11e6-a518-42010a800195

1.2、如何控制垃圾回收删除从对象?

  • 当删除一个对象时,可以控制以何种方式删除其从对象,自动删除从对象称为级联删除(cascading deletion)。有background与foreground两种方式。也可以不只删除根对象不删除从对象。

1.2.1、前台级联删除

  • 前台级联删除时,根对象首先进入"deletion in progress"状态,在"deletion in progress"状态下,存在如下事实:
    • 如果通过REST API访问根对象,仍然可见。
    • 根对象的deletionTimestamp被设置。
    • 根对象元数据metadata.finalizers包含"foregroundDeletion"。
  • 一旦根对象的状态被设置成"deletion in progress",垃圾回收器开始启动对从对象的删除。如果从对象的object有“ownerReference.blockOwnerDeletion=true”属性,那么垃圾回收器必需等到此类从对象被删除完成以后,才可以删除根对象。否则垃圾回收器启动对从对象的删除后立即删除根对象。
  • “ownerReference.blockOwnerDeletion=true”会延迟根对象的删除。在kubernetes1.7版本中增加了一个admission controller,它根据根对象访问权限,对将ownerReference.blockOwnerDeletion设置成true的操作进行访问控制,防止未经授权的用户将ownerReference.blockOwnerDeletion的值设置成true,从而延迟根对象的删除。
  • 如果从对象的ownerReferences由某种控制器设置,那么用户最好不要手动修改其值。

1.2.2、后台级联删除

  • 后台级联删除时,kubernetes立即删除根对象并返回。垃圾回收器在后台删除其从对象。

1.2.3、不删除从对象

  • 只删除根对象不删除从对象,这种方式称为“Orphan”,保留下来的从对象变成了“孤儿”。

1.3、在具体操作时设置删除策略

  • 在执行具体的操作请求时,通过设置删除请求中的"propagationPolicy"字段为 “Orphan”, “Foreground”, or “Background”中的一种,选择上述三种删除策略中的一种。

  • 在kubernetes1.9以前,对大部分控制器的删除,默认策略是"Orphan"(注意本段中说的默认值指REST API的默认行为,不是kubectl命令),包含ReplicationController, ReplicaSet, StatefulSet, DaemonSet, and Deployment,也就是在删除根对象时不删除从对象。并且当apiVersion是extensions/v1beta1, apps/v1beta1, and apps/v1beta2时,除非特别指定,默认删除策略仍然是"Orphan"。在kubernetes1.9版本中,所有类型的对象,在app/v1版本的apiVersion中,默认从对象删除。

  • 后台级联删除示例:

kubectl proxy --port=8080
curl -X DELETE localhost:8080/apis/apps/v1/namespaces/default/replicasets/my-repset \
-d '{"kind":"DeleteOptions","apiVersion":"v1","propagationPolicy":"Background"}' \
-H "Content-Type: application/json"
  • 注意上例中kubectl充当的是proxy角色,直接调用REST API执行删除操作,注意其propagationPolicy的取值。
  • 前台级联删除示例:
kubectl proxy --port=8080
curl -X DELETE localhost:8080/apis/apps/v1/namespaces/default/replicasets/my-repset \
-d '{"kind":"DeleteOptions","apiVersion":"v1","propagationPolicy":"Foreground"}' \
-H "Content-Type: application/json"
  • 不删除从对象示例
kubectl proxy --port=8080
curl -X DELETE localhost:8080/apis/apps/v1/namespaces/default/replicasets/my-repset \
-d '{"kind":"DeleteOptions","apiVersion":"v1","propagationPolicy":"Orphan"}' \
-H "Content-Type: application/json"
  • kubectl命令也支持级联删除操作。在执行kubectl命令时指定"--cascade"选项,其值为true时删除从对象,为false不删除从对象,默认值为true。 示例如下:
kubectl delete replicaset my-repset --cascade=false
# 当--cascade为true时,kubectl采用的是前台级联删除还是后台级联删除,文档中没有讲。

1.4、级联删除Deployment时的注意点

  • 当级联删除Deployment时,其删除请求中的propagationPolicy必需设定成Foreground。否则Deployment创建的ReplicaSet会被级联删除,但是ReplicaSet创建的pod不会被级联删除,会成为孤儿。

标签:kubectl,级联,删除,kubernetes,v1,对象,Collection,ReplicaSet,Garbage
来源: https://www.cnblogs.com/dai-zhe/p/14881465.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有