Bootstrap

29 K8S之ReplicaSet控制器

ReplicaSet(简称RS)是工作负载控制器类型的一种实现,隶属于名称空间级别,主要用于编排无状态应用,核心目标在于确保集群上运行有指定数量的、符合其标签选择器的Pod副本。ReplicaSet规范由标签选择器、期望的副本数和Pod模板3个主要因素所定义,它在控制循环中持续监视同一名称空间中运行的Pod对象,并在每个循环中将标签选择器筛选出的Pod数量与期望的数量相比较,通过删除多余的Pod副本或借助于模板创建出新的Pod来确保该类Pod对象数量能始终吻合所期望的数量。

标签选择器是ReplicaSet判断一个Pod对象是否处于其作用域的唯一标准,Pod模板仅在补足缺失数量的Pod对象时使用,这意味着由其他Pod规范所创建的Pod对象也存在进入某个ReplicaSet作用域的可能性。

ReplicaSet控制器能够实现以下功能:

确保Pod对象的数量精确反映期望期:ReplicaSet对象需要确保由其控制运行的Pod副本数量精确吻合配置中定义的期望值,否则会自动补足所缺或终止所余。

确保Pod健康运行:探测到由其管控的Pod对象健康状态检查失败或因其所在的工作节点故障而不可用时,自动请求控制平面在其他工作节点创建缺失的Pod副本。

弹性伸缩:应用程序业务规模因各种原因时常存在明显波动,如波峰或波谷期间,可以通过改动ReplicaSet控制器规范中的副本数量动态调整相关Pod资源对象的数量,甚至是借助HPA控制器实现Pod资源规模的自动伸缩。

ReplicaSet并非是用户使用无状态应用控制器的最终形态,Deployment控制器基于ReplicaSet实现了滚动更新、自动回滚、金丝雀部署甚至是蓝绿部署等更为高级和自动化的任务编排功能,因而成为用户在编排无状态应用时更高级的选择。

ReplicaSet由kind、apiVersion、metadata、specstatus这5个一级字段组成。

ReplicaSet规范中用于定义标签选择器的selector字段为必先字段,它支持matchLabelsmatchExpressions两种表示格式。前者使用字符串映射格式,以key: value形式表达要匹配的标签;后者支持复杂的表达式格式,支持基于“等值(运算符=和!=)”和基于“集合”(运算符为in和notin等)的表示方法,同时定义二者时的内生逻辑为“与”关系。

ReplicaSet资源的删除操作同其他标准的API资源一样使用kubectl delete命令即可完成,但删除ReplicaSet对象时默认会一并删除其作用域内的各Pod对象。偶尔,考虑到这些Pod资源未必由该ReplicaSet对象创建,或者即便由其创建也并非是其自身的组成部分时,也可以在删除命令上使用--cascade=false选项关闭级联删除功能,而保留相关的Pod对象。

ReplicaSet不会校验作用域内处于活动状态的Pod对象的内容,改动Pod模板的定义对已经创建完成的活动对象无效,但在用户手动删除其旧版本的Pod对象后能够自动以新代旧,实现控制器下的应用更新。通过修改Pod中某容器的镜像文件版本进行应用程序的版本升级是最常见的应用更新场景。

单批次替换,一次性替换所有Pod对象:也称为重建式更新(recreate),是最为简单、高效的更新方式,但会导致相应的服务在一段时间内(至少一个Pod对象更新完成并就绪)完全不可用,因而一般不会用在对服务可用性有较高要求的生产环境中。

多批次替换,一次仅替换一批Pod对象:也称为滚动更新,是一种略复杂的更新方式,需要根据实时业务量和Pod对象的总体承载力做好批次规划,而后待一批Pod对象就绪后再更新另一批,直到全部完成为止;该策略实现了不间断服务的目标,但更新过程中会出现不同的应用版本并存且同时提供服务的状况。

ReplicaSet上的应用更新也能够不改变现有资源(简称为rs-old)的定义,而是借助创建一个有着新版本Pod模板的新ReplicaSet资源(简称为rs-new)实现。新旧版本的ReplicaSet使用了不同的标签选择器,它们筛选相同的Pod标签,但至少会有一个标签匹配到不同的值,余下的标签各自匹配相同值,相关的Service对象的标签选择器会匹配这些拥有相同值的标签。

滚动更新过程中,会存在两个不同版本的应用同时向客户端提供服务,且更新和回滚过程耗时较长。另一种更为妥帖的更新方式是,在旧版本ReplicaSet资源运行的同时直接创建一个全Pod副本的新版本ReplicaSet,待所有的新Pod就绪后一次性地将客户端流量全部迁至新版本之上,这种更新策略也称为蓝绿部署