Kubernetes基础_03_ReplicaSet全解析

news2024/11/24 8:23:54

系列文章目录

文章目录

  • 系列文章目录
  • 前言
  • 一、创建ReplicaSet
    • 1.1 ReplicatSet的三个属性
    • 1.2 从ReplicaSet看Pod
    • 1.3 从Pod看ReplicaSet
    • 1.4 ReplicaSet属性分析
      • Replicas
      • Pod 选择算符
      • Pod 模板
  • 二、使用ReplicaSet
    • 2.1 删除 ReplicaSet操作
      • 2.1.1 删除 ReplicaSet 和它的 Pod
      • 2.1.2 只删除 replicaset
    • 2.2 ReplicaSet手动扩容缩容
    • 2.3 ReplicaSet自动扩容缩容
  • 三、ReplicaSet的局限以及代替方案
    • 3.1 ReplicaSet的局限
    • 3.2 ReplicaSet 的替代方案
      • 3.2.1 Deployment(推荐)
      • 3.2.2 裸 Pod
      • 3.2.3 Job
      • 3.2.4 DaemonSet
      • 3.2.5 ReplicationController
  • 总结


前言

第二篇学习了Pod,这里介绍一下管理Pod的Controller,Controller包括RS、Deployment、StatefulSet、DaemonSet、Job/CronJob。

这些管理最小单元Pod的资源称为Controller,所有的Controller都是由静态Pod ControllerManager来管理的。

官网:https://kubernetes.io/docs/concepts/architecture/controller/

一、创建ReplicaSet

1.1 ReplicatSet的三个属性

ReplicaSet 是通过一组字段来定义的,包括三个属性:

(1) 一个用来识别可获得的 Pod 的集合的选择算符、
(2) 一个用来标明应该维护的副本个数的数值、
(3) 一个用来指定应该创建新 Pod 以满足副本个数条件时要使用的 Pod 模板。

每个 ReplicaSet 都通过根据需要创建和删除 Pod 以使得副本个数达到期望值, 进而实现其存在价值。当 ReplicaSet 需要创建新的 Pod 时,会使用所提供的 Pod 模板。

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: frontend
  labels:
    app: guestbook
    tier: frontend
spec:
  # 按你的实际情况修改副本数
  replicas: 3
  selector:
    matchLabels:
      tier: frontend
  template:
    metadata:
      labels:
        tier: frontend
    spec:
      containers:
      - name: php-redis
        image: gcr.io/google_samples/gb-frontend:v3

在这里插入图片描述

实践一下,上面那个镜像实际不了,换一个一个镜像,比如nginx
修改为 image: nginx:1.16.0

在这里插入图片描述

1.2 从ReplicaSet看Pod

kubectl describe rs xxx(rs-name) 这条命令从rs层面看Pod
在这里插入图片描述

1.3 从Pod看ReplicaSet

kubectl get pod xxx(pod-name) -o yaml 这条命令从Pod层面看ReplicaSet

在这里插入图片描述

1.4 ReplicaSet属性分析

ReplicaSet 需要 apiVersion、kind 和 metadata 字段。 对于 ReplicaSet 而言,其 kind 始终是 ReplicaSet。然后,ReplicaSet 也需要 .spec 部分。.spec 部分分为 副本数、选择器(选择算符)、Pod模板三个部分。

Replicas

你可以通过设置 .spec.replicas 来指定要同时运行的 Pod 个数。 ReplicaSet 创建、删除 Pod 以与此值匹配。如果你没有指定 .spec.replicas,那么默认值为 1。

Pod 选择算符

.spec.selector 字段是一个标签选择算符,这些是用来标识要被获取的 Pod 的标签。在签名的 frontend.yaml 示例中,选择算符为:

matchLabels:
  tier: frontend

在 ReplicaSet 中,.spec.template.metadata.labels 的值必须与 spec.selector 值相匹配,否则该配置会被 API 拒绝。

说明:对于设置了相同的 .spec.selector,但 .spec.template.metadata.labels 和 .spec.template.spec 字段不同的两个 ReplicaSet 而言,每个 ReplicaSet 都会忽略被另一个 ReplicaSet 所创建的 Pod。

