概述

官网地址: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需要的字段

示例:

[root@node01 ~]# kubectl explain rs
KIND: ReplicaSet
VERSION: apps/v1 DESCRIPTION:
ReplicaSet ensures that a specified number of pod replicas are running at
any given time. # fileds字段中的内容已进行截取
FIELDS:
apiVersion <string> kind <string> metadata <Object> spec <Object> status <Object>

通过上述可以发现定义ReplicaSet的资源文件和定义Pod一样,也需要apiVersion、kind、metadata、spec等字段。

但是spec字段中有三个字段,需要注意,分别是replicas、selector、template。如下:

[root@node01 ~]# kubectl explain rs.spec
KIND: ReplicaSet
VERSION: apps/v1 RESOURCE: spec <Object> DESCRIPTION:
Spec defines the specification of the desired behavior of the ReplicaSet.
More info:
https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status ReplicaSetSpec is the specification of a ReplicaSet. FIELDS:
minReadySeconds <integer>
# minReadySeconds 规定了一个时间阈值,只有当 Pod 保持就绪状态的时间达到或者超过这个阈值,并且在此期间 Pod 内的任何容器都没有崩溃,这个 Pod 才会被视为可用。 replicas <integer>
# 定义Pod的副本数量 selector <map[string]string>
# 标签选择器,这里指定Pod定义的标签 template <Object>
# 定义Pod的模板

创建ReplicaSet

这里我们创建三个Pod副本

示例:

# 定义资源文件
[root@node01 ~/rs]# cat rs-nginx.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: rs-nginx-1
namespace: default
labels:
app: rs-nginx
spec:
# 定义Pod的副本数量
replicas: 3
# 标签选择器,这里和Pod的Label保持一致
selector:
# 匹配Pod的Label
matchLabels:
app: nginx
# 定义Pod的模板,只需要定义metadata和spec两个字段即可
template:
metadata:
name: pod-nginx
labels:
app: nginx
spec:
restartPolicy: Always
containers:
- name: nginx
image: nginx:latest # 创建ReplicaSet
[root@node01 ~/rs]# kubectl apply -f rs-nginx.yaml

查看对应的ReplicaSet和Pod

查看ReplicaSet

[root@node01 ~/rs]# kubectl get rs
NAME DESIRED CURRENT READY AGE
rs-nginx-1 3 3 3 93s

查看Pod

[root@node01 ~/rs]# kubectl get po | grep rs-nginx
rs-nginx-1-6rb9p 1/1 Running 0 2m
rs-nginx-1-ssdhv 1/1 Running 0 2m
rs-nginx-1-vzn2x 1/1 Running 0 2m

验证ReplicaSet的副本管理

ReplicaSet 的核心功能是保证在任何时候都有指定数量的 Pod 副本在运行。如果有 Pod 意外终止,ReplicaSet 会自动创建新的 Pod 来替代它;如果 Pod 数量过多,它会删除多余的 Pod。

当我们删除创建好的Pod时,Replicaset会发生什么呢?

# 删除上面创建的所有Pod
[root@node01 ~/rs]# kubectl delete po rs-nginx-1-6rb9p rs-nginx-1-ssdhv rs-nginx-1-vzn2x
pod "rs-nginx-1-6rb9p" deleted
pod "rs-nginx-1-ssdhv" deleted
pod "rs-nginx-1-vzn2x" deleted # 查看rs,发现其副本数量还是3个
[root@node01 ~/rs]# kubectl get rs
NAME DESIRED CURRENT READY AGE
rs-nginx-1 3 3 3 5m17s # 查看Pod,发现对应的Pod还是3个,通过AGE字段发现是新创建的
[root@node01 ~/rs]# kubectl get po | grep rs-nginx
NAME READY STATUS RESTARTS AGE
rs-nginx-1-6h7fv 1/1 Running 0 22s
rs-nginx-1-fhkm9 1/1 Running 0 22s
rs-nginx-1-l5njb 1/1 Running 0 22s

验证Replicaset的扩缩容

验证扩容

我们将rs的副本数量调整成5,看看会发生什么?

[root@node01 ~/rs]# cat rs-nginx.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: rs-nginx-1
namespace: default
labels:
app: rs-nginx
spec:
# 将副本数量修改成5
replicas: 5
selector:
matchLabels:
app: nginx
template:
metadata:
name: pod-nginx
labels:
app: nginx
spec:
restartPolicy: Always
containers:
- name: nginx
image: nginx:latest # 重新应用它
[root@node01 ~/rs]# kubectl apply -f rs-nginx.yaml
replicaset.apps/rs-nginx-1 configured

查看一下Pod的变化:

[root@node01 ~/rs]# kubectl get po | grep rs-nginx
NAME READY STATUS RESTARTS AGE
rs-nginx-1-6h7fv 1/1 Running 0 4m17s
rs-nginx-1-fhkm9 1/1 Running 0 4m26s
rs-nginx-1-l5njb 1/1 Running 0 4m26s
rs-nginx-1-t75z7 1/1 Running 0 8s
rs-nginx-1-tdvbr 1/1 Running 0 8s

通过上述发现Pod副本数量由3个变成了5个,查看AGE字段,发现有两个Pod是新建的状态。

验证缩容

同理,我们将副本数量调整成1,看看会发生什么?

[root@node01 ~/rs]# cat rs-nginx.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: rs-nginx-1
namespace: default
labels:
app: rs-nginx
spec:
# 将Pod数量调整成1
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
name: pod-nginx
labels:
app: nginx
spec:
restartPolicy: Always
containers:
- name: nginx
image: nginx:latest # 重新应用它
[root@node01 ~/rs]# kubectl apply -f rs-nginx.yaml
replicaset.apps/rs-nginx-1 configured

查看一下:

# 查看rs
[root@node01 ~/rs]# kubectl get rs
NAME DESIRED CURRENT READY AGE
rs-nginx-1 1 1 1 11m
# 查看Pod
[root@node01 ~/rs]# kubectl get po | grep rs-nginx
rs-nginx-1-fhkm9 1/1 Running 0 6m33s

通过上述发现,Pod的数量由5个缩减成1个

Replicaset的标签选择器

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

等式选择器

等式选择器通过 =、==(两者含义相同)或者 != 来筛选标签。其通过spec.selector.matchLabels来实现。

示例:

apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: rs-nginx-1
namespace: default
labels:
app: rs-nginx
spec:
replicas: 1
selector:
# 等式选择器
matchLabels:
app: nginx
template:
metadata:
name: pod-nginx
labels:
app: nginx
spec:
restartPolicy: Always
containers:
- name: nginx
image: nginx:latest

集合选择器

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

  • in:用于选取标签值在指定集合内的 Pod。
  • notin:用于选取标签值不在指定集合内的 Pod。
  • exists:用于选取具有指定标签的 Pod,不考虑标签的值。
  • DoesNotExist:用于选取不具有指定标签的 Pod,不考虑标签的值。

其通过spec.selector.matchExpressions来实现

示例:

apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: nginx-replicaset-set
spec:
replicas: 3
selector:
# 集合选择器
matchExpressions:
# key:指定Label的key,operator:表示操作符,value:表示Label的value
- {key: app, operator: In, values: [nginx]}
- {key: env, operator: NotIn, values: [development, testing]}
template:
metadata:
labels:
app: nginx
env: production
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80

管理Replicaset

查看Replicaset

语法:

kubectl get rs <rs-name> -n <namespace-name>

示例:

[root@node01 ~/rs]# kubectl get rs
NAME DESIRED CURRENT READY AGE
rs-nginx-1 1 1 1 25m

修改Replicaset

由两种方式,一种是通过kubectl edit rc <rc-name>来进行修改,会打开一个类似vim的界面,修改其对应的值即可,最后wq保存即可应用你的配置.

另一种方式则是修改对应的资源文件,最后使用kubectl apply -f <file>即可。

删除Replicaset

语法:

kubectl delete rc <rc-name> -n <namespace-name>

K8s新手系列之ReplicaSet资源的更多相关文章

  1. 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新

    上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...

  2. k8s入门系列之guestbook快速部署

    k8s集群以及一些扩展插件已经安装完毕,本篇文章介绍一下如何在k8s集群上快速部署guestbook应用. •实验环境为集群:master(1)+node(4),详细内容参考<k8s入门系列之集 ...

  3. k8s入门系列之扩展组件(一)DNS安装篇

    DNS (domain name system),提供域名解析服务,解决了难于记忆的IP地址问题,以更人性可读可记忆可标识的方式映射对应IP地址. Cluster DNS扩展插件用于支持k8s集群系统 ...

  4. k8s入门系列之集群安装篇

    关于kubernetes组件的详解介绍,请阅读上一篇文章<k8s入门系列之介绍篇> Kubernetes集群安装部署 •Kubernetes集群组件: - etcd 一个高可用的K/V键值 ...

  5. Github干货系列:C++资源集合-

    Awesome CPP,这又是一个 Awesome XXX 系列的资源整理,由 fffaraz 发起和维护.内容包括:标准库.Web应用框架.人工智能.数据库.图片处理.机器学习.日志.代码分析等. ...

  6. FrameBuffer系列 之 一点资源

    Iamonlyme的FrameBuffer编程实例http://download.csdn.net/detail/iamonlyme/6512955 light588的通过framebuffer直接写 ...

  7. Android新手系列教程(申明:来源于网络)

    Android新手系列教程(申明:来源于网络) 地址:http://blog.csdn.net/column/details/androidcoder666.html

  8. k8s 入门系列之集群安装篇

    关于kubernetes组件的详解介绍,请阅读上一篇文章<k8s入门系列之介绍篇> Kubernetes集群安装部署 •Kubernetes集群组件: - etcd 一个高可用的K/V键值 ...

  9. SignalR新手系列教程详解总结(转)

    SignalR新手系列教程详解总结 GlobalHost.ConnectionManager.GetHubContext<TodoListHub>() .Clients.Clients(l ...

  10. 容器编排系统K8s之ConfigMap、Secret资源

    前文我们了解了k8s上的pv/pvc/sc资源的使用和相关说明,回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/14188621.html:今天我们主要来聊一下 ...

随机推荐

  1. linux监控系统行为

    1.验证电脑是否存在,一般都有 which script /usr/bin/script 2.配置profile文件,在末尾添加如下内容: vim /etc/profile ============= ...

  2. stay:将代码翻译为Gif动图,妈妈再也不用担心我调试找不到bug了

    本文首发于微信公众号:呼哧好大枫.原作者与本文作者是同一人. 平常在做算法题或者是 debug 的时候很需要一款能够实时地将代码执行逻辑和数据以图形化的形式渲染出来的工具.之前尝试了几款(visual ...

  3. 饥荒联机版 mod

    Extra Equip Slots Extra Equip Slots 额外装备槽:护甲.背包.护符各用各的插槽 Wormhole Marks [DST] Wormhole Marks DST] 相通 ...

  4. 光猫路由器设置-改桥接、开启UPNP和DMZ的教程

    疑难解答加微信机器人,给它发:进群,会拉你进入八米交流群 机器人微信号:bamibot 简洁版教程访问:https://bbs.8miyun.cn 以电信光猫举例,其他网络百度都有对应教程. 电信光猫 ...

  5. docker - [02] 安装部署

    一.环境准备 1.需要会一点点Linux基础 2.CentOS 7+ 3.XShell连接服务器进行远程操作 Centos7.x 虚拟机环境 序号 主机名 IP 操作系统 1 ctos79-01 19 ...

  6. Scala重写构造函数

    package com.wyh.scala.classData object Demo4Class { def main(args: Array[String]): Unit = { val stu ...

  7. 大数据之路Week08_day03 (Hive的动态分区和分桶)

    一.动态分区 先来说说我对动态分区的理解与一些感受吧. 由于我们通过hive去查询数据的时候,实际还是查询HDFS上的数据,一旦一个目录下有很多文件呢?而我们去查找的数据也没有那么多,全盘扫描就会浪费 ...

  8. 关于我这周的kotlin的学习:

    今天学习了kotlin方法的参数和一些lambda的一些知识,其中也是和我们上次日报中讲的方法一样,有三种分类,默认参数,具名参数,可变数量的参数.和以前一样,我们举个例子来理解这个知识点:先是默认方 ...

  9. PHP的回调函数

    所谓的回调函数,就是指调用函数时并不是向函数中传递一个标准的变量作为参数,而是将另一个函数作为参数传递到调用的函数中,这个作为参数的函数就是回调函数.通俗的来说,回调函数也是一个我们定义的函数,但是不 ...

  10. HIVE带中括号的列名取数

    某次取数,某表中有奇怪的字段名:pointchange_ygz_[yyyy],带了个中插号,用简单查询出错 select pointchange_ygz_[yyyy] as p from t 出错信息 ...