一、ReplicaSet概述
简称RS,是pod控制器类型的一种实现,用于确保由其管控的pod对象副本数在任一时刻都能精确满足期望的数量。ReplicaSet控制器资源启动后会查找集群中匹配其标签选择器的pod资源对象,当前活动对象的数量与其期望的数量不吻合时,多则删除,少则通过pod模板创建以补足,等pod资源副本数量符合期望值后即进入下一轮和解循环。
RS的副本数量、标签选择器甚至是pod模板都可以随时按需进行修改,不过仅改动期望的副本数量会对现存的pod副本产生直接影响。修改标签选择器可能会使得现有的pod副本的标签变得不在匹配,此时rs控制器要做的不过是不再计入它们而已。另外,在创建完成后,rs也不再关注pod对象中的实际内容,因此pod模板的改动也只会对后来新建的pod副本产生影响。相比较于手动创建和管理pod资源来说,rs能够实现以下功能:
1、确保pod资源对象的数量反映期望值:rs需要确保由其控制运行的pod副本数量精确吻合配置中定义的期望值,否则就会自动补足所缺或终止所余。
2、确保pod监控运行:探测到由其管控的pod对象因其所在的工作节点故障而不可用时,自动请求由调度器于其他工作节点创建缺失的pod副本。
3、弹性伸缩:业务规模因各种原因经常存在明显波动,在波峰或波谷期间,可以通过rs控制器动态调整相关pod资源对象数量。此外,在必要时还可以通过hpa(HroizontalPodAutoscaler)控制器实现pod资源规模的自动伸缩。
二、创建RS
类似于pod资源,创建rs控制器对象同样可以使用yaml或json格式的清单文件定义其配置,而后使用相关的创建命令来完成资源创建。
replicas:期望的pod对象副本数
selector:当前控制器匹配pod对象副本的标签选择器,支持matchLabels和matchExpressions两种匹配机制。
template:用于补足pod副本数量时使用的pod模板资源。
minReadySeconds:新建的pod对象,在启动后的多长时间内如果其容器未发生崩溃等异常情况即被视为就绪;默认0s,表示一旦就绪性探测成功,即被视作可用。
三、RS管控下的pod对象
实际中存在着不少可能导致pod对象数目与期望值不符合的可能性,如pod对象的意外删除、pod对象标签的变动、控制器的标签选择器变动、甚至是工作节点故障等。rs控制器的和解循环过程能够实时监控到这些异常,并及时启动和解操作。
1、缺少pod副本
任何原因导致的相关pod对象丢失,都会由rs控制器自动补足。另外,强行修改隶属于控制器的某pod资源的标签,会导致它不再被控制器作为副本计数,这也将触发控制器的pod对象副本缺失补足机制。修改后的标签如果又能被其他控制器资源的标签选择器所命中,则此时它又成了隶属于另一控制器的副本。如果修改后的pod对象不再隶属于任何控制器,那么它将成为自主式pod。
2、多出pod副本
一旦被标签选择器匹配到的pod资源数量因任何原因超出期望值,多余的部分都将被控制器自动删除。这就意味着,任何自助式的活本隶属于其他控制器的pod资源,其标签变动的结果一旦匹配到了其他的副本数足额的控制器,就会导致这类pod资源被删除。
3、查看pod资源变动的相关事件
使用kubectl describe replicasets命令可以打印出rs控制器的详细状态。事实上,rs控制器能对pod对象数目的异常及时做出响应,是因为它向api server注册监控了相关资源及其列表的变动信息,于是api server会在变动发生时立即通知给相关的监控客户端。因而节点自身故障而导致的pod对象丢失,rs控制器一样会使用补足资源的方式进行处理。
四、更新rs控制器
rs控制器的核心组成部分是标签选择器、副本数量及pod模板,但更新操作一般是围绕raplicas和template两个字段值进行的,改动pod模板的定义对已经创建完成的活动对象无效,但在用户逐个关闭其旧版本的pod资源后就能以新代旧,实现控制器下应用版本的滚动升级。另外,修改副本数量也就意味着应用规模的扩展或收缩。
1、更改pod模板
rs控制器的pod模板可随时按需修改,但它仅影响这之后由其新建的pod对象,对已有的副本不会产生作用。对新版本的清单文件执行kubectl apply或kubectl replace命令即可完成控制器资源的修改操作。不过控制器管控的现存pod对象仍未改变。此时,手动删除控制器现有的pod对象,并由控制器基于新的pod模板自动创建出足额的pod副本即可完成一次应用的升级。实际使用时,还需要更完善的机制,即便是仅执行了一到多次删除操作,手动执行更替操作也并非一项轻松任务。更高级别的pod控制器deployment能够实现更完善的滚动更新和回滚,并为用户提供自定义更新策略的接口。而且,还可以实现蓝绿部署、金丝雀部署和灰度部署等。
2、扩容和缩容
改动rs对象配置中期望的pod副本数量会由控制器实时做出响应,从而实现应用规模的水平伸缩。replicas的修改及应用方式同pod模板,不过,kubectl还提供了一个专用的子命令scale用于实现应用规模的伸缩,它支持从清单文件中获取新的目标副本数量,也可以直接在命令行通过“--replicas”选项进行读取。
五、删除rs控制器资源
使用kubectl delete命令删除rs对象时默认会一并删除其管控的各pod对象。又是,考虑到这些pod资源未必由其创建,或者即使由其创建却也并非其自身的组成部分。故而使用“--cascade=false”选项,取消级联删除相关的pod对象。尽管rs控制器功能强大,但在实践中,它却并非时用户直接使用的控制器,而是deployment。