3.1 控制器之ReplicaSet/ReplicationController
文章目录
- 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相关推荐
- Kubernetes控制器之ReplicaSet
ReplicaSet用来维护一组在任何时候都处于运行状态的Pod保持稳定的副本数.因此,它通常用来保证给定数量的完全相同的Pod的可用性.现在ReplicaSet基本取代了ReplicationCon ...
- Proteus模拟STM32F103R6微控制器之串口通信USART的方法
Proteus模拟STM32F103R6微控制器之串口通信USART的方法,实验环境如下: 模拟软件:Proteus 8.11 SP0 开发环境:Keil MDK 5.33 参考资料:ST公司官方参考 ...
- Kubernetes控制器之Deployment
Deployment为Pod和ReplicaSet提供了一个声明式定义(declarative)方法,用来替代以前的ReplicationController来方便的管理应用.只需要在Deployme ...
- K8S控制器之Deployment详解及配置。
目录: 一,引入Deployment 二,Deployment支持的功能 三,Deployment资源清单文件详解 四,滚动更新及回滚实验 五,弹性伸缩实验 一,引入Deployment 对于kube ...
- Linux SD卡驱动开发(四) —— SD 控制器之真正的硬件操作
前面对SD卡控制器有了一个基本的介绍.其实SD控制器层更过的意义是为core层提供一种操作SD卡硬件的一种方法,当然不同的控制器对硬件控制的方法不尽相同,但是他们最终都能像core层提交一个统一的封装 ...
- PID控制器改进笔记之六:改进PID控制器之参数设定
前面我们发布了一系列PID控制器相关的文章,包括经典PID控制器以及参数自适应的PID控制器.这一系列PID控制器虽说实现了主要功能,也在实际使用中取得了良好效果,但还有很多的细节部分可以改进以提 ...
- PID控制器改进笔记之五:改进PID控制器之串级设定
前面我们发布了一系列PID控制器相关的文章,包括经典PID控制器以及参数自适应的PID控制器.这一系列PID控制器虽说实现了主要功能,也在实际使用中取得了良好效果,但还有很多的细节部分可以改进以提高性 ...
- PID控制器改进笔记之四:改进PID控制器之设定值响应
前面我们发布了一系列PID控制器相关的文章,包括经典PID控制器以及参数自适应的PID控制器.这一系列PID控制器虽说实现了主要功能,也在实际使用中取得了良好效果,但还有很多的细节部分可以改进以提高性 ...
- PID控制器改进笔记之三:改进PID控制器之正反作用
前面我们发布了一系列PID控制器相关的文章,包括经典PID控制器以及参数自适应的PID控制器.这一系列PID控制器虽说实现了主要功能,也在实际使用中取得了良好效果,但还有很多的细节部分可以改进以提高性 ...
最新文章
- 笔试分享 | 带你解读校招人工智能笔试题
- linux手动安装rsync_Linux服务器之间文件如何实现实时同步传输
- 获取iframe中的contentWindow
- apereo cas mysql_Apereo CAS 5.0.X 默认提供的数据库认证的四种方式
- Win10系统如何查看电脑是否是UEFI启动模式
- 东北大学计算机技术考研大纲,东北大学考研大纲
- 布丁机器人APP响应超时_常见问题解答
- rj45接口引脚定义_RJ45接口针脚定义(各种接口针脚定义)
- 计算机房等电位接地规范,一个实例全面讲解机房如何做防雷接地?
- 用Python讲述:地理“经纬度”数据的4种转换方法!
- 有关南怀瑾、朱熹周易断卦法的个人观点
- String相关用法记录
- Linux 中复制问题,错误显示 cp:omitting directory
- CF1428F-Fruit Sequences
- CSS外边距合并和CSS清除浮动
- 【温故知新】—— React/Redux/React-router4基础知识独立团Demo
- 口令破解(web安全入门07)
- 左程云算法笔记总结-基础提升篇
- 2010河北职称计算机考试,2010年河北省职称计算机考试基础知识真题
- 山东大学RISC-V公共开放平台开发记录5