Kubernetes ReplicaSet控制器

2022-10-31 10:20:30 浏览数 (1)

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管理。

0 人点赞