二十三、Kubernetes中Pod控制器分类、ReplicaSet(RS)控制器详解

news2024/11/25 4:40:06

1、概述

        Pod是kubernetes的最小管理单元,在kubernetes中,按照pod的创建方式可以将其分为两类:

  • 自主式pod:kubernetes直接创建出来的Pod,这种pod删除后就没有了,也不会重建

  • 控制器创建的pod:kubernetes通过控制器创建的pod,这种pod删除了之后还会自动重建

什么是Pod控制器

Pod控制器是管理pod的中间层,使用Pod控制器之后,只需要告诉Pod控制器,想要多少个什么样的Pod就可以了,它会创建出满足条件的Pod并确保每一个Pod资源处于用户期望的目标状态。如果Pod资源在运行中出现故障,它会基于指定策略重新编排Pod。

在kubernetes中,有很多类型的pod控制器,每种都有自己的适合的场景,常见的有下面这些:

  • ReplicationController:比较原始的pod控制器,已经被废弃,由ReplicaSet替代

  • ReplicaSet:保证副本数量一直维持在期望值,并支持pod数量扩缩容,镜像版本升级

  • Deployment:通过控制ReplicaSet来控制Pod,并支持滚动升级、回退版本

  • Horizontal Pod Autoscaler:可以根据集群负载自动水平调整Pod的数量,实现削峰填谷

  • DaemonSet:在集群中的指定Node上运行且仅运行一个副本,一般用于守护进程类的任务

  • Job:它创建出来的pod只要完成任务就立即退出,不需要重启或重建,用于执行一次性任务

  • Cronjob:它创建的Pod负责周期性任务控制,不需要持续后台运行

  • StatefulSet:管理有状态应用

2、ReplicaSet(RS)控制器详解

        ReplicaSet的主要作用是保证一定数量的pod正常运行,它会持续监听这些Pod的运行状态,一旦Pod发生故障,就会重启或重建。同时它还支持对pod数量的扩缩容和镜像版本的升降级。

 ReplicaSet的资源清单文件:

apiVersion: apps/v1 # 版本号
kind: ReplicaSet # 类型       
metadata: # 元数据
  name: # rs名称 
  namespace: # 所属命名空间 
  labels: #标签
    controller: rs
spec: # 详情描述
  replicas: 3 # 副本数量
  selector: # 选择器,通过它指定该控制器管理哪些pod
    matchLabels:      # Labels匹配规则
      app: nginx-pod
    matchExpressions: # Expressions匹配规则
      - {key: app, operator: In, values: [nginx-pod]}
  template: # 模板,当副本数量不足时,会根据下面的模板创建pod副本
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
      - name: nginx
        image: nginx:1.17.1
        ports:
        - containerPort: 80

在这里面,需要新了解的配置项就是spec下面几个选项:

  • replicas:指定副本数量,其实就是当前rs创建出来的pod的数量,默认为1

  • selector:选择器,它的作用是建立pod控制器和pod之间的关联关系,采用的Label Selector机制

    在pod模板上定义label,在控制器上定义选择器,就可以表明当前控制器能管理哪些pod了

  • template:模板,就是当前控制器创建pod所使用的模板板,里面其实就是前一章学过的pod的定义

3、ReplicaSet(RS)控制器实例

3.1、创建ReplicaSet类型yaml

创建pc-replicaset.yaml文件,内容如下:

apiVersion: apps/v1
kind: ReplicaSet   
metadata:
  name: pc-replicaset
  namespace: dev
spec:
  replicas: 3
  selector: 
    matchLabels:
      app: nginx-pod
  template:
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
      - name: nginx
        image: nginx:1.22

3.2、实例操作

# 创建rs
[root@k8s-master ~]# kubectl apply -f pc-replicaset.yaml
replicaset.apps/pc-replicaset created

