Home
Cron Job
DNS Pod 与 Service
DaemonSet
Deployments
Docker 用户使用 kubectl 命令指南
Init 容器
JSONPath 支持
Kubernetes 中的代理
Kubernetes 组件
Kubernetes集群中使用Sysctls
Managing Compute Resources for Containers
Master 节点通信
Nodes
Pod Preset
Pod 安全策略
Pod 的生命周期
Secret
Service
kubectl概述
为容器设置启动时要执行的命令及其入参
为容器设置环境变量
云供应商
使用 Calico 来提供 NetworkPolicy
使用 HostAliases 向 Pod /etc/hosts 文件添加条目
使用 PodPreset 将信息注入 Pods
使用 Romana 来提供 NetworkPolicy
使用 Secret 安全地分发凭证
使用 Service 把前端连接到后端
使用 Weave 网络来提供 NetworkPolicy
使用Deployment运行一个无状态应用
关键插件 Pod 的调度保证
同 Pod 内的容器使用共享卷通信
在 Kubernetes 中配置私有 DNS 和上游域名服务器
垃圾收集
基于Replication Controller执行滚动升级
声明网络策略
安装扩展(Addons)
容器环境变量
对 DaemonSet 执行回滚
应用故障排查
应用资源配额和限额
应用连接到 Service
弹缩StatefulSet
控制节点上的CPU管理策略
改变默认 StorageClass
更改 PersistentVolume 的回收策略
概念模板示例
理解 Kubernetes 对象
知名标签(Label)、注解(Annotation)和 Taints
管理巨页(HugePages)
给容器分配非透明整型资源
网络策略
联邦
认识 Kubernetes?
认识 Kubernetes?
设备插件
设置 Pod CPU 和内存限制
访问集群上运行的服务
证书
证书轮换
调度 GPU
调试Pods和Replication Controllers
调试StatefulSet
资源配额
运行一个单实例有状态应用
通过文件将Pod信息呈现给容器
通过环境变量将Pod信息呈现给容器
通过配置文件设置 Kubelet 参数
配置你的云平台防火墙
配置命名空间下pod总数
配置对多集群的访问
镜像
集群故障排查
集群管理
集群管理概述
静态Pods

Edit This Page

垃圾收集

Kubernetes 垃圾收集器的角色是删除指定的对象,这些对象曾经有但以后不再拥有 Owner 了。

注意:垃圾收集是 beta 特性,在 Kubernetes 1.4 及以上版本默认启用。

Owner 和 Dependent

某些 Kubernetes 对象是其它一些对象的 Owner。例如,一个 ReplicaSet 是一组 Pod 的 Owner。 具有 Owner 的对象被称为是 Owner 的 *Dependent*。 每个 Dependent 对象具有一个指向其所属对象的 metadata.ownerReferences 字段。

有时,Kubernetes 会自动设置 ownerReference 的值。 例如,当创建一个 ReplicaSet 时,Kubernetes 自动设置 ReplicaSet 中每个 Pod 的 ownerReference 字段值。 在 1.6 版本,Kubernetes 会自动为某些对象设置 ownerReference 的值,这些对象是由 ReplicationController、ReplicaSet、StatefulSet、DaemonSet 和 Deployment 所创建或管理。

也可以通过手动设置 ownerReference 的值,来指定 Owner 和 Dependent 之间的关系。

这里有一个配置文件,表示一个具有 3 个 Pod 的 ReplicaSet:

my-repset.yaml docs/concepts/workloads/controllers
apiVersion: extensions/v1beta1
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
        image: nginx

如果创建该 ReplicaSet,然后查看 Pod 的 metadata 字段,能够看到 OwnerReferences 字段:

kubectl create -f https://k8s.io/docs/concepts/controllers/my-repset.yaml
kubectl get pods --output=yaml

输出显示了 Pod 的 Owner 是名为 my-repset 的 ReplicaSet:

