找回密码
 立即注册
首页 业界区 科技 K8s新手系列之ReplicaSet资源

K8s新手系列之ReplicaSet资源

恙髡 昨天 10:20
概述

官网地址:https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/replicaset/
ReplicaSet简称rs,其主要作用和ReplicationController一样,保证一定数量的pod正常运行,它会持续监听这些Pod的运行状态,一旦Pod发生故障,就会重启或重建。同时它还支持对pod数量的扩缩容和镜像版本的升降级。
相较于ReplicationController而言,ReplicaSet更加轻量级,且功能更强大,支持正则匹配Pod。
想要学习ReplicationController可以查看这篇文章:K8s新手系列之ReplicationController资源
ReplicaSet的作用


  • 副本管理:ReplicaSet 的核心功能是保证在任何时候都有指定数量的 Pod 副本在运行。如果有 Pod 意外终止,ReplicaSet 会自动创建新的 Pod 来替代它;如果 Pod 数量过多,它会删除多余的 Pod。
  • 集群扩容和缩容:用户可以通过修改 ReplicaSet 中的副本数量来轻松地对应用进行扩容或缩容。
  • 灵活的标签选择器

    • 集合式选择器:与 ReplicationController 仅支持等式选择器不同,ReplicaSet 支持更灵活的集合式选择器,如 in、notin、exists 等。这使得 ReplicaSet 能够更精确地选择要管理的 Pod,提高了标签选择的灵活性和表达能力。
    • 动态匹配 Pod:通过标签选择器,ReplicaSet 可以动态地匹配符合条件的 Pod。即使在 ReplicaSet 创建之后,只要有新的 Pod 被创建且其标签符合 ReplicaSet 的选择器,这些 Pod 就会被纳入 ReplicaSet 的管理范围。

ReplicaSet资源配置文件详解

可以通过kubectl explain rs查看创建ReplicaSet需要的字段
示例:
  1. [root@node01 ~]# kubectl explain rs
  2. KIND:     ReplicaSet
  3. VERSION:  apps/v1
  4. DESCRIPTION:
  5.      ReplicaSet ensures that a specified number of pod replicas are running at
  6.      any given time.
  7. # fileds字段中的内容已进行截取
  8. FIELDS:
  9.    apiVersion   <string>
  10.      
  11.    kind <string>
  12.    metadata     <Object>
  13.    spec <Object>
  14.    status       <Object>
复制代码
通过上述可以发现定义ReplicaSet的资源文件和定义Pod一样,也需要apiVersion、kind、metadata、spec等字段。
但是spec字段中有三个字段,需要注意,分别是replicas、selector、template。如下:
  1. [root@node01 ~]# kubectl explain rs.spec
  2. KIND:     ReplicaSet
  3. VERSION:  apps/v1
  4. RESOURCE: spec <Object>
  5. DESCRIPTION:
  6.      Spec defines the specification of the desired behavior of the ReplicaSet.
  7.      More info:
  8.      https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status
  9.      ReplicaSetSpec is the specification of a ReplicaSet.
  10. FIELDS:
  11.    minReadySeconds      <integer>
  12.    # minReadySeconds 规定了一个时间阈值,只有当 Pod 保持就绪状态的时间达到或者超过这个阈值,并且在此期间 Pod 内的任何容器都没有崩溃,这个 Pod 才会被视为可用。
  13.    
  14.    replicas     <integer>
  15.    # 定义Pod的副本数量
  16.    
  17.    selector     <map[string]string>
  18.    # 标签选择器,这里指定Pod定义的标签
  19.    
  20.    template     <Object>
  21.    # 定义Pod的模板
复制代码
创建ReplicaSet

这里我们创建三个Pod副本
示例:
  1. # 定义资源文件
  2. [root@node01 ~/rs]# cat rs-nginx.yaml
  3. apiVersion: apps/v1
  4. kind: ReplicaSet
  5. metadata:
  6.   name: rs-nginx-1
  7.   namespace: default
  8.   labels:
  9.     app: rs-nginx
  10. spec:
  11.   # 定义Pod的副本数量
  12.   replicas: 3
  13.   # 标签选择器,这里和Pod的Label保持一致
  14.   selector:
  15.     # 匹配Pod的Label
  16.     matchLabels:
  17.       app: nginx
  18.   # 定义Pod的模板,只需要定义metadata和spec两个字段即可
  19.   template:
  20.     metadata:
  21.       name: pod-nginx
  22.       labels:
  23.         app: nginx
  24.     spec:
  25.       restartPolicy: Always
  26.       containers:
  27.       - name: nginx
  28.         image: nginx:latest
  29. # 创建ReplicaSet
  30. [root@node01 ~/rs]# kubectl apply -f rs-nginx.yaml
