Hi~朋友,关注置顶防止错过消息
ReplicaSet作用是什么?
ReplicaSet的目的是为了维护一组稳定的Pod集合,用来保证给定数量的Pod可用性。
ReplicaSet使用场景?
ReplicaSet不推荐单独使用,而推荐使用Deployment,Deployment可以控制ReplicaSet,从而借助ReplicaSet实现其滚动更新的功能。
Deloyment在实现各种特色功能时,其实都是在操作ReplicaSet,而不是直接操作Pod,至于Pod如何创建如何收缩,都是由ReplicaSet来决定。
代码语言:javascript复制$ kubectl get pods nginx-deployment-5778cd94ff-h5xgv -o yaml
从上图可以看到,Pod的OwnerReference是ReplicaSet。
ReplicaSet定义
代码语言:javascript复制apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: nginx-rs
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.16.1
ports:
- containerPort: 80
代码语言:javascript复制$ kubectl apply -f nginx-rs.yaml
$ kubectl get rs
$ kubectl get pods
从上图中我们可以看到名称为nginx-rs的ReplicaSet被成功创建,在get rs的结果中有几个字段:
- NAME:ReplicaSet的名字
- DESIRED:应用期望的副本数
- CURRENT:处于运行状态的副本数
- READY:可以为用户提供服务的副本数
- AGE:应用已经运行的时间
非模板Pod的管理
首先解释一下什么是非模板Pod,非模板Pod就是我们直接创建的Pod,不是通过RS或者其他控制器创建的Pod,比如下面这个:
代码语言:javascript复制apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.16.1
如果ReplicaSet已经创建,并且Pod的数量已经达到我们的期望值,此时如果我们直接创建符合ReplicaSet选择的Pod,该Pod不会被创建成功,因为该Pod会被RS直接获取,并且如果他存在将会超过期望数,因此Pod会被RS杀死。
代码语言:javascript复制$ kubectl apply -f pod-rs.yaml
$ kubectl describe pods nginx
从上图可以看出我们手动创建的nginx pod成功被RS获取到,并且被kill掉。
假设我们先手动创建Pod,然后再建立RS,并且手动建立的Pod符合RS的selector,此时RS会先收集到手动创建的Pod,如果手动创建的pod超过了RS的期待值,多余的会被杀掉,如果不够期待值,会在现有的基础上再创建pod直到到达期待值。
代码语言:javascript复制$ kubectl apply -f pod-rs.yaml
$ kubectl apply -f nginx-rs.yaml
从上图可以看出我们手动创建的Pod成功被RS管理。