apiVersion: v1
kind: Pod
metadata:
  ...
  ownerReferences:
  - apiVersion: extensions/v1beta1
    controller: true
    blockOwnerDeletion: true
    kind: ReplicaSet
    name: my-repset
    uid: d9607e19-f88f-11e6-a518-42010a800195
  ...

控制垃圾收集器删除 Dependent

当删除对象时,可以指定是否该对象的 Dependent 也自动删除掉。 自动删除 Dependent 也称为 *级联删除*。 Kubernetes 中有两种 级联删除 的模式:background 模式和 foreground 模式。

如果删除对象时,不自动删除它的 Dependent,这些 Dependent 被称作是原对象的 *孤儿*。

Background 级联删除

background 级联删除 模式下,Kubernetes 会立即删除 Owner 对象,然后垃圾收集器会在后台删除这些 Dependent。

Foreground 级联删除

foreground 级联删除 模式下,根对象首先进入 “删除中” 状态。在 “删除中” 状态会有如下的情况:

一旦对象被设置为 “删除中” 状态,垃圾收集器会删除对象的所有 Dependent。 垃圾收集器在删除了所有 “Blocking” 状态的 Dependent(对象的 ownerReference.blockOwnerDeletion=true)之后,它会删除 Owner 对象。

注意,在 “foreground 删除” 模式下,只有设置了 ownerReference.blockOwnerDeletion 值得 Dependent 才能阻止删除 Owner 对象。 在 Kubernetes 1.7 版本中将增加许可控制器(Admission Controller),基于 Owner 对象上的删除权限来控制用户去设置 blockOwnerDeletion 的值为 true,所以未授权的 Dependent 不能够延迟 Owner 对象的删除。

如果一个对象的 ownerReferences 字段被一个 Controller(例如 Deployment 或 ReplicaSet)设置,blockOwnerDeletion 会被自动设置,不需要手动修改这个字段。

设置级联删除策略

通过为 Owner 对象设置 deleteOptions.propagationPolicy 字段,可以控制级联删除策略。 可能的取值包括:“orphan”、“Foreground” 或 “Background”。

对很多 Controller 资源,包括 ReplicationController、ReplicaSet、StatefulSet、DaemonSet 和 Deployment,默认的垃圾收集策略是 orphan。 因此,除非指定其它的垃圾收集策略,否则所有 Dependent 对象使用的都是 orphan 策略。

下面是一个在后台删除 Dependent 对象的例子:

kubectl proxy --port=8080
curl -X DELETE localhost:8080/apis/extensions/v1beta1/namespaces/default/replicasets/my-repset \
-d '{"kind":"DeleteOptions","apiVersion":"v1","propagationPolicy":"Background"}' \
-H "Content-Type: application/json"

下面是一个在前台删除 Dependent 对象的例子:

kubectl proxy --port=8080
curl -X DELETE localhost:8080/apis/extensions/v1beta1/namespaces/default/replicasets/my-repset \
-d '{"kind":"DeleteOptions","apiVersion":"v1","propagationPolicy":"Foreground"}' \
-H "Content-Type: application/json"

下面是一个孤儿 Dependent 的例子:

kubectl proxy --port=8080
curl -X DELETE localhost:8080/apis/extensions/v1beta1/namespaces/default/replicasets/my-repset \
-d '{"kind":"DeleteOptions","apiVersion":"v1","propagationPolicy":"Orphan"}' \
-H "Content-Type: application/json"

kubectl 也支持级联删除。 通过设置 --cascade 为 true,可以使用 kubectl 自动删除 Dependent 对象。 设置 --cascade 为 false,会使 Dependent 对象成为孤儿 Dependent 对象。 --cascade 的默认值是 true。

下面是一个例子,使一个 ReplicaSet 的 Dependent 对象成为孤儿 Dependent:

kubectl delete replicaset my-repset --cascade=false

已知的问题

其它已知的问题

What's next

设计文档 1 设计文档 2