复制代码
查看对应的ReplicaSet和Pod

查看ReplicaSet
  1. [root@node01 ~/rs]# kubectl get rs
  2. NAME         DESIRED   CURRENT   READY   AGE
  3. rs-nginx-1   3         3         3       93s
复制代码
查看Pod
  1. [root@node01 ~/rs]# kubectl get po | grep rs-nginx
  2. rs-nginx-1-6rb9p       1/1     Running            0               2m
  3. rs-nginx-1-ssdhv       1/1     Running            0               2m
  4. rs-nginx-1-vzn2x       1/1     Running            0               2m
复制代码
验证ReplicaSet的副本管理

ReplicaSet 的核心功能是保证在任何时候都有指定数量的 Pod 副本在运行。如果有 Pod 意外终止,ReplicaSet 会自动创建新的 Pod 来替代它;如果 Pod 数量过多,它会删除多余的 Pod。
当我们删除创建好的Pod时,Replicaset会发生什么呢?
  1. # 删除上面创建的所有Pod
  2. [root@node01 ~/rs]# kubectl delete po rs-nginx-1-6rb9p rs-nginx-1-ssdhv rs-nginx-1-vzn2x
  3. pod "rs-nginx-1-6rb9p" deleted
  4. pod "rs-nginx-1-ssdhv" deleted
  5. pod "rs-nginx-1-vzn2x" deleted
  6. # 查看rs,发现其副本数量还是3个
  7. [root@node01 ~/rs]# kubectl get rs
  8. NAME         DESIRED   CURRENT   READY   AGE
  9. rs-nginx-1   3         3         3       5m17s
  10. # 查看Pod,发现对应的Pod还是3个,通过AGE字段发现是新创建的
  11. [root@node01 ~/rs]# kubectl get po | grep rs-nginx
  12. NAME                   READY   STATUS             RESTARTS          AGE
  13. rs-nginx-1-6h7fv       1/1     Running            0                 22s
  14. rs-nginx-1-fhkm9       1/1     Running            0                 22s
  15. rs-nginx-1-l5njb       1/1     Running            0                 22s
复制代码
验证Replicaset的扩缩容

验证扩容

我们将rs的副本数量调整成5,看看会发生什么?
  1. [root@node01 ~/rs]# cat rs-nginx.yaml
  2. apiVersion: apps/v1
  3. kind: ReplicaSet
  4. metadata:
  5.   name: rs-nginx-1
  6.   namespace: default
  7.   labels:
  8.     app: rs-nginx
  9. spec:
  10.   # 将副本数量修改成5
  11.   replicas: 5
  12.   selector:
  13.     matchLabels:
  14.       app: nginx
  15.   template:
  16.     metadata:
  17.       name: pod-nginx
  18.       labels:
  19.         app: nginx
  20.     spec:
  21.       restartPolicy: Always
  22.       containers:
  23.       - name: nginx
  24.         image: nginx:latest
  25. # 重新应用它
  26. [root@node01 ~/rs]# kubectl apply -f rs-nginx.yaml
  27. replicaset.apps/rs-nginx-1 configured
复制代码
查看一下Pod的变化:
  1. [root@node01 ~/rs]# kubectl get po | grep rs-nginx
  2. NAME                   READY   STATUS             RESTARTS          AGE
  3. rs-nginx-1-6h7fv       1/1     Running            0                4m17s
  4. rs-nginx-1-fhkm9       1/1     Running            0                4m26s
  5. rs-nginx-1-l5njb       1/1     Running            0                4m26s
  6. rs-nginx-1-t75z7       1/1     Running            0                8s
  7. rs-nginx-1-tdvbr       1/1     Running            0                8s
复制代码
通过上述发现Pod副本数量由3个变成了5个,查看AGE字段,发现有两个Pod是新建的状态。
验证缩容

