RC是K8s集群中最早的保证Pod高可用的API对象。通过监控运行中的Pod来保证集群中运行指定数目的Pod副本。
指定的数目可以是多个也可以是1个;少于指定数目,RC就会启动运行新的Pod副本;多于指定数目,RC就会杀死多余的Pod副本。
即使在指定数目为1的情况下,通过RC运行Pod也比直接运行Pod更明智,因为RC也可以发挥它高可用的能力,保证永远有1个Pod在运行。
RC是K8s较早期的技术概念,只适用于长期伺服型的业务类型,比如控制小机器人提供高可用的Web服务。
RS是新一代RC,提供同样的高可用能力,区别主要在于RS后来居上,能支持更多种类的匹配模式。副本集对象一般不单独使用,而是作为Deployment的理想状态参数使用。
Kubernetes 官方建议使用 RS(ReplicaSet ) 替代 RC (ReplicationController ) 进行部署,RS 跟 RC 没有本质的不同,只是名字不一样,并且 RS 支持集合式的 selector (选择标签)
Replica Set的主要作用是保证一定数量的pod能够正常运行,它会持续监听这些pod的运行状态,一旦pod发生故障,就会对pod进行重启或重建。同时它还支持对pod数量的扩缩容和版本镜像的升级
apiVersion: apps/v1 # 版本号
kind: ReplicaSet # 类型
metadata: # 元数据
name: # RS名称
namespace: # 所属命名空间
labels: #标签
controller: rs
spec: # 详情描述
replicas: 3 # pod副本数量
selector: # 选择器,通过它指定该控制器管理哪些pod
matchLabels: # 匹配规则,匹配该RS管理的指定标签的pod
app: nginx-pod
# matchExpressions: # Expressions匹配规则
# - {key: app, operator: In, values: [nginx-pod]}
template: # 创建的pod的配置信息模板,当副本数量不足时,会根据下面的模板创建pod副本
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.17.1
ports:
- containerPort: 80
在这里面,需要新了解的配置项就是spec下面几个选项:
replicas:指定副本数量,其实就是当前RS创建出来的pod的数量,默认为1
selector:选择器,它的作用是建立pod控制器和pod之间的关联关系,采用的Label Selector机制,在pod模板上定义label,在控制器上定义选择器,就可以表明当前控制器能管理哪些pod了
template:模板,就是当前控制器创建pod所使用的模板配置信息
# 根据以上配置文件创建RS
[root@k8s-master ~]# vim pc-replicaset.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: pc-replicaset
namespace: test
labels:
controller: rs
spec:
replicas: 3
selector:
matchLabels:
app: nginx-pod
template:
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.17.1
ports:
- containerPort: 80
# 创建运行3个nginx容器的pod的RS
# 创建
[root@k8s-master ~]# kubectl create -f pc-replicaset.yaml
replicaset.apps/pc-replicaset created
# 查看
[root@k8s-master ~]# kubectl get rs pc-replicaset -n test -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
pc-replicaset 3 3 3 82s nginx nginx:1.17.1 app=nginx-pod
# DESIRED,期望副本数量,对应于配置文件中replica的值;CURRENT,当前运行的副本数量;READY,已准备好提供服务的副本数量
# 查看该RS控制器创建出来的pod
[root@k8s-master ~]# kubectl get pod -n test -o wide --show-labels
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES LABELS
pc-replicaset-4qp9j 1/1 Running 0 7m11s 10.244.1.58 k8s-node01 <none> <none> app=nginx-pod
pc-replicaset-9xbbc 1/1 Running 0 7m11s 10.244.2.40 k8s-node02 <none> <none> app=nginx-pod
pc-replicaset-ln5bl 1/1 Running 0 7m11s 10.244.2.41 k8s-node02 <none> <none> app=nginx-pod
# 控制器创建出来的pod的名称为:控制器名称-xxxxx随机码
# 对RS所创建出来的某一个pod修改其标签
[root@k8s-master ~]# kubectl label pod pc-replicaset-ln5bl app=1234 --overwrite=True -n test
pod/pc-replicaset-ln5bl labeled
# 查看
[root@k8s-master ~]# kubectl get pod -n test -o wide --show-labels
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES LABELS
pc-replicaset-4qp9j 1/1 Running 0 8m32s 10.244.1.58 k8s-node01 <none> <none> app=nginx-pod
pc-replicaset-9xbbc 1/1 Running 0 8m32s 10.244.2.40 k8s-node02 <none> <none> app=nginx-pod
pc-replicaset-ln5bl 1/1 Running 0 8m32s 10.244.2.41 k8s-node02 <none> <none> app=1234
pc-replicaset-sb9fq 1/1 Running 0 10s 10.244.1.59 k8s-node01 <none> <none> app=nginx-pod
# 可以看到,由于标签改变,RS控制器必须重启一个容器以达到3个副本数(因为新标签的pod已经不属于这个RS控制器),所以,如果删除该RS控制器,那么同时会删除其下的3个pod,而这个新标签的pod不会被删除,也就意味着这个新标签的pod成为了自主式的pod,没有任何控制器管理的pod
# 删除该新标签的pod
[root@k8s-master ~]# kubectl delete pod pc-replicaset-ln5bl -n test
pod "pc-replicaset-ln5bl" deleted
[root@k8s-master ~]# kubectl get pod -n test -o wide --show-labels
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES LABELS
pc-replicaset-4qp9j 1/1 Running 0 12m 10.244.1.58 k8s-node01 <none> <none> app=nginx-pod
pc-replicaset-9xbbc 1/1 Running 0 12m 10.244.2.40 k8s-node02 <none> <none> app=nginx-pod
pc-replicaset-sb9fq 1/1 Running 0 3m54s 10.244.1.59 k8s-node01 <none> <none> app=nginx-pod
# 因为是自主式的pod,所以删除了也不会重启
两种方式:
kubectl edit 控制器 控制器名 -n namespace
# 然后修改文件中的 spec:replicas:副本数量 即可
# 如果是以配置清单文件创建的控制器,也可以直接` vim 配置清单文件 ` 修改replicas指定的副本数量,
# 然后使用` kubectl apply -f 配置清单文件 `进行扩缩用
kubectl scale 控制器 控制器名 --replicas=副本数量 -n namespace
【例 】
# 修改上面创建的RS数量
[root@k8s-master ~]# kubectl get rs -n test
NAME DESIRED CURRENT READY AGE
pc-replicaset 3 3 3 22m
# 使用第一种方式,将副本数扩大为6
[root@k8s-master ~]# kubectl edit rs pc-replicaset -n test # 会以vim方式打开
# spec:
# replicas: 3 # 找到该行将3改为6,保存退出即可
replicaset.apps/pc-replicaset edited
# 扩容成功
[root@k8s-master ~]# kubectl get pod -n test
NAME READY STATUS RESTARTS AGE
pc-replicaset-2rfq8 1/1 Running 0 35s
pc-replicaset-4fntj 1/1 Running 0 35s
pc-replicaset-4qp9j 1/1 Running 0 25m
pc-replicaset-8mrt2 1/1 Running 0 10m
pc-replicaset-9xbbc 1/1 Running 0 25m
pc-replicaset-zwb58 1/1 Running 0 35s
# 使用第二种方式将副本数改为2
[root@k8s-master ~]# kubectl scale rs pc-replicaset --replicas=2 -n test
replicaset.apps/pc-replicaset scaled
# 缩容成功
[root@k8s-master ~]# kubectl get pod -n test
NAME READY STATUS RESTARTS AGE
pc-replicaset-4qp9j 1/1 Running 0 27m
pc-replicaset-9xbbc 1/1 Running 0 27m
两种方式:
kubectl edit 控制器 控制器名 -n namespace
# 然后修改文件中的 image: xxxxxx 即可
# 如果是以配置清单文件创建的控制器,也可以直接` vim 配置清单文件 ` 修改image指定的镜像,
# 然后使用` kubectl apply -f 配置清单文件 `进行镜像升级
kubectl set image 控制器 控制器名 容器名=镜像版本 -n namespace
【例 】
[root@k8s-master ~]# kubectl get rs -n test -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
pc-replicaset 2 2 2 40m nginx nginx:1.17.1 app=nginx-pod
# 使用第一种方式升级上面rs的镜像为 1.17.2
[root@k8s-master ~]# kubectl edit rs pc-replicaset -n test
# - image: nginx:1.17.1 找到改行将1.17.1修改为1.17.2
# 保存退出
replicaset.apps/pc-replicaset edited
# 升级成功
[root@k8s-master ~]# kubectl get rs -n test -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
pc-replicaset 2 2 2 44m nginx nginx:1.17.2 app=nginx-pod
# 使用第二种方式镜像改回 1.17.1
[root@k8s-master ~]# kubectl set image rs pc-replicaset nginx=nginx:1.17.1 -n test
replicaset.apps/pc-replicaset image updated
# 变更成功
[root@k8s-master ~]# kubectl get rs -n test -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
pc-replicaset 2 2 2 46m nginx nginx:1.17.1 app=nginx-pod
kubectl delete -f RS配置清单文件 # 如果当前工作目录与清单文件不是同一目录需写全清单文件的绝对路径
# 或
kubectl delete rs RS名 -n namespace
# 使用kubectl delete 命令删除RS的同时也会删除其所管理的pod,在删除RS前,会先将RS的副本数调整为0,等待所有的pod删除完毕之后,再执行RS对象的删除
# 如果仅希望删除RS对象(保留Pod),可以使用 kubectl delete 命令时添加 --cascade=false选项(不推荐)。
# 即: kubectl delete -f RS配置清单文件 --cascade=false 或者 kubectl delete rs RS名 --cascade=false -n namespace