Kubernetes1.3新特性:新的资源回收控制器
(一) 核心概念
在kubernetes1.3中新增了一个资源回收控制器GarbaseCollector,用这个控制器来替代kubernetes1.3中的资源回收控制器GC。
如下为kubernetes1.2中的资源回收控制器结构体:
如下为kubernetes1.3中的资源回收控制器结构体:
在kubernetes1.2中,如果要实现对资源级联回收功能,需要通过客户端进行资源级联回收调用的方式实现,比如存在一个replica set类型的资源,在这个资源下面存在多个POD资源,如果我们使用命令行的方式进行级联删除,我们需要使用kubect命令先删除replica set下面对应的所有POD资源,然后在删除这个replica set资源,对资源级联删除的逻辑处理都要通过客户端来实现。
在kubernetes1.3中,可以将对资源级联回收功能的逻辑处理放到服务端来实现,这样就减少了客户端维护逻辑处理的工作量,方便了用户使用,从而进一步完善了kubernetes作为一个平台的资源回收功能。为了实现上面的想法,在kubernetes1.3中重新设计了资源回收控制器结构体,并且引入了finalizer机制,比如1.3中的“orphan” finalizer机制,以此来让用户进行灵活的选择。
(二) 使用介绍
这个新增的回收控制器是一个阿尔法版本的新特性,也就是说不建议在生产环节下来进行使用。
在kubernetes1.3中新增加了一个启动参数enable-garbage-collector,这个参数的类型是布尔型,如果这个参数设置成true,那么表示启用回收控制器GarbaseCollector。需要注意的是这个启动参数enable-garbage-collector在kube-apiserver和kube-controller-manager两个模块中都存在,如果要让这个功能生效,需要在kube-apiserver和kube-controller-manager两个模块中同时设置。
结构体ObjectMeta表示kubernetes中每个对象的元数据,在kubernetes1.3中新增加了两个变量OwnerReferences和Finalizers,其中第一个变量OwnerReferences是一个结构体数组,对应的结构体是OwnerReference,表示这个对象依赖的其他对象列表;其中第二个变量Finalizers是一个字符串数组,表示这个对象被删除之前需要运行的所有Finalizers。
结构体OwnerReference中有个布尔型变量Controller,如果这个变量值为true,那么表示这个关联对象是管理控制器。因为ObjectMeta对象同这个对象关联的所有OwnerReference对象都必须在相同的namespace中,所以在OwnerReference中就没有namespace变量。
通过ObjectMeta和OwnerReference两个结构体之间的关联关系,就可以实现先删除对象依赖的所有其他对象,最后删除这个对象,以此来达到对资源进行级联回收的目的。
回收控制器GarbageCollector提供了一个管理队列dirtyQueue:
回收控制器会将kubernetes系统中的所有对象都放入这个管理队列中,然后回收控制器会从这个dirtyQueue队列中取出对象,然后进行资源回收处理,资源回收处理的过程是并发运行的,在kube-controller-manager中默认启动5个worker来进行处理。
每个worker的处理过程如下图所示:
回收控制器GarbageCollector还提供了一个变量propagator:
这个变量propagator对应的结构体如下:
这个结构体的作用是监控kubernetes中所有资源的各种事件,包括创建、更新、删除,然后将这些事件放入事件队列eventQueue中,然后启动一个worker,这个worker从事件队列eventQueue中取出事件,然后进行处理,处理的目的是维护正确的对象依赖关系。
比如当对象存在创建或者更新事件时,Propagator会判断这个对象是否存在所有者,也就是说判断这个对象是否存在Owner,如果存在Owner,并且这个Owner已经不存在了,那么将这个对象放入dirtyQueue队列中等待处理。
在比如当对象存在删除事件时,Propagator会从对象依赖关系中删除这个对象,并且把这个对象所依赖的所有对象都放入dirtyQueue队列中等待处理。
Propagator维护对象依赖关系需要使用到结构体node,如下图所示:
通过这个结构体,从Owner的角度出发,可以查询到所有dependent对象,如下图所示:
从整体出发,每个node都存在owner,也都存在dependent,如下图所示:
kubernetes1.3中回收控制器GarbageCollector提供了finalizer机制,也就是说对象在被删除前ObjectMeta.Finalizers中的内容必须都被处理过,Finalizers是一个字符串数组,里面每个字符串表示一个finalizer处理逻辑。在这个机制下回收控制器GarbageCollector提供了一个“orphan” finalizer逻辑,利用到了回收控制器结构体中的orphanQueue队列变量:
同时还利用了结构体DeleteOptions中的OrphanDependents变量:
变量OrphanDependents是一个布尔型变量。当取值为true时,如果这个时候apiserver接收到了一个删除请求,那么api server会更新删除对象所在的ObjectMeta结构体中的Finalizers变量,添加入字符串“orphan”,表示这个对象需要执行“orphan”的finalizer处理逻辑;当取值为false时,如果这个时候api server接收到了一个删除请求,那么api server会更新删除对象所在的ObjectMeta结构体中的Finalizers变量,删除字符串“orphan”,表示这个对象不需要执行“orphan”的finalizer处理逻辑。
这个“orphan”的finalizer处理逻辑就是kubernetes1.3新增加的在服务端进行资源级联删除的功能。回收控制器会从orphanQueue队列中取出对象,然后进行“orphan”处理,“orphan”处理过程是并发运行的,在kube-controller-manager中默认启动5个worker来进行处理,处理过程就是查询这个对象对应的node结构体中的dependent对象,并向api server发送“PATCH”指令进行删除。在“orphan”的finalizer处理最后会从ObjectMeta结构体的Finalizers变量中将“orphan”字符串删除掉,至此完成了整个“orphan”处理过程。