# 查看rs
# DESIRED:期望副本数量  
# CURRENT:当前副本数量  
# READY:已经准备好提供服务的副本数量
[root@k8s-master ~]# kubectl get rs pc-replicaset -n dev -o wide
NAME            DESIRED   CURRENT   READY   AGE   CONTAINERS   IMAGES       SELECTOR
pc-replicaset   3         3         3       37s   nginx        nginx:1.22   app=nginx-pod


# 查看当前控制器创建出来的pod
# 这里发现控制器创建出来的pod的名称是在控制器名称后面拼接了-xxxxx随机码
[root@k8s-master ~]# kubectl get pod -n dev
NAME                  READY   STATUS    RESTARTS   AGE
pc-replicaset-2gf46   1/1     Running   0          45s
pc-replicaset-cv5l9   1/1     Running   0          45s
pc-replicaset-vm8mz   1/1     Running   0          45s

3.3、扩缩容

# 编辑rs的副本数量,修改spec:replicas: 6即可
[root@k8s-master ~]# kubectl edit rs pc-replicaset -n dev
replicaset.apps/pc-replicaset edited

# 查看pod 副本数量已变为6个
[root@k8s-master ~]# kubectl get pods -n dev
NAME                  READY   STATUS    RESTARTS   AGE
pc-replicaset-2gf46   1/1     Running   0          2m28s
pc-replicaset-4dn8b   1/1     Running   0          8s
pc-replicaset-5br29   1/1     Running   0          8s
pc-replicaset-cv5l9   1/1     Running   0          2m28s
pc-replicaset-gvzjv   1/1     Running   0          8s
pc-replicaset-vm8mz   1/1     Running   0          2m28s


# 当然也可以直接使用命令实现
# 使用scale命令实现扩缩容, 后面--replicas=n直接指定目标数量即可
[root@k8s-master ~]# kubectl scale rs pc-replicaset --replicas=2 -n dev
replicaset.apps/pc-replicaset scaled

# 命令运行完后,稍等再次查看pod ,副本数量已回到2个
[root@k8s-master ~]# kubectl get pods -n dev
NAME                  READY   STATUS    RESTARTS   AGE
pc-replicaset-2gf46   1/1     Running   0          2m47s
pc-replicaset-cv5l9   1/1     Running   0          2m47s

3.4、镜像升级

# 查看当前rs中nginx版本为1.22
[root@k8s-master ~]# kubectl get rs -n dev -owide
NAME            DESIRED   CURRENT   READY   AGE     CONTAINERS   IMAGES       SELECTOR
pc-replicaset   2         2         2       5m10s   nginx        nginx:1.22   app=nginx-pod


# 编辑rs的容器镜像 - image: nginx:1.23
[root@k8s-master ~]# kubectl edit rs pc-replicaset -n dev
replicaset.apps/pc-replicaset edited


# 再次查看当前rs中nginx已变为版本为1.23
[root@k8s-master ~]# kubectl get rs -n dev -owide
NAME            DESIRED   CURRENT   READY   AGE     CONTAINERS   IMAGES       SELECTOR
pc-replicaset   2         2         2       5m57s   nginx        nginx:1.23   app=nginx-pod


# 同样的道理,也可以使用命令完成这个工作 改为1.22版本
# kubectl set image rs rs名称 容器=镜像版本 -n namespace
[root@k8s-master ~]# kubectl set image rs pc-replicaset  nginx=1.22 -n dev
replicaset.apps/pc-replicaset image updated

# 再次查看当前rs中nginx已变为版本为1.22
[root@k8s-master ~]# kubectl get rs -n dev -owide
NAME            DESIRED   CURRENT   READY   AGE     CONTAINERS   IMAGES   SELECTOR
pc-replicaset   2         2         2       7m57s   nginx        1.22     app=nginx-pod



3.5、删除ReplicaSet

# 使用kubectl delete命令会删除此RS以及它管理的Pod
# 在kubernetes删除RS前,会将RS的replicasclear调整为0,等待所有的Pod被删除后,在执行RS对象的删除
[root@k8s-master ~]# kubectl delete rs pc-replicaset -n dev
replicaset.apps "pc-replicaset" deleted
[root@k8s-master ~]# kubectl get pod -n dev -o wide
No resources found in dev namespace.

# 如果希望仅仅删除RS对象(保留Pod),可以使用kubectl delete命令时添加--cascade=false选项(不推荐)。
[root@k8s-master ~]# kubectl delete rs pc-replicaset -n dev --cascade=false
replicaset.apps "pc-replicaset" deleted
[root@k8s-master ~]# kubectl get pods -n dev
NAME                  READY   STATUS    RESTARTS   AGE
pc-replicaset-cl82j   1/1     Running   0          75s
pc-replicaset-dslhb   1/1     Running   0          75s

# 也可以使用yaml直接删除(推荐)
[root@k8s-master ~]# kubectl delete -f pc-replicaset.yaml
replicaset.apps "pc-replicaset" deleted

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/154360.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小米应用商店APP侵权投诉流程

目录一、官方指引二、侵权投诉流程1.侵权投诉通知和反通知流程2.受理渠道3.权利人发起侵权通知邮件一、官方指引 https://dev.mi.com/distribute/doc/details?pId1142 二、侵权投诉流程 1.侵权投诉通知和反通知流程 2.受理渠道 对外邮箱:developerxiaomi.com …

云呐|固定资产盘点APP

如果工人想做好他们的工作,他们想做好他们的工作。目前,行政事业单位对固定资产管理进行一物一卡一码管理,根据条形码粘贴和扫码总结,是目前科学完善的总结方法,具有快速、高效、准确的特点。对于这种方法,…

5.6、TCP超时重传时间的选择

超时重传时间的选择是 TCP 最复杂的问题之一 1、超时重传时间RTO的选取 假设主机 A 给主机 B 发送 TCP 数据报文段 000,并记录下当前的时间 主机 B 收到后,给主机 A 发送相应的确认报文段 主机 A 收到确认报文段后,记录下当前的时间 那么…

为什么BI仪表板的共享功能对企业如此重要?

随着大数据的发展,企业逐渐将数据作为其决策的重要组成部分,共享商业智能 (BI) 仪表板显得越来越重要。例如,在员工之间共享BI仪表板,不仅可以做出更好的数据驱动决策,还可以更好地提高工作透明度和问责制,…

Golang时间处理容易踩坑,小心损失百万

简介 在各个语言之中都有时间类型的处理,因为这个地球是圆的(我仿佛在讲废话),有多个时区,每个时区的时间不一样,在程序中有必要存在一种方式,或者说一种类型存储时间,还可以通过一系…

手写RPC框架第8版-通过SpringBoot-Starter接入SpringBoot

源代码地址:https://github.com/lhj502819/IRpc/tree/v9 系列文章: 注册中心模块实现路由模块实现序列化模块实现过滤器模块实现自定义SPI机制增加框架的扩展性的设计与实现基于线程和队列提升框架并发处理能力框架容错性相关设计通过SpringBoot-Starte…

LayoutInflater学习(二)之创建布局View

这篇是在上篇的基础上继续学习LayoutInflater,上篇主要讲了LayoutInflater是怎么解析布局的,但是并没有去仔细地说明LayoutInflater创建View的过程,这篇就补上这部分。 LayoutInflater创建xml布局View是分开创建的: 1. 先创建xml布局最外层的View,也就是布局的根View 2. 递归…

package.json和package-lock.json的区别

前言 今天正在写代码,同学突然问我,package.json和package-lock.json有什么区别,这两个文件有什么用?我愣住了… 模块化开发 经过这么多年的发展,现在的前端开发基本上都是模块化开发了。而node和npm则可以很方便的…

电网调频及一次调频、二次调频

