Skip to content

1.ReplicaSet

1.1 传统应⽤集群

在传统环境中,如果要保证应用的高可用。一般都以集群方式部署,集群中的应用实例至少部署2个以上,这样即使一个应用故障了,另一台应用任然能够对外提供服务,在这种环境下,我们主要依赖前置的负载均衡Nginx,通过手动编辑配置文件的方式来实现。而一旦我们需要对应用进行扩容或缩容,也需要在Nginx上进行手动配置,过程相对繁琐也比较容易出错。

image-20240430135851488

1.2 什么是ReplicaSet

文档,https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/replicaset/

ReplicaSet 的目的是维护一组在任何时候都处于运行状态的 Pod 副本的稳定集合。 因此,它通常用来保证给定数量的、完全相同的 Pod 的可用性

在Kubernetes环境中,通过ReplicaSet这种资源对象就可以来帮助我们实现集群的高可用,RepLicaSet(RS)的主要作用就是维持一组Pod副本的运行,ReplicaSet控制器会持续监听它控制的这些Pod的运行状态以及数量,保证应用集群的高可用;

ReplicaSet和Deployment联合起来控制无状态应用。ReplicaSet并不是我们直接应该使用的控制器,虽然说它是一个非常重要的基础的控制器。而更加高级的抽象的也是我们使用最多的控制器叫Deployment。借助一到多个ReplicaSet便捷的管理Pod。从某种意义来讲,Deployment是ReplicaSet控制器。Deployment控制器在定义的时候却不定义与Replicaset有任何关系。定义的所有内容都是Pod模板。Pod副本之类的。也就对用户而言,即便我们使用Deployment控制器,用户即便使用的是ReplicaSet控制器,用户对中间的Replicaset甚至无从感知的。

image-20240430140739476

💡 说明

正确的管理方式是 Deployment->ReplicaSet->Pod

1.3 ReplicaSet组成部分

ReplicaSet控制器包含了3个基本的组成部分:

  • selector标签选择器:匹配并关联Pod对象,并加入控制器的管理中;
  • replicas期望的副本数:期望在集群中所运行的Pod对象数量
  • template Pod模板:实际上就是定义的 Pod规范,相当于把一个Pod的描述以模板的形式嵌入到了RepLicaSet

1.4 ReplicaSet的资源规范

ReplicaSet配置文件示例:

yaml
apiVersion: apps/v1   # 所在群组是apps/v1群组和Deployment一样;
kind: ReplicaSet       # 资源类型为ReplicaSet;
metadata: 
  name:   # Pod的名称;
  namespace:  # Pod所在的Namespace,默认是Default;
spec:
   minReadySeconds <integer>  #  Pod就绪后多少秒内任一容器无Crash方可视为"就绪"
   replicas  <integer>        #  期望的Pod副本数,默认为1。如果期望Pod的副本数增加,只需要更改replicas的数字即可。如果你写2个,创建的Pod就是根据Template定义的规范去运行起来的。Pod启动后就会被我们标签选择器所管理,进而被我们RS所管理。
   selector:    # 这里的标签选择器与Service的标签选择器是不一样的,不是选择器的功能不一样,而是选择器的格式不同;
     matchExpressions <[]Object>
     matchLabels <map[string]string>
   template:    # 定义Pod的模板,用来描述Pod的详情;比如定义Containers、Images、Resoucre、Lifecycle,把它做成一个模板。
    metadata:
      labels:  # 定义Pod的标签,
    spec:
apiVersion: apps/v1   # 所在群组是apps/v1群组和Deployment一样;
kind: ReplicaSet       # 资源类型为ReplicaSet;
metadata: 
  name:   # Pod的名称;
  namespace:  # Pod所在的Namespace,默认是Default;
spec:
   minReadySeconds <integer>  #  Pod就绪后多少秒内任一容器无Crash方可视为"就绪"
   replicas  <integer>        #  期望的Pod副本数,默认为1。如果期望Pod的副本数增加,只需要更改replicas的数字即可。如果你写2个,创建的Pod就是根据Template定义的规范去运行起来的。Pod启动后就会被我们标签选择器所管理,进而被我们RS所管理。
   selector:    # 这里的标签选择器与Service的标签选择器是不一样的,不是选择器的功能不一样,而是选择器的格式不同;
     matchExpressions <[]Object>
     matchLabels <map[string]string>
   template:    # 定义Pod的模板,用来描述Pod的详情;比如定义Containers、Images、Resoucre、Lifecycle,把它做成一个模板。
    metadata:
      labels:  # 定义Pod的标签,
    spec:

