Kubernetes(k8s)控制器(四):ReplicaSet

发布时间 2023-03-22 19:10:53作者: 人生的哲理

一.系统环境

服务器版本 docker软件版本 Kubernetes(k8s)集群版本 CPU架构
CentOS Linux release 7.4.1708 (Core) Docker version 20.10.12 v1.21.9 x86_64

Kubernetes集群架构:k8scloude1作为master节点,k8scloude2,k8scloude3作为worker节点

服务器 操作系统版本 CPU架构 进程 功能描述
k8scloude1/192.168.110.130 CentOS Linux release 7.4.1708 (Core) x86_64 docker,kube-apiserver,etcd,kube-scheduler,kube-controller-manager,kubelet,kube-proxy,coredns,calico k8s master节点
k8scloude2/192.168.110.129 CentOS Linux release 7.4.1708 (Core) x86_64 docker,kubelet,kube-proxy,calico k8s worker节点
k8scloude3/192.168.110.128 CentOS Linux release 7.4.1708 (Core) x86_64 docker,kubelet,kube-proxy,calico k8s worker节点

二.前言

使用ReplicaSet的前提是已经有一套可以正常运行的Kubernetes集群,关于Kubernetes(k8s)集群的安装部署,可以查看博客《Centos7 安装部署Kubernetes(k8s)集群》https://www.cnblogs.com/renshengdezheli/p/16686769.html。

三.ReplicaSet概览

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

ReplicaSet与ReplicationController控制器类似,都是用来维持pod副本数,关于ReplicationController的详细内容,请查看博客《Kubernetes(k8s)控制器(三):ReplicationController》。

ReplicaSet一般作为deployment控制器的底层控制器。关于deployment控制器的详细内容,请查看博客《Kubernetes(k8s)控制器(一):deployment》。

四.ReplicaSet工作原理

ReplicaSet 是通过一组字段来定义的,包括一个用来识别可获得的 Pod 的集合的选择算符、一个用来标明应该维护的副本个数的数值、一个用来指定应该创建新 Pod 以满足副本个数条件时要使用的 Pod 模板等等。 每个 ReplicaSet 都通过根据需要创建和删除 Pod 以使得副本个数达到期望值, 进而实现其存在价值。当 ReplicaSet 需要创建新的 Pod 时,会使用所提供的 Pod 模板。

ReplicaSet 通过 Pod 上的 metadata.ownerReferences 字段连接到附属 Pod,该字段给出当前对象的属主资源。 ReplicaSet 所获得的 Pod 都在其 ownerReferences 字段中包含了属主 ReplicaSet 的标识信息。正是通过这一连接,ReplicaSet 知道它所维护的 Pod 集合的状态, 并据此计划其操作行为。

ReplicaSet 使用其选择算符来辨识要获得的 Pod 集合。如果某个 Pod 没有 OwnerReference 或者其 OwnerReference 不是一个控制器, 且其匹配到某 ReplicaSet 的选择算符,则该 Pod 立即被此 ReplicaSet 获得。

五.ReplicaSet使用场景

ReplicaSet 确保任何时间都有指定数量的 Pod 副本在运行。 然而,Deployment 是一个更高级的概念,它管理 ReplicaSet,并向 Pod 提供声明式的更新以及许多其他有用的功能。 因此,建议使用 Deployment 而不是直接使用 ReplicaSet, 除非你需要自定义更新业务流程或根本不需要更新。这意味着,你可能永远不需要操作 ReplicaSet 对象:而是使用 Deployment,并在 spec 部分定义你的应用。

六.创建ReplicaSet

配置replicaset,replicas: 3 指定pod副本数为3个

[root@k8scloude1 daemonset]# vim ReplicaSet.yaml

[root@k8scloude1 daemonset]# cat ReplicaSet.yaml 
apiVersion: apps/v1 
kind: ReplicaSet 
metadata: 
  name: rs 
  labels: 
    app: guestbook 
spec: 
  replicas: 3 
  selector: 
    matchLabels: 
      tier: frontend 
  template: 
    metadata: 
      labels: 
        app: guestbook 
        tier: frontend 
    spec: 
      terminationGracePeriodSeconds: 0
      containers: 
      - name: nginx 
        imagePullPolicy: IfNotPresent
        image: nginx

创建replicaset

[root@k8scloude1 daemonset]# kubectl apply -f ReplicaSet.yaml 
replicaset.apps/rs created

[root@k8scloude1 daemonset]# kubectl get rs
NAME   DESIRED   CURRENT   READY   AGE
rs     3         3         3       25s

现在有3个pod

[root@k8scloude1 daemonset]# kubectl get pod -o wide
NAME       READY   STATUS    RESTARTS   AGE   IP               NODE         NOMINATED NODE   READINESS GATES
rs-d58dk   1/1     Running   0          34s   10.244.112.173   k8scloude2   <none>           <none>
rs-fn2tw   1/1     Running   0          34s   10.244.251.231   k8scloude3   <none>           <none>
rs-v676w   1/1     Running   0          34s   10.244.112.175   k8scloude2   <none>           <none>

七.扩展replicaset副本数

通过kubectl scale rs 扩展replicaset副本数,--replicas=5 设置pod副本数为5

[root@k8scloude1 daemonset]# kubectl scale rs rs --replicas=5
replicaset.apps/rs scaled

现在就有5个pod了

[root@k8scloude1 daemonset]# kubectl get pod -o wide
NAME       READY   STATUS              RESTARTS   AGE   IP               NODE         NOMINATED NODE   READINESS GATES
rs-554fh   0/1     ContainerCreating   0          2s    <none>           k8scloude2   <none>           <none>
rs-d58dk   1/1     Running             0          93s   10.244.112.173   k8scloude2   <none>           <none>
rs-fn2tw   1/1     Running             0          93s   10.244.251.231   k8scloude3   <none>           <none>
rs-ltmpv   0/1     ContainerCreating   0          2s    <none>           k8scloude3   <none>           <none>
rs-v676w   1/1     Running             0          93s   10.244.112.175   k8scloude2   <none>           <none>

[root@k8scloude1 daemonset]# kubectl get pod -o wide
NAME       READY   STATUS    RESTARTS   AGE   IP               NODE         NOMINATED NODE   READINESS GATES
rs-554fh   1/1     Running   0          3s    10.244.112.174   k8scloude2   <none>           <none>
rs-d58dk   1/1     Running   0          94s   10.244.112.173   k8scloude2   <none>           <none>
rs-fn2tw   1/1     Running   0          94s   10.244.251.231   k8scloude3   <none>           <none>
rs-ltmpv   1/1     Running   0          3s    10.244.251.232   k8scloude3   <none>           <none>
rs-v676w   1/1     Running   0          94s   10.244.112.175   k8scloude2   <none>           <none>

删除replicaset

[root@k8scloude1 daemonset]# kubectl delete -f ReplicaSet.yaml 
replicaset.apps "rs" deleted

[root@k8scloude1 daemonset]# kubectl get rs
No resources found in daemonset namespace.

[root@k8scloude1 daemonset]# kubectl get pod -o wide
No resources found in daemonset namespace.