Pod 模板

.spec.template 是一个 Pod 模板, 要求设置标签。在 frontend.yaml 示例中,我们指定了标签 tier: frontend。

对于模板的重启策略 字段,.spec.template.spec.restartPolicy,唯一允许的取值是 Always,这也是默认值.

二、使用ReplicaSet

2.1 删除 ReplicaSet操作

kubectl 命令支持级联删除。
(1) 当设置 --cascade=foreground,可以使用 kubectl 在前台删除附属对象。
(2) 当设置 --cascade=orphan,会使附属对象成为孤立附属对象。
(3) 当不指定 --cascade 或者明确地指定它的值为 background 的时候, 默认的行为是在后台删除附属对象。

2.1.1 删除 ReplicaSet 和它的 Pod

上面使用 kubectl apply -f replicaset.yaml 创建了 replicaset 和 pod,如果现在要删除 ReplicaSet 和它的所有 Pod,使用 kubectl delete replicaset xxx(rs-name) 命令 或者 kubectl delete -f replicaset.yaml 命令。执行此命令后, 默认情况下,Kubernetes 垃圾收集器 自动删除所有依赖的 Pod。

唯一注意的是,要删除的是replicaset,而不是下面一个或三个Pod,如果是删除一个或三个Pod,因为 replica 属性被设置为 3 ,被删除的Pod仍然会被创建出来。

kubectl get all -o wide
kubectl delete rs frontend 
kubectl get all -o wide

也可使用命令

# 第一个机器
kubectl proxy --port=8080

# 第二个机器
curl -X DELETE  'localhost:8080/apis/apps/v1/namespaces/default/replicasets/frontend' \
  -d '{"kind":"DeleteOptions","apiVersion":"v1","propagationPolicy":"Foreground"}' \
  -H "Content-Type: application/json"

在这里插入图片描述

2.1.2 只删除 replicaset

你可以只删除 ReplicaSet 而不影响它的各个 Pod,方法是使用 kubectl delete 命令并设置 --cascade=orphan 选项。

kubectl delete rs frontend --cascade=orphan

也可使用命令

# 第一个机器
kubectl proxy --port=8080

# 第二个机器
curl -X DELETE localhost:8080/apis/apps/v1/namespaces/default/replicasets/frontend \
  -d '{"kind":"DeleteOptions","apiVersion":"v1","propagationPolicy":"Orphan"}' \
  -H "Content-Type: application/json"

在这里插入图片描述
在这里插入图片描述

2.2 ReplicaSet手动扩容缩容

通过更新 .spec.replicas 字段,ReplicaSet 可以被轻松地进行扩缩。ReplicaSet 控制器能确保匹配标签选择器的数量的 Pod 是可用的和可操作的。

直接修改 replicaset.yaml 文件来更新:

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: frontend
  labels:
    app: guestbook
    tier: frontend
spec:
  # 按你的实际情况修改副本数
  replicas: 3
  selector:
    matchLabels:
      tier: frontend
  template:
    metadata:
      labels:
        tier: frontend
    spec:
      containers:
      - name: php-redis
        image: nginx:1.16.0

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

通过 kubectl 命令来更新:

kubectl scale replicaset frontend --replicas 5
kubectl scale replicaset frontend --replicas 1

在这里插入图片描述

在这里插入图片描述

2.3 ReplicaSet自动扩容缩容

Horizontal Pod Autoscaler(HPA)的控制器,用于实现基于CPU使用率进行自动Pod扩容和缩容的功能。HPA控制器基于Master的kube-controller-manager服务启动参数–horizontal-pod-autoscaler-sync-period定义的时长(默认周期为30s),周期性地监测目标Pod的CPU使用率,并在满足条件时对ReplicationController或Deployment中的Pod副本数量进行调整,以符合用户定义的平均Pod CPU使用率。Pod CPU使用率来源于Heapster组件,所以需要预先安装好Heapster。

