写点什么

29 K8S 之 ReplicaSet 控制器

  • 2021 年 11 月 29 日
  • 本文字数:1687 字

    阅读完需:约 6 分钟

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、spec status 这 5 个一级字段组成。


ReplicaSet 规范中用于定义标签选择器的 selector 字段为必先字段,它支持 matchLabels matchExpressions 两种表示格式。前者使用字符串映射格式,以 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 就绪后一次性地将客户端流量全部迁至新版本之上,这种更新策略也称为蓝绿部署


发布于: 1 小时前阅读数: 7
用户头像

InfoQ签约作者 2018.11.30 加入

热爱生活,收藏美好,专注技术,持续成长

评论

发布
暂无评论
29 K8S之ReplicaSet控制器