同理,我们将副本数量调整成1,看看会发生什么?
  1. [root@node01 ~/rs]# cat rs-nginx.yaml
  2. apiVersion: apps/v1
  3. kind: ReplicaSet
  4. metadata:
  5.   name: rs-nginx-1
  6.   namespace: default
  7.   labels:
  8.     app: rs-nginx
  9. spec:
  10.   # 将Pod数量调整成1
  11.   replicas: 1
  12.   selector:
  13.     matchLabels:
  14.       app: nginx
  15.   template:
  16.     metadata:
  17.       name: pod-nginx
  18.       labels:
  19.         app: nginx
  20.     spec:
  21.       restartPolicy: Always
  22.       containers:
  23.       - name: nginx
  24.         image: nginx:latest
  25. # 重新应用它
  26. [root@node01 ~/rs]# kubectl apply -f rs-nginx.yaml
  27. replicaset.apps/rs-nginx-1 configured
复制代码
查看一下:
  1. # 查看rs
  2. [root@node01 ~/rs]# kubectl get rs
  3. NAME         DESIRED   CURRENT   READY   AGE
  4. rs-nginx-1   1         1         1       11m
  5. # 查看Pod
  6. [root@node01 ~/rs]# kubectl get po | grep rs-nginx
  7. rs-nginx-1-fhkm9       1/1     Running            0                 6m33s
复制代码
通过上述发现,Pod的数量由5个缩减成1个
Replicaset的标签选择器

Replicaset的标签选择器分为两类,一类是等式选择器,另一类是集合选择器
等式选择器

等式选择器通过 =、==(两者含义相同)或者 != 来筛选标签。其通过spec.selector.matchLabels来实现。
示例:
  1. apiVersion: apps/v1
  2. kind: ReplicaSet
  3. metadata:
  4.   name: rs-nginx-1
  5.   namespace: default
  6.   labels:
  7.     app: rs-nginx
  8. spec:
  9.   replicas: 1
  10.   selector:
  11.   # 等式选择器
  12.     matchLabels:
  13.       app: nginx
  14.   template:
  15.     metadata:
  16.       name: pod-nginx
  17.       labels:
  18.         app: nginx
  19.     spec:
  20.       restartPolicy: Always
  21.       containers:
  22.       - name: nginx
  23.         image: nginx:latest
复制代码
集合选择器

集合选择器借助 in、notin、exists、DoesNotExist 这些操作符来筛选标签。

  • in:用于选取标签值在指定集合内的 Pod。
  • notin:用于选取标签值不在指定集合内的 Pod。
  • exists:用于选取具有指定标签的 Pod,不考虑标签的值。
  • DoesNotExist:用于选取不具有指定标签的 Pod,不考虑标签的值。
其通过spec.selector.matchExpressions来实现
示例:
  1. apiVersion: apps/v1
  2. kind: ReplicaSet
  3. metadata:
  4.   name: nginx-replicaset-set
  5. spec:
  6.   replicas: 3
  7.   selector:
  8.    # 集合选择器
  9.     matchExpressions:
  10.         # key:指定Label的key,operator:表示操作符,value:表示Label的value
  11.       - {key: app, operator: In, values: [nginx]}
  12.       - {key: env, operator: NotIn, values: [development, testing]}
  13.   template:
  14.     metadata:
  15.       labels:
  16.         app: nginx
  17.         env: production
  18.     spec:
  19.       containers:
  20.       - name: nginx
  21.         image: nginx:1.14.2
  22.         ports:
  23.         - containerPort: 80
复制代码
管理Replicaset

查看Replicaset

语法:
  1. kubectl get rs <rs-name> -n <namespace-name>
复制代码
示例:
  1. [root@node01 ~/rs]# kubectl get rs
  2. NAME         DESIRED   CURRENT   READY   AGE
  3. rs-nginx-1   1         1         1       25m
复制代码
修改Replicaset

由两种方式,一种是通过kubectl edit rc 来进行修改,会打开一个类似vim的界面,修改其对应的值即可,最后wq保存即可应用你的配置.
另一种方式则是修改对应的资源文件,最后使用kubectl apply -f 即可。
删除Replicaset

语法:
  1. kubectl delete rc <rc-name> -n <namespace-name>
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册