创建HPA时可以使用kubectl autoscale命令进行快速创建或者使用yaml配置文件进行创建。在创建HPA之前,需要已经存在一个Deployment/RC对象,并且该Deployment/RC中的Pod必须定义resources.requests.cpu的资源请求值,如果不设置该值,则Heapster将无法采集到该Pod的CPU使用情况,会导致HPA无法正常工作。

通过为一个RC设置HPA,然后使用一个客户端对其进行压力测试,对HPA的用法进行示例。

方式1:通过yaml文件来创建

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: frontend
  labels:
    app: guestbook
    tier: frontend
spec:
  # 按你的实际情况修改副本数
  replicas: 3
  selector:
    matchLabels:
      tier: frontend
  template:
    metadata:
      labels:
        tier: frontend
    spec:
      containers:
      - name: php-redis
        image: nginx:1.16.0
        resources:
          requests:
            cpu: 200m
        ports:
        - containerPort: 80
apiVersion: v1
kind: Service
metadata:
  name: frontend
spec:
  ports:
  - port: 80
  selector:
    tier: frontend
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: frontend-scaler
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: ReplicaSet
    name: frontend
  minReplicas: 1
  maxReplicas: 10
  targetCPUUtilizationPercentage: 50

自动扩容缩容包括三个属性:
max 最大副本数Pod
min 最小副本数Pod
targetCPUUtilizationPercentage

三个apply之后如下:
在这里插入图片描述

还可以写一个脚本,作为压力测试,但是nginx的太棒了,这一点点压力根本无法引起 hpa 扩容

while true; do curl http://10.96.169.178:80/; done

在这里插入图片描述

方式2:通过命令来创建

kubectl autoscale rs frontend --max=10 --min=1 --cpu-percent=50

三、ReplicaSet的局限以及代替方案

3.1 ReplicaSet的局限

ReplicaSet 确保任何时间都有指定数量的 Pod 副本在运行。 然而,Deployment 是一个更高级的概念,它管理 ReplicaSet,并向 Pod 提供声明式的更新以及许多其他有用的功能。 因此,我们建议使用 Deployment 而不是直接使用 ReplicaSet, 除非你需要自定义更新业务流程或根本不需要更新。

这实际上意味着,你可能永远不需要操作 ReplicaSet 对象:而是使用 Deployment,并在 spec 部分定义你的应用。

3.2 ReplicaSet 的替代方案

3.2.1 Deployment(推荐)

Deployment 是一个可以拥有 ReplicaSet 并使用声明式方式在服务器端完成对 Pod 滚动更新的对象。 尽管 ReplicaSet 可以独立使用,目前它们的主要用途是提供给 Deployment 作为编排 Pod 创建、删除和更新的一种机制。当使用 Deployment 时,你不必关心如何管理它所创建的 ReplicaSet,Deployment 拥有并管理其 ReplicaSet。 因此,建议你在需要 ReplicaSet 时使用 Deployment。

3.2.2 裸 Pod

与用户直接创建 Pod 的情况不同,ReplicaSet 会替换那些由于某些原因被删除或被终止的 Pod,例如在节点故障或破坏性的节点维护(如内核升级)的情况下。 因为这个原因,我们建议你使用 ReplicaSet,即使应用程序只需要一个 Pod。 想像一下,ReplicaSet 类似于进程监视器,只不过它在多个节点上监视多个 Pod, 而不是在单个节点上监视单个进程。 ReplicaSet 将本地容器重启的任务委托给了节点上的某个代理(例如,Kubelet)去完成。

3.2.3 Job

使用Job 代替 ReplicaSet, 可以用于那些期望自行终止的 Pod。

3.2.4 DaemonSet

对于管理那些提供主机级别功能(如主机监控和主机日志)的容器, 就要用 DaemonSet 而不用 ReplicaSet。 这些 Pod 的寿命与主机寿命有关:这些 Pod 需要先于主机上的其他 Pod 运行, 并且在机器准备重新启动/关闭时安全地终止。

3.2.5 ReplicationController

ReplicaSet 是 ReplicationController 的后继者。二者目的相同且行为类似,只是 ReplicationController 不支持 标签用户指南 中讨论的基于集合的选择算符需求。 因此,相比于 ReplicationController,应优先考虑 ReplicaSet。


