内容摘要
rc删除
rc水平缩放
ReplicaSet
测试环境
创建两节点K8S集群。
rc水平缩放
上一节我们讲到了rc的副本数,该副本数可以在rc运行时修改,可以增加也可以减少,这就是rc的水平缩放特性。
我们仍旧使用上一节的测试容器镜像,rc的配置如下:
apiVersion: v1kind: ReplicationControllermetadata: name: myrcspec: replicas: 3 selector: app: myrc template: metadata: labels: app: myrc spec: containers: - name: rcimage image: huqianakls/rc_image:latest ports: - containerPort: 8080
创建该rc,查询Pod,结果为:
1、修改rc的replicas属性,将副本数量增加到5
使用kubectl edti rc 命令修改,修改后,查询Pod,结果如下:
副本数量增加了2个。
2、修改rc的replicas属性,将副本数量减少到3
仍旧使用kubectl edit rc命令修改,查询Pod,结果如下:
rc停止了两个Pod,数量减少到3个。
除了使用上面修改rc的方式实现水平缩放,还可以使用如下命令:
kubectl scale rc rc名称 --replicas=副本数量
下面我们使用这个命令来实验下能否将副本数减少到0,运行结果如下:
可以看到,所有的Pod都被停止了。
这种方式可以实现删除Pod,不删除rc。
rc删除
rc删除方式如下:
1、kubectl delete -f rc的yaml文件
2、kubectl delete rc rc名称
上述两种方式比较简单,大家自己测试。
如何在删除rc的时候不想删除Pod如何做呢?
使用--cascade= false参数可以做到这一点,下面我们实验一下:
首先将前面的rc副本数增加到3,命令为:
kubectl scale rc myrc --replicas=3
带Pod状态变为Running后,执行如下命令:
kubectl delete rc myrc --cascade=false
查询rc:
rc被成功删除。
查询Pod:
Pod还在,没有删除。
在rc删除,Pod没有删除时,我们可以再次新建rc,rc不会新建Pod,而是和已有的Pod匹配。下面实验一下:
使用kubectl create -f 命令创建,查询rc:
查询Pod:
没有新建Pod,还是先前的Pod。
ReplicaSet
rc是第1代副本控制器,后来K8S又提供了ReplicaSet,下面简称rs。rs比rc要更加先进,主要体现在Pod选择器属性上,rs具有更加灵活的Pod标签匹配机制。rs将会完全替换rc,rc最终要被废弃。
下面我们通过实验来展示一下rs标签匹配机制的强大。
创建上面的rc,之后再使用--cascade=false参数删除该rc,这样系统中就有3个不受rc约束的Pod了。3个Pod信息如下:
下面我们创建一个rs,先来个简单的,rs配置如下:
apiVersion: apps/v1beta2kind: ReplicaSetmetadata: name: myrsspec: replicas: 3 selector: matchLabels: app: myrc template: metadata: labels: app: myrc spec: containers: - name: rs image: huqianakls/rc_image:latest
说明:
1、由于3个Pod的标签是app=myrc,所有这里还是使用它;
2、第1个spec下的selector中,使用了matchLabels属性,这是rc没有的,这里的配置的和先前的rc一样;
3、请注意kind和apiVerson;
创建rs,查询rs和Pod:
可以看到3个Pod和我们新建的rs匹配成功。
查询rs详情,命令为:
kubectl describe rs myrs
Events显示,没有新建Pod。
rs还支持更加复杂的表达式,比如:
apiVersion: apps/v1beta2kind: ReplicaSetmetadata: name: myrsspec: replicas: 3 selector: matchExpressions: - key: app operator: In values: - myrc template: metadata: labels: app: myrc spec: containers: - name: rs image: huqianakls/rc_image:latest
说明:
1、上面的Pod选择器变成了一个表达式,表示app这个key的值可以是myrc,values属性是一个数组,因此可以指定多个值,In表示在某个集合中,是一个逻辑运算符;
2、rs支持的逻辑运算符包括:
In:表示key的值必须与至少一个values中的项匹配;
NotIn:表示key的值与任何values中的项都不匹配;
Exists:表示Pod必须存在某个key才能和rs匹配;
DoesNotExist:表示Pod必须不存在某个key才能和rs匹配;
下面我们实验下这些表达式:
1、创建上面的rs
先删除先前创建rs,使用--cascasde=false参数,只删除rs,不删除Pod,结果如下图:
创建上面的rs,结果如下:
可以看到和已有的Pod匹配成功。
下面我们在做个实验,rs改为如下配置:
apiVersion: apps/v1beta2kind: ReplicaSetmetadata: name: myrsspec: replicas: 3 selector: matchExpressions: - key: app operator: Exists template: metadata: labels: app: myrc spec: containers: - name: rs image: huqianakls/rc_image:latest
说明:将operator改为Exists,匹配规则变为存在app标签。
先删除上面的rs,同样不删除Pod,之后创建rs,结果如下:
匹配成功。
其他表达式大家可以自行测试。
实验
1、创建rc,测试水平缩放;
2、创建rs;