什么是 ReplicaSet 资源
replicaSet
,简称为RS
,是一种kubernetes
资源,使用它,可使集群中运行相同数量的pod
,当其中pod
挂掉的时候,kubernetes
会负责重建该pod
,适合跑一些无状态服务的pod
,我们可以抽象其为如下图示:
我们使用replicaSet
管理了4个pod
,分为为pod A
、pod B
、pod C
以及pod D
,当Node2
挂掉之后,replicaSet
会负责重建该pod
,所以,pod
会在Node1
进行新建pod
ReplicaSet 扩缩容逻辑
我们一般在创建replicaset
资源时,会指定一个初始pod
个数 并且指定一个标签,这个时候kubernetes
会创建这么多个pod
,当pod
挂了的时候,这个时候replicaSet
会创新新的pod
,注意,最重要的点,replicaset
是根据pod
的标签值来判定个数的,其逻辑如下
可能会想,怎么可能当前符合标签的pod
数大于设置的阈值,有2种可能
- 我们创建pod,手动分配标签,强行加入
replicaset
- 我们手动降低了
replicaset
的预定副本值
这里还需要引入一个点,若创建RS
后,镜像更新了,此后再扩容pod
的时候,使用的是新镜像内容,而还在运行的pod
则使用的老镜像,如:
假设在创建RS
后,我们更新了镜像内容,此时若Node2
崩溃,那么node2
上的pod
将会被意外停止,此时若kubernetes
检查pod
数目,发现少了,则会新创建符合标签的pod
,而此时,创建的pod
镜像为新的,而还在运行的则为老的,如下所示:
尝试使用replicaset
我们先使用explain
来获取一下帮助
我们尝试编写一个rs
注意,示例中rs
的标签选择器要和pod
标签相对应才行,否则会报错,不允许创建
我们使用apply
创建后,查看rs
我们查看pod
的的信息
使用--show-labels
可以打印pod
的标签信息
现在我们创建一个新的Pod
,并且将label
也赋值为app=nginxpdudo
最主要是label
我们再次查看pod
信息
我们发现该pod
创建不上去
为了模拟这种实验,我们可以先创建单独的pod
,再创建 replicaset
,我们来看下
我们发现一个很有意思的事情,rs
并没有删除掉redis
的pod
,而是判断现在已经有1个了,所以再创建2个就能达到阈值了,于是乎创建了2个。
我们再来一个实验。我们将rs
允许的pod
数阈值给调高上去查看一下,我们可以使用kubectl edit
来修改正在运行的rs
总结
我们之所以需要replicaset
,是因为我们想运行多个无状态服务程序,并且想让之提供可靠的服务,具体扩缩容的逻辑,是根据pod
的标签来决定的,所以说,在我们操作kubernetes
中,给pod
打标签,这个是至关重要的,尽量做到看名知意,且不会和其他资源冲突,若不确定,可以使用labels
工具先行捞取一下在当前namespace
中,是有有相匹配的pod
。