总结

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

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

相关文章

随便给你一个页面 你该如何去给他布局呢 各位思考一下 ?

随便给你一个页面 你该如何去给他布局呢 各位思考一下 ? 学习知识靠的是直接主动去学 不是 被动接受我给出的答案: 化繁为简 ,化简为繁 在学习任何知识体系中都是如此 先学习这类知识的知识点 然后用一个案例或者是多个案例实操起来 在写页面时大多数人…

对话张璐:硅谷正在追逐两大赛道创新,融资降温但技术商业化更快了

LG 发自 凹非寺量子位 | 公众号 QbitAI什么是硅谷的New Sexy?张璐这次脱口而出介绍的是Mojo Vision和纳米机器人。前者随着元宇宙概念的火热越来越出圈,后者则跟随医疗AI和机器人深入而展现更大作用。Mojo Vision,AR眼镜,隐形佩戴…

[SpringBoot-vue3] 自定义图库

✨✨个人主页:沫洺的主页 📚📚系列专栏: 📖 JavaWeb专栏📖 JavaSE专栏 📖 Java基础专栏📖vue3专栏 📖MyBatis专栏📖Spring专栏📖SpringMVC专栏📖SpringBoot专…

Spring框架的IOC和AOP的简单项目实现

一、Spring框架介绍 Spring框架是为了解决企业应用开发复杂性而创建的,是Java应用钟最广的框架,它的成功来源于设计思想,而不是技术本身,即IOC(inversion of control,控制反转) 和AOP&#xff…

攻防世界-adworld-reverse-game

#adworld-reverse-game 从1依次输入到8,每个数字会车,最后通关,获得flag |-----------------------▲--------||-----------------------●--------||-----------------------◆--------||-----------------------■--------||--------------------|-----------------------…

vite 静态资源打包配置,echart 主题引入,build上线问题,vue3-echart5使用

文章目录前情提要原因分析实战解析最后前情提要 在经历了vite打包实战后&#xff0c;我入手了echart实战&#xff0c;线下运行一切正常&#xff0c;但是打包上线后出现了异常 TypeError: Cannot create property series onstring <IDOCTYPE html>,挑战又来了&#xff0c…

抖音开发对接之订单取消消息

目录 前言 一、抖音开发中的订单取消消息 二、抖音运营反馈的业务需求分析 三、整体的业务开发思路 四、订单取消消息的代码开发 1.订单取消消息的使用 2.实时保存抖音平台过来的订单取消消息 3.具体的订单业务处理 总结 前言 这里主要是介绍一下抖音开放平台的这个消…

Redis数据结构之字典

目录 字典的应用场景 源码实现 hash算法的实现&#xff0c; hash冲突的解决 扩容缩容机制 哈希表的扩展与收缩条件 渐进式rehash 线程是否安全 Redis的dictht 和 Java(jdk1.8)的HashMap有什么区别 线程安全性 hash算法 解决hash冲突的方法 扩容机制 字典的应用场景…

Navicat的安装及如何将PG库内的数据导出CSV

一、Navicat的安装 1、安装 双击安装 Navicat Premium 12.0.18.0 简体中文 64位.exe 2、编辑连接&#xff0c;进行连接测试 具体配置信息可以进docker容器内查看 二、将PG库内的数据导出CSV 1、进入docker容器&#xff08;docker exec -it postgres_v3 bash&#xff09;&#…

中国开源年会报名 | StarRocks 极速湖仓分析的探索与实践

开源年度盛会 2022 第七届中国开源年会 (COSCon22) 来啦&#xff01; 本次年会将于 10 月 29-30 日由开源社举办&#xff0c;线上共设有1个主论坛和16个分论坛&#xff0c;线下分会场遍布成都、深圳、上海、北京等11个城市。StarRocks PMC 赵恒将代表社区出席大数据专场&#…

【Python】pycharm 和 vscode 编辑器设置模版

author: jwensh time: 2022.10.29 1. pycharm 模版 打开 PyCharm 设置界面&#xff0c;搜索 template&#xff0c;选择 File and Code Templates > Python Script 如下图所示&#xff0c;输入自定义模板代码 模版内容设置 #!/usr/bin/env python # -*- coding: utf-8 -*…

非遗在线商城小程序(后台PHP开发)

目 录 1绪论 1 1.1 选题及意义 1 1.2 国内外文献综述 2 1.3 研究的主要内容 3 2 系统工具 5 2.1 微信小程序 5 2.2 ThinkPHP 5 框架 7 2.3 RESTFul API 8 2.4 微信支付技术 10 2.5 MySQL数据库 12 3 系统分析 14 3.1 市场定位分析 14 3.2 可行性分析 14 3.3 需求目标 14 3.3.1 …

彻底理解Java并发:ReentrantLock锁

本篇内容包括&#xff1a;为什么使用 Lock、Lock 锁注意事项、ReentrantLock 和 synchronized 对比、ReentrantLock &#xff08;加锁、解锁、公平锁与非公平锁、ReentrantLock 如何实现可重入&#xff09;等内容。 一、Lock 锁 1、为什么使用 Lock synchronized 线程等待时间…

Filter快速入门、Filter执行流程、Filter使用细节、Listener概念、分类、ServletContextListener使用

文章目录FilterFilter快速入门Filter 执行流程Filter使用细节ListenerServletContextListener 使用Filter 概念&#xff1a;Filter表示过滤器&#xff0c;是 JavaWeb三大组件&#xff08;Servlet、Filter、Listener&#xff09;之一。过滤器可以把对资源的请求拦截下来&#x…

DASCTF X GFCTF 2022十月挑战赛web

前言 晚来的比赛web题解&#xff0c;这次buu的十月赛web部分的题目对于我来说质量还是蛮高的&#xff0c;因为这几天比较忙&#xff0c;一直没有去复现总结&#xff0c;不过该复现的还得复现&#xff0c;复现了这次比赛又能学到不少知识&#xff0c;嘿嘿嘿。 EasyPOP 考察ph…

Mega-Nerf学习笔记

Mega-NeRF:Scalable Construction of Large-Scale NeRFs for Virtual Fly-Throughs 主页&#xff1a;https://meganerf.cmusatyalab.org/ 论文&#xff1a;https://meganerf.cmusatyalab.org/resources/paper.pdf 代码&#xff1a;https://github.com/cmusatyalab/mega-nerf …

【设计模式】简单工厂模式

简单工厂模式–》工厂模式—》抽象工厂模式 文章目录简单工厂模式定义&#xff1a;各个角色1. 抽象产品类2. 具体产品类&#xff1a;3. 工厂类&#xff1a;简单工厂模式的核心。客户端设计图表未使用简单工厂模式&#xff1a;出现的问题&#xff1a;使用简单工厂模式&#xff1…

小熊派-FreeRTOS-点灯学习过程-20221029

一、前言准备 1、小熊派一个&#xff08;STM32L431RCT6&#xff09; 2、STM32CubeMX 3、keil5 4、小熊派的配套开发资料&#xff08;用于出问题的时候替换&#xff09; 二、实现过程 代码主要由STM32CubeMX生成&#xff0c;所以过程主要是配置CubeMX. 1、芯片选型 STM3…

用 Pyinstaller 模块将 Python 程序打包成 exe 文件(全网最全面最详细)

目录 打包前置知识 一、什么是exe可执行文件&#xff1f; 二、为什么要将 Python 程序打包为 exe 可执行文件&#xff1f; 三、为什么 Python 程序不能直接运行呢&#xff1f; 四、我们用什么来打包 Python 文件呢&#xff1f; 五、打包有哪几种分类呢&#xff1f; 打包…

【ArcGIS微课1000例】0041:ArcGIS利用坐标生成点的方法总结

本文讲解ArcGIS利用坐标生成点的3种方法。 文章目录 一、转到XY工具定位二、输入绝对XY生成点三、添加XY数据一、转到XY工具定位 这样确实可以在图上快速定位某个经纬度的点,但是生成的对象是“注记类”要素,即不是地理实体,而仅仅是为了绘图表现的东西。可以用如下工具来控…