电网调频的基本概念电力系统运行的主要任务之一是对电网频率进行控制—控制电网频率在50Hz附近的一个允许范围内。电网频率偏离额定值50Hz的原因是能源侧(水电、火电、核电……)的供电功率与负荷侧的用电功率之间的平衡被破坏而引起的。负荷的用电功率是…

Sentinel热点参数限流

何为热点? 何为热点?热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 Top K数据,并对其访问进行限制。比如: 1)商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限制&am…

正确的清理内存方式,才能让你的空间更加充裕

我们的手机用了一段时间后,有没有感觉卡变了,运行速度也很慢?估计是手机内存不足造成的,今天就来教教大家如何快速清理空间。方法一:清除微信缓存文件 我们每天都用微信。 其实它最占内存,我们还需要定时打…

原子化带来化学反应,视频号万粉创作者增加3倍,点赞10w+的爆款内容增长186%

1月10日,以“在场”为主题的2023微信公开课PRO正式开讲。本年度微信公开课重点从视频号内容生态发展、微信生态内各类产品助力实体转型以及数字生活服务升级三个方面,展示微信生态各产品的新能力、新计划。在2022年的微信公开课Pro上,“视频号…

广告业务系统 之 数据中转站 —— “日志中心-实时服务监控”

文章目录广告业务系统 之 数据中转站 —— “日志中心-实时服务监控”日志中心实时服务监控 —— 前链路日志分析日志收敛手段 —— “手术开口”基于 metrics 的日志分析 —— Prometheus & Graphite监控服务是怎么监控自身 & 比常规服务更坚强高扩展、高性能的架构设…

[L1 - 5分合集]心理阴影面积

L1-060 心理阴影面积 分数 5 作者 陈越 单位 浙江大学 题目: 这是一幅心理阴影面积图。我们都以为自己可以匀速前进(图中蓝色直线),而拖延症晚期的我们往往执行的是最后时刻的疯狂赶工(图中的红色折线)。由…

外贸邮件营销的优势

邮件营销相对于其他营销方式,历史更悠久。邮件营销具有成本低廉、快速、精准的特点。那么邮件营销有哪些优势,才能获得如此的关注。接下来,米贸搜和大家分享一下邮件营销的优势。1.节约成本的考虑:当前,世界经济复苏乏力&#xff…

Kafka消息队列使用及原理

消息队列作用:异步、削峰、解耦 1、kafka简介 ​ Apache Kafka 是一个分布式的流平台,有三个关键的功能: 能够发布(写入)和订阅(读取)事件流持续可靠的存储事件流在事件发生时回顾性的处理事件…

IB生物笔记:Structure and function of organelles

国际学校生物老师解读IB生物,感兴趣的同学记得收藏哦~IB生物分为SL(standard level)和HL(higher level)SL有6个topic∶细胞生物,分子生物,遗传学,生态学,物种进化以及多样性和人体生理。HL除了上述6个topic外还要加上∶…

C++模板类

目录 前言 类模板 模板类继承 前言 随着c发展,有一部分代码就会出现这样的情况:实现的内容相同,但是参数不同。模板类就是为解决这类情况来的,是一种泛型编码。即与数据类型无关的通用程序设计技术。 模板类本身不占空间&…

C语言模块化

🌞欢迎来到C语言的世界 🌈博客主页:卿云阁 💌欢迎关注🎉点赞👍收藏⭐️留言📝 🌟本文由卿云阁原创! 🙏作者水平很有限,如果发现错误,…

MySQL的行锁总结

文章目录前言一、行锁的介绍二、行锁的使用三、使用行锁所带来的问题四、死锁和死锁检测前言 上篇文章已经学习了MySQL的全局锁和表锁,今天这篇文章我们对行锁进行以下学习 一、行锁的介绍 行锁就是针对数据表中行记录的锁,比如事务A更新了一行&#x…