image-20240430141034808

示例配置1

yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: mall-web-rs     # RS控制器名称
  namespace: default    # 命名空间
spec:
  replicas: 2           # 期望的 Pod 副本数量,默认值为1
  selector:             # 选择器,匹配 Pod 模板中的标签
    matchLabels:
      app: mall-web
  template:             # 定义 Pod 模板 (内嵌Pod模板不需要apiVersion和kind字段)
    metadata:
      labels:           # 定义Pod标签
        app: mall-web
    spec:
      containers:       # 定义容器列表
      - name: mall-web
        image: nginx:latest
        ports:
        - containerPort: 8080
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: mall-web-rs     # RS控制器名称
  namespace: default    # 命名空间
spec:
  replicas: 2           # 期望的 Pod 副本数量,默认值为1
  selector:             # 选择器,匹配 Pod 模板中的标签
    matchLabels:
      app: mall-web
  template:             # 定义 Pod 模板 (内嵌Pod模板不需要apiVersion和kind字段)
    metadata:
      labels:           # 定义Pod标签
        app: mall-web
    spec:
      containers:       # 定义容器列表
      - name: mall-web
        image: nginx:latest
        ports:
        - containerPort: 8080

示例配置2

yaml
#cat nginx-test-replicas.yaml 
apiVersion: apps/v1  # API版本
kind: ReplicaSet     # 资源类型
metadata: 
  name: nginx-rs      # RS控制器名称
  namespace: default  # 名称空间
spec:          # 定义RS规范
  replicas: 2  # 定义的副本数,如果我们觉得副本数量太小,可以在这里定义副本数,也可以通过命令的方式来扩缩容。
  minReadySeconds: 20  # Pod就绪后多少秒内任一容器无Crash方可视为"就绪"
  selector:        #  标签选择器
    matchLabels:  
       app: nginx-test  
  template:       # Pod的模板
    metadata:
      labels:
        app: nginx-test  #  标签匹配上面的Selector
    spec:
      containers:        # 定义容器
      - name: nginx      # Containers Name
        image: nginx     # Containers Images
        ports:           # 定义容器的端口
        - name: http
          containerPort: 80  # 容器的端口为80
#cat nginx-test-replicas.yaml 
apiVersion: apps/v1  # API版本
kind: ReplicaSet     # 资源类型
metadata: 
  name: nginx-rs      # RS控制器名称
  namespace: default  # 名称空间
spec:          # 定义RS规范
  replicas: 2  # 定义的副本数,如果我们觉得副本数量太小,可以在这里定义副本数,也可以通过命令的方式来扩缩容。
  minReadySeconds: 20  # Pod就绪后多少秒内任一容器无Crash方可视为"就绪"
  selector:        #  标签选择器
    matchLabels:  
       app: nginx-test  
  template:       # Pod的模板
    metadata:
      labels:
        app: nginx-test  #  标签匹配上面的Selector
    spec:
      containers:        # 定义容器
      - name: nginx      # Containers Name
        image: nginx     # Containers Images
        ports:           # 定义容器的端口
        - name: http
          containerPort: 80  # 容器的端口为80
bash
# 创建Pod
[root@kube-master volumes]# kubectl apply -f nginx-test-replicas.yaml 
replicaset.apps/nginx-rs created

# 这两个副本都能提供服务且是相同的服务。
[root@kube-master volumes]# kubectl get pods -l app=nginx-test
NAME             READY   STATUS    RESTARTS   AGE
nginx-rs-542db   1/1     Running   0          2m1s
nginx-rs-hcxh9   1/1     Running   0          2m1s

