这是我参与2022首次更文挑战的第24天,活动详情查看:2022首次更文挑战」 之前了解了k8s到底是什么,接下来看看k8s的组成。
控制器管理的Pod
控制器管理的Pod有三种:ReplicationController & ReplicaSet & Deployment , 这三种控制器有很多相似的地方
i.ReplicationController
ReplicationController简称rc. 它的作用是确保容器应用的副本数始终保持在用户定义的副本数, 这是用户的期望。即如果有容器异常退出, 会自动创建新的Pod来代替; 而如果异常多出来的容器也会自动回收. 在新版本的k8s中, 建议使用ReplicaSet来取代ReplicationController.
ii.ReplicaSet:
ReplicaSet简称rs. 跟ReplicationController没有本质上的区别, 除了名字不同, ReplicaSet支持集合式的selector.
这个集合式的选择器是什么呢?就是在我们创建Pod的时候, 可以给他打标签. 比如: app = http, version = v1版本等等. 我们会打一堆的标签. 当我们想删除容器的时候, 我们可以这样说: 当app=http, version = v1的时候, 执行什么操作. rs支持这种集合方案, 但是rc不支持. 所以在大型项目中, rs比rc会更简单, 更有效率. 所以, 在新版本中, 官方抛弃rc, 全部转用rs.
在小的集群下,有没有标签都没所谓,但当集群越来越大,pod越来越多的时候,标签就很有用了。我们可以通过标签定位某一个pod。
所以,rc适合小集群使用,rs适合多集群,pod量很大的时候使用。rs包含了rc的功能,所以官方都建议使用rs。
iii.Deployment:
虽然replicaSet可以独立使用, 但一般还是建议使用Deployment来自动管理ReplicaSet, 这样就无需担心跟其他机制的不兼容问题(比如ReplicaSet不支持 rolling-update滚动更新, 但Deployment支持)
滚动更新还是很有意义的, 尤其是在生成环境中
比如:我们现在有两个容器, 我们要将现在容器的版本从v1版本升级到v2版本. 这时候, 怎么办呢? 我们可以进行滚动更新.
首先, 先生成一个新的pod. 然删除一个旧的pod, 如下如所示. 先生成一个v2版本的pod, 然后删除一个v1版本的pod .再把v2版本的pod挂载到集群上,然后以此类推,所有服务器以此替换。最后,所有服务器就都是v2版本的,这就是滚动更新.
那么, Deployment是如何管理rs并滚动更新的呢?
- 首次部署的时候,要做那些事呢?
第一步:会创建一个Deployment控制器,在Deployment控制器中定义了pod的模板和副本数量。
第二步,Deployment会主动创建一个RS。也就是说rs不是我们自己定义的, 是Deployment自动生成的. RS会创建多个pod
第三步,RS主动帮我们创建Pod,并维持pod副本数的稳定。
Deployment定义出来以后, 他会定义一个rs, RS会创建多个pod. 如下图
- 当需要更新版本的时候. 怎么做呢?
官方开发出了v2版本,这时我们要进行滚动更新了。如何滚动更新呢?
第一步:Deployment会更改pod模板为V2。
第二步:Deployment控制器再创建一个新的RS。我们的期望是从左边的RS迁移到右边的RS。
`
第三步:RS-2再创建一个新的 Pod, 将其升级到v2版本. 然后下掉一个v1版本的Pod
第四步:在创建一个Pod, 将其版本升级到v2, 在下掉一个v1版本的Pod
第五步:直至全部下完.
这就是Deployment管理的滚动rolling-update滚动升级。
如果升级的过程中, 发现新版本有一些小bug, 我们还可以回滚. 如何回滚, 执行undo即可. 回滚的逻辑和版本升级的原理一样. 恢复一个v1, 下掉一个v2. 直至全部恢复.
为什么RS能够恢复呢? 因为, 下掉的RS没有被删掉. 只是停用了. 当回滚的时候, 老旧的RS就会被启动.
HPA(HorizontalPodAutoScale) : Horizontal Pod AutoScaling 仅适用于Deployment和ReplicaSet, 在V1版本中仅支持根据Pod的CPU利用率扩缩容, 在vlalpha版本中, 支持根据内存和用户自定义的metric扩缩容.
我运行了一个RS, RS下管理两个Pod,
然后, 在定义一个HPA, HPA也是一个对象, 他是基于RS创建的, 那HPA怎么定义的呢? 当CPU>80%的时候, 开始扩容, 扩容的最大值是10个, 最小值是2个
也就是说HPA会去监控RS下Pod的资源利用率. 如果资源利用率>80%, 那么开始扩展Pod, 然后判断是否依然超过80%, 如果是 继续扩展. 直到扩展到资源利用率低于80%, 或者最大数达到10个.
一旦资源利用率变低以后, 开始缩容. 他会先减掉一个pod. 看看是否达到80%, 还没达到继续减. 但最少的pod数是两个. 也即是减到只剩2个pod, 不能再减了.
这样就达到了一个水平扩展的目的. 这也是HPA帮我们实现的.
iv. HPA控制器
Horizontal Pod Autoscaling 简称HPA控制器,仅适用于Deployment和ReplicaSet,在V1版本中仅支持根据Pod的CPU利用率扩缩容,在vlalpha版本中,可以根据内存和用户自定义的metric扩缩容。
举个例子,
首先,我们创建出一个Deployment控制器或者RS控制器,这个控制器会创建pod副本,在Deployment或者RS之上可以增加一个HPA控制器。HPA控制器可以定义一个阈值,比如CPU使用率大于80%的时候,进行扩容;CPU使用率小于20%的时候进行缩容。pod副本数最小2个,最大20个。
于是,当cpu使用率超过80%的时候,RS会自动进行扩容,最大扩容到20个副本。
如果创建了20个副本以后,CPU依然大于80%,那么就爱莫能助了。
缩容也是一样的,当cpu使用很小的时候,就缩容,但最小是2个。