K8S动手教程3.2:rc删除,水平缩放,ReplicaSet

内容摘要

rc删除

rc水平缩放

ReplicaSet

测试环境

创建两节点K8S集群。

rc水平缩放

上一节我们讲到了rc的副本数,该副本数可以在rc运行时修改,可以增加也可以减少,这就是rc的水平缩放特性。

我们仍旧使用上一节的测试容器镜像,rc的配置如下:

apiVersion: v1
kind: ReplicationController
metadata:
 name: myrc
spec:
 replicas: 3
 selector:
 app: myrc
 template:
 metadata:
 labels:
 app: myrc
 spec:
 containers:
 - name: rcimage
 image: huqianakls/rc_image:latest
 ports:
 - containerPort: 8080

创建该rc,查询Pod,结果为:

K8S动手教程3.2:rc删除,水平缩放,ReplicaSet

1、修改rc的replicas属性,将副本数量增加到5

使用kubectl edti rc 命令修改,修改后,查询Pod,结果如下:

K8S动手教程3.2:rc删除,水平缩放,ReplicaSet

副本数量增加了2个。

2、修改rc的replicas属性,将副本数量减少到3

仍旧使用kubectl edit rc命令修改,查询Pod,结果如下:

K8S动手教程3.2:rc删除,水平缩放,ReplicaSet

rc停止了两个Pod,数量减少到3个。

除了使用上面修改rc的方式实现水平缩放,还可以使用如下命令:

kubectl scale rc rc名称 --replicas=副本数量
 

下面我们使用这个命令来实验下能否将副本数减少到0,运行结果如下:

K8S动手教程3.2:rc删除,水平缩放,ReplicaSet

可以看到,所有的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:

K8S动手教程3.2:rc删除,水平缩放,ReplicaSet

rc被成功删除。

查询Pod:

K8S动手教程3.2:rc删除,水平缩放,ReplicaSet

Pod还在,没有删除。

在rc删除,Pod没有删除时,我们可以再次新建rc,rc不会新建Pod,而是和已有的Pod匹配。下面实验一下:

使用kubectl create -f 命令创建,查询rc:

K8S动手教程3.2:rc删除,水平缩放,ReplicaSet

查询Pod:

K8S动手教程3.2:rc删除,水平缩放,ReplicaSet

没有新建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信息如下:

K8S动手教程3.2:rc删除,水平缩放,ReplicaSet

下面我们创建一个rs,先来个简单的,rs配置如下:

apiVersion: apps/v1beta2
kind: ReplicaSet
metadata:
 name: myrs
spec:
 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:

K8S动手教程3.2:rc删除,水平缩放,ReplicaSet

可以看到3个Pod和我们新建的rs匹配成功。

查询rs详情,命令为:

kubectl describe rs myrs
K8S动手教程3.2:rc删除,水平缩放,ReplicaSet

Events显示,没有新建Pod。

rs还支持更加复杂的表达式,比如:

apiVersion: apps/v1beta2
kind: ReplicaSet
metadata:
 name: myrs
spec:
 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,结果如下图:

K8S动手教程3.2:rc删除,水平缩放,ReplicaSet

创建上面的rs,结果如下:

K8S动手教程3.2:rc删除,水平缩放,ReplicaSet

可以看到和已有的Pod匹配成功。

下面我们在做个实验,rs改为如下配置:

apiVersion: apps/v1beta2
kind: ReplicaSet
metadata:
 name: myrs
spec:
 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,结果如下:

K8S动手教程3.2:rc删除,水平缩放,ReplicaSet

匹配成功。

其他表达式大家可以自行测试。

实验

1、创建rc,测试水平缩放;

2、创建rs;


分享到:


相關文章: