文章目录

  • ReplicaSet使用
    • 1、创建ReplicaSet
    • 2、删除一个pod
    • 3、修改pod标签
    • 4、标签选择器
    • 4、修改ReplicaSet标签选择器
    • 5、水平缩放pod
    • 6、删除ReplicaSet控制器

在新版本k8s中,ReplicaSet取代了ReplicationController,ReplicaSet除了满足ReplicationController,其强大之处还在于支持标签选择器。所以本文主要以ReplicaSet为主。
ReplicaSet主要用来监控k8s中的pod,使其数量与副本数保持一致,当pod数量少于副本数量时会根据定义的pod模板启动相应的pod数量,当pod数量多于副本数数量时,它将删除多于的pod。手动增加ReplicaSet选择的标签类型的pod会k8s中pod数量多于副本数,ReplicaSet将删除多于的pod。
ReplicaSet优点:

  • 当集群几点发生故障时,为故障的pod创建替代的副本;
  • 可以轻松实现pod的水平伸缩

ReplicaSet使用

1、创建ReplicaSet

replica_set_example.yaml配置如下:

apiVersion: extensions/v1beta1
kind: ReplicaSet            #控制器类型为ReplicaSet
metadata:name: nginx-relica         #ReplicaSet控制器名字为nginx-relica
spec:                       #ReplicaSet控制器的描述replicas: 3                #pod的副本数selector:               #ReplicaSet控制器的选择器matchLabels:              #ReplicaSet控制器定义标签app: nginx-label      #ReplicaSet控制器管理标签为app=nginx-label的podtemplate:                #pod的模板metadata:            #pod的元数据labels:                 #定义pod的标签app: nginx-label   #定义pod的标签为app=nginx-labelspec:                 #pod的描述containers:              #定义pod中容器- name: nginx-pod      #容器的名字为nginx-podimage: nginx        #容器的镜像为nginximagePullPolicy: IfNotPresent   #镜像策略,如果本地有nginx镜像,就用本地的镜像启动容器,如果本地没有默认从docker hub上获取latest版本nginx镜像ports:             #定义容器端口- containerPort: 80 #暴露容器中80端口command: ["/bin/sh", "-c", "echo hello world > /usr/share/nginx/html/hello.html; sleep 3600"] #容器启动后,执行command命令

用create创建ReplicaSet, kubectl create -f replica_set_example.yaml,执行如下

[root@k8s-master01 sc_work]# kubectl create -f replica_set_example.yaml
replicaset.extensions/nginx-relica created
[root@k8s-master01 sc_work]# kubectl get replicaset
NAME           DESIRED   CURRENT   READY   AGE
nginx-relica   3         3         3       12s
[root@k8s-master01 sc_work]# kubectl get pod
NAME                 READY   STATUS    RESTARTS   AGE
nginx-relica-8b26w   1/1     Running   0          20s
nginx-relica-grs84   1/1     Running   0          20s
nginx-relica-ts6n4   1/1     Running   0          20s

2、删除一个pod

ReplicaSet管理了3个副本的pod,删除其中一个pod后,ReplicaSet会根据副本数重新启动一个pod,保持集群中有3个副本,如命令所示

[root@k8s-master01 sc_work]# kubectl delete pod nginx-relica-grs84
pod "nginx-relica-grs84" deleted
[root@k8s-master01 sc_work]# kubectl get pod
NAME                 READY   STATUS    RESTARTS   AGE
nginx-relica-kpq7k   1/1     Running   0          33s
nginx-relica-rrsph   1/1     Running   0          2m13s
nginx-relica-ts6n4   1/1     Running   0          3m5s

3、修改pod标签

通过ReplicaSet创建pod后,如果修改了pod的标签,ReplicaSet检查管理的pod数量少于副本数,会重新启动pod维持副本数量的pod。为修改pod标签前如下

[root@k8s-master01 sc_work]# kubectl get pod --show-labels
NAME                 READY   STATUS    RESTARTS   AGE   LABELS
nginx-relica-kpq7k   1/1     Running   47         47h   app=nginx-label
nginx-relica-rrsph   1/1     Running   47         47h   app=nginx-label
nginx-relica-ts6n4   1/1     Running   47         47h   app=nginx-label

修改其中一个pod的标签app=nginx-label修改为app=nginx-debug

[root@k8s-master01 sc_work]# kubectl label pod nginx-relica-kpq7k app=nginx-debug --overwrite
pod/nginx-relica-kpq7k labeled

然后再查询pod数量

[root@k8s-master01 sc_work]# kubectl get pod --show-labels
NAME                 READY   STATUS    RESTARTS   AGE   LABELS
nginx-relica-hpk5f   1/1     Running   0          15s   app=nginx-label
nginx-relica-kpq7k   1/1     Running   47         47h   app=nginx-debug
nginx-relica-rrsph   1/1     Running   47         47h   app=nginx-label
nginx-relica-ts6n4   1/1     Running   47         47h   app=nginx-label

发现又重新启动了一个app=nginx-label的pod,始终维持在副本数量的pod。

4、标签选择器

前面示例已经用过了标签选择器,标签选择器主要是用来控制pod的

spec:                        #ReplicaSet控制器的描述replicas: 3                #pod的副本数selector:               #ReplicaSet控制器的选择器matchLabels:              #ReplicaSet控制器定义标签app: nginx-label      #ReplicaSet控制器管理标签为app=nginx-label的pod

selector选择器下的matchLabels用来匹配单个标签键值对形式的,相当于k8s老版本中ReplicationController控制器的作用。另外selector选择器下的matchExpressions拥有更强大的选择功能。例如

spec:replicas: 3selector:matchExpressions:- key: app  #matchExpressions为list类型operator: Invalues:- nginx-prod #values为List类型

该标签选择器会选择标签app在nginx-prod标签的pod进行管理。

matchExpressions选择模式强大,有如下几种选择模式:

  • In : key指定的标签必须与values中列举的标签其中一个匹配;
  • Notin : key指定的标签与values中列举的标签任何一个都不匹配;
  • Exists : key指定的标签名字只要与pod中标签名字一致,pod就会被管理,不管标签的value值是否一致,只要标签的名字一致就可以;
  • DoesNotExist : 与Exists 相反。

例如,只要创建的pod含有便签app,不管标签的value值如何,都会被ReplicaSet进行管理。

 spec:replicas: 3selector:matchExpressions:- key: appoperator: Exists

注意:上面示例中,只指定了matchExpressions中的一个标签表达式,因为matchExpressions是list类型,可以指定多个选择器表达式,如果指定多个表达式,多有选择器必须与Pod匹配才能选中并管理pod。另外,如果同时指定了matchExpressions和matchLabels两种选择模式,则两种选择模式必须都匹配,pod才会被选中并进行管理。

4、修改ReplicaSet标签选择器

replicaset管理pod后,如果修改了ReplicaSet标签选择器,会使ReplicaSet放弃正在管理的pod,转而去管理修改选择器后的指定的pod或者重新创建指定标签的pod。
比如用replica_set_example.yaml创建replicaset,并创建管理4个pod

apiVersion: extensions/v1beta1
kind: ReplicaSet
metadata:name: nginx-relica
spec:replicas: 4selector:matchLabels:app: nginx-prodtemplate:metadata:labels:app: nginx-prodspec:containers:- name: nginx-podimage: nginximagePullPolicy: IfNotPresentports:- containerPort: 80command: ["/bin/sh", "-c", "echo hello world > /usr/share/nginx/html/hello.html; sleep 3600"]
[root@k8s-master01 sc_work]# kubectl create -f replica_set_example.yaml
replicaset.extensions/nginx-relica created
[root@k8s-master01 sc_work]# kubectl get pod
NAME                 READY   STATUS    RESTARTS   AGE
nginx-relica-4wcvq   1/1     Running   0          2m1s
nginx-relica-5q59d   1/1     Running   0          2m1s
nginx-relica-x694n   1/1     Running   0          2m1s
nginx-relica-ztp6p   1/1     Running   0          2m1s

执行上述命令后,nginx-relica管理着4个标签为nginx-prod的pod,下面修改一下nginx-relica的选择器,使其管理4个标签为nginx-debug的pod

kubectl edit rs nginx-relica  #编辑nginx-relica
……省略
spec:replicas: 4selector:matchLabels:app: nginx-debug   #标签选择器从nginx-prod修改为nginx-debugtemplate:metadata:creationTimestamp: nulllabels:app: nginx-debug  #pod的模板标签从nginx-prod修改为nginx-debugspec:……省略

编辑完replicaset后,重新查看pod情况,发现replicaset重新管理了4个标签为app=nginx-debug的pod,但原来的app=nginx-prod的pod并没有自动删除,如果手动删除后,不会再自动重建,如果手动删除标签为app=nginx-debug的pod,replicaset会自动进行重新重建标签为app=nginx-debug的pod,使其数量达到副本数。

[root@k8s-master01 sc_work]# kubectl get pod --show-labels
NAME                 READY   STATUS    RESTARTS   AGE     LABELS
nginx-relica-4wcvq   1/1     Running   0          4m26s   app=nginx-prod
nginx-relica-5q59d   1/1     Running   0          4m26s   app=nginx-prod
nginx-relica-5wspn   1/1     Running   0          21s     app=nginx-debug
nginx-relica-795dg   1/1     Running   0          21s     app=nginx-debug
nginx-relica-cp2fx   1/1     Running   0          21s     app=nginx-debug
nginx-relica-nx8d6   1/1     Running   0          21s     app=nginx-debug
nginx-relica-x694n   1/1     Running   0          4m26s   app=nginx-prod
nginx-relica-ztp6p   1/1     Running   0          4m26s   app=nginx-prod

5、水平缩放pod

集群中,有时访问量增加,需要水平扩展pod数量,或者晚上访问量小,缩小pod数量,节省资源。
下面通过ReplicaSet创建3个pod,然后再水平扩展到4个pod

#通过replicaset创建管理pod
[root@k8s-master01 sc_work]# kubectl create -f replica_set_example.yaml
replicaset.extensions/nginx-relica created
#成功创建3个pod
[root@k8s-master01 sc_work]# kubectl get pod
NAME                 READY   STATUS    RESTARTS   AGE
nginx-relica-dnmhs   1/1     Running   0          5s
nginx-relica-g98nc   1/1     Running   0          5s
nginx-relica-w88mm   1/1     Running   0          5s
#ReplicaSet的副本数扩展到4个
[root@k8s-master01 sc_work]# kubectl scale replicaset nginx-relica --replicas=4
replicaset.extensions/nginx-relica scaled
#再次查询pod数量为4
[root@k8s-master01 sc_work]# kubectl get pod
NAME                 READY   STATUS    RESTARTS   AGE
nginx-relica-88r59   1/1     Running   0          5s
nginx-relica-dnmhs   1/1     Running   0          63s
nginx-relica-g98nc   1/1     Running   0          63s
nginx-relica-w88mm   1/1     Running   0          63s

6、删除ReplicaSet控制器

  • 直接删除ReplicaSet后也会连带删除ReplicaSet控制器管理的Pod
kubectl delete replicaset nginx-relica #执行命令后,nginx-relica管理的pod也会被删除
  • 删除ReplicaSet但保留pod运行
kubectl delete rs nginx-relica --cascade=false #删除nginx-relica后,nginx-relica管理的pod继续运行

:ReplicaSet可以简写为rs,比如

kubectl get rs

参考《kubernetes in action》

3.1 控制器之ReplicaSet/ReplicationController相关推荐

  1. Kubernetes控制器之ReplicaSet

    ReplicaSet用来维护一组在任何时候都处于运行状态的Pod保持稳定的副本数.因此,它通常用来保证给定数量的完全相同的Pod的可用性.现在ReplicaSet基本取代了ReplicationCon ...

  2. Proteus模拟STM32F103R6微控制器之串口通信USART的方法

    Proteus模拟STM32F103R6微控制器之串口通信USART的方法,实验环境如下: 模拟软件:Proteus 8.11 SP0 开发环境:Keil MDK 5.33 参考资料:ST公司官方参考 ...

  3. Kubernetes控制器之Deployment

    Deployment为Pod和ReplicaSet提供了一个声明式定义(declarative)方法,用来替代以前的ReplicationController来方便的管理应用.只需要在Deployme ...

  4. K8S控制器之Deployment详解及配置。

    目录: 一,引入Deployment 二,Deployment支持的功能 三,Deployment资源清单文件详解 四,滚动更新及回滚实验 五,弹性伸缩实验 一,引入Deployment 对于kube ...

  5. Linux SD卡驱动开发(四) —— SD 控制器之真正的硬件操作

    前面对SD卡控制器有了一个基本的介绍.其实SD控制器层更过的意义是为core层提供一种操作SD卡硬件的一种方法,当然不同的控制器对硬件控制的方法不尽相同,但是他们最终都能像core层提交一个统一的封装 ...

  6. PID控制器改进笔记之六:改进PID控制器之参数设定

      前面我们发布了一系列PID控制器相关的文章,包括经典PID控制器以及参数自适应的PID控制器.这一系列PID控制器虽说实现了主要功能,也在实际使用中取得了良好效果,但还有很多的细节部分可以改进以提 ...

  7. PID控制器改进笔记之五:改进PID控制器之串级设定

    前面我们发布了一系列PID控制器相关的文章,包括经典PID控制器以及参数自适应的PID控制器.这一系列PID控制器虽说实现了主要功能,也在实际使用中取得了良好效果,但还有很多的细节部分可以改进以提高性 ...

  8. PID控制器改进笔记之四:改进PID控制器之设定值响应

    前面我们发布了一系列PID控制器相关的文章,包括经典PID控制器以及参数自适应的PID控制器.这一系列PID控制器虽说实现了主要功能,也在实际使用中取得了良好效果,但还有很多的细节部分可以改进以提高性 ...

  9. PID控制器改进笔记之三:改进PID控制器之正反作用

    前面我们发布了一系列PID控制器相关的文章,包括经典PID控制器以及参数自适应的PID控制器.这一系列PID控制器虽说实现了主要功能,也在实际使用中取得了良好效果,但还有很多的细节部分可以改进以提高性 ...

最新文章

  1. 笔试分享 | 带你解读校招人工智能笔试题
  2. linux手动安装rsync_Linux服务器之间文件如何实现实时同步传输
  3. 获取iframe中的contentWindow
  4. apereo cas mysql_Apereo CAS 5.0.X 默认提供的数据库认证的四种方式
  5. Win10系统如何查看电脑是否是UEFI启动模式
  6. 东北大学计算机技术考研大纲,东北大学考研大纲
  7. 布丁机器人APP响应超时_常见问题解答
  8. rj45接口引脚定义_RJ45接口针脚定义(各种接口针脚定义)
  9. 计算机房等电位接地规范,一个实例全面讲解机房如何做防雷接地?
  10. 用Python讲述:地理“经纬度”数据的4种转换方法!
  11. 有关南怀瑾、朱熹周易断卦法的个人观点
  12. String相关用法记录
  13. Linux 中复制问题,错误显示 cp:omitting directory
  14. CF1428F-Fruit Sequences
  15. CSS外边距合并和CSS清除浮动
  16. 【温故知新】—— React/Redux/React-router4基础知识独立团Demo
  17. 口令破解(web安全入门07)
  18. 左程云算法笔记总结-基础提升篇
  19. 2010河北职称计算机考试,2010年河北省职称计算机考试基础知识真题
  20. 山东大学RISC-V公共开放平台开发记录5

热门文章

  1. 小说 · 凉生,我们可不可以不忧伤
  2. 深入理解编译注解(三)依赖关系 apt/annotationProcessor与Provided的区别
  3. [个人笔记]R语言:缺失值NA处理
  4. 2019年最新版嵌入式开发教程大纲免费分享
  5. Rsa 非对称加密算法使用问题分享--使用通过密钥对同一段数据加密得到结果每次不一样
  6. 开发必备的图片格式——.9图的原理和陷阱
  7. 安卓【.9图】制作方法教程及技巧
  8. 知情人士:比特大陆创始人吴忌寒离开核心纯属谣言
  9. 最新总结Spring知识及常见面试题
  10. 前端click事件及自定义事件