# ReplicaSet可以简写为rs,写replicaset或者rs都可以。
[root@kube-master volumes]# kubectl get  rs nginx-rs
NAME       DESIRED   CURRENT   READY   AGE
nginx-rs   2         2         2       85s
# DESIRED:期望是2个Pod
# CURRENT:正常运行是2个
# READY: 正在运行是2个
# AGE:运行时间

# 如果我把某一个Pod删除以后,控制器是自己会创建Pod的。ReplicaSet会始终维持与我们所期望的副本数保持一致;
[root@kube-master volumes]# kubectl delete pods nginx-rs-hcxh9 
pod "nginx-rs-hcxh9" deleted

# 可以发现一个已经重建。或者通过describe来查看
[root@kube-master volumes]# kubectl get pods -l app=nginx-test
NAME             READY   STATUS              RESTARTS   AGE
nginx-rs-542db   1/1     Running             0          7m32s
nginx-rs-n8995   1/1     Running             0          5s

# 我们也可以通过describe RS来查看我们Pod被重建的信息,通过Events可以看到一个Pod被重建n8995;
[root@kube-master volumes]# kubectl describe rs nginx-rs
Name:         nginx-rs
Namespace:    default
Selector:     app=nginx-test
Labels:       <none>
Annotations:  <none>
Replicas:     2 current / 2 desired
Pods Status:  2 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
  Labels:  app=nginx-test
  Containers:
   nginx:
    Image:        nginx
    Port:         80/TCP
    Host Port:    0/TCP
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Events:
  Type    Reason            Age   From                   Message
  ----    ------            ----  ----                   -------
  Normal  SuccessfulCreate  56m   replicaset-controller  Created pod: nginx-rs-542db
  Normal  SuccessfulCreate  56m   replicaset-controller  Created pod: nginx-rs-hcxh9
  Normal  SuccessfulCreate  48m   replicaset-controller  Created pod: nginx-rs-n8995
# 创建Pod
[root@kube-master volumes]# kubectl apply -f nginx-test-replicas.yaml 
replicaset.apps/nginx-rs created

# 这两个副本都能提供服务且是相同的服务。
[root@kube-master volumes]# kubectl get pods -l app=nginx-test
NAME             READY   STATUS    RESTARTS   AGE
nginx-rs-542db   1/1     Running   0          2m1s
nginx-rs-hcxh9   1/1     Running   0          2m1s

# ReplicaSet可以简写为rs,写replicaset或者rs都可以。
[root@kube-master volumes]# kubectl get  rs nginx-rs
NAME       DESIRED   CURRENT   READY   AGE
nginx-rs   2         2         2       85s
# DESIRED:期望是2个Pod
# CURRENT:正常运行是2个
# READY: 正在运行是2个
# AGE:运行时间

# 如果我把某一个Pod删除以后,控制器是自己会创建Pod的。ReplicaSet会始终维持与我们所期望的副本数保持一致;
[root@kube-master volumes]# kubectl delete pods nginx-rs-hcxh9 
pod "nginx-rs-hcxh9" deleted

# 可以发现一个已经重建。或者通过describe来查看
[root@kube-master volumes]# kubectl get pods -l app=nginx-test
NAME             READY   STATUS              RESTARTS   AGE
nginx-rs-542db   1/1     Running             0          7m32s
nginx-rs-n8995   1/1     Running             0          5s

# 我们也可以通过describe RS来查看我们Pod被重建的信息,通过Events可以看到一个Pod被重建n8995;
[root@kube-master volumes]# kubectl describe rs nginx-rs
Name:         nginx-rs
Namespace:    default
Selector:     app=nginx-test
Labels:       <none>
Annotations:  <none>
Replicas:     2 current / 2 desired
Pods Status:  2 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
  Labels:  app=nginx-test
  Containers:
   nginx:
    Image:        nginx
    Port:         80/TCP
    Host Port:    0/TCP
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Events:
  Type    Reason            Age   From                   Message
  ----    ------            ----  ----                   -------
  Normal  SuccessfulCreate  56m   replicaset-controller  Created pod: nginx-rs-542db
  Normal  SuccessfulCreate  56m   replicaset-controller  Created pod: nginx-rs-hcxh9
  Normal  SuccessfulCreate  48m   replicaset-controller  Created pod: nginx-rs-n8995