Replication Controller、ReplicaSet和Deployment(Kubernetes调度系列,结合操作命令讲解)

目录

一、概述

二、Replication Controller

2.1 Replication Controller 说明

2.2 Replication Controller 举例

三、ReplicaSet

3.1 ReplicaSet说明

3.2 ReplicaSet 举例

四、无状态应用管理Deployment

4.1 概述

4.2 创建Deployment

4.2.1 Deployment 标签内容解析

4.2.2 kubectl create创建语句

4.2.3 查看Deployment的状态

4.3.4 使用rollout查看Deployment创建的状态

4.3.5 查看Deployment对应的ReplicaSet

4.3.6 查看Deployment创建的Pod

4.3 更新Deployment

4.3.1 说明

4.3.2 使用set 命令更新

4.3.3 使用edit命令编辑Deployment

4.3.4 使用rollout查看Deployment查看更新过程

4.3.5 查看ReplicaSet

4.3.6 describe查看Deployment的详细信息

4.4 回滚Deployment

4.4.1 多更新几次Deployment

4.4.2 查看更新历史

4.4.3 查看某次更新

4.4.4 回滚版本

4.5 扩容Deployment

4.5.1 扩容操作

4.6 暂停和恢复Deployment更新

4.6.1 说明

4.6.2 暂停更新

4.6.3 修改内容

4.6.4 rollout history 查看历史

4.6.5 恢复Deployment更新

4.7 更新Deployment的注意事项

4.7.1 历史版本清理策略

4.7.2 更新策略

4.7.3 Ready策略


一、概述

对于Kubernetes的应用部署,我们之前提到过Pod就是用来配置容器的,容器就是用来运行应用的。也提到过,在实际使用时,不会创建单独的Pod运行应用,而是使用更高级的资源进行调度,比如Deployment等。本文的内容就是讲解Kubernetes原生的调度资源,在讲解高级资源Deployment、StatefulSet之前,首先会介绍什么是Replication Controller和ReplicaSet。

二、Replication Controller

2.1 Replication Controller 说明

Replication Controller可以确保Pod副本数达到期望值,也就是RC定义的数量。换句话说,Replication Controller可以确保一个Pod或一组同类Pod总是可用的。

如果存在的Pod大于设定的值,则Replication Controller将终止额外的Pod。如果太小,Replication Controller将启动更多的Pod用于保证达到期望值。

与手动创建Pod不同的是,用Replication Controller维护的Pod在失败、删除或终止时会自动替换。因此,即使应用程序只需要一个Pod,也应该使用Replication Controller或其他方式管理。

Replication Controller类似于进程管理程序,但是Replication Controller不是监视单个节点上的各个进程,而是监视多个节点上的多个Pod。

2.2 Replication Controller 举例

定义一个Replication Controller的示例如下:

三、ReplicaSet

3.1 ReplicaSet说明

ReplicaSet是支持基于集合的标签选择器的下一代Replication Controller,它主要用作Deployment协调创建、删除和更新Pod,和Replication Controller唯一的区别是,ReplicaSet支持标签选择器。

在实际应用中,虽然ReplicaSet可以单独使用,但是一般建议使用Deployment来自动管理ReplicaSet,除非自定义的Pod不需要更新或有其他编排等。

3.2 ReplicaSet 举例

Replication Controller和ReplicaSet的创建、删除和Pod并无太大区别,Replication Controller目前几乎已经不在生产环境中使用,ReplicaSet也很少单独被使用,都是使用更高级的资源Deployment、DaemonSet、StatefulSet管理Pod。

四、无状态应用管理Deployment

4.1 概述

前文提到的ReplicaSet可以确保在任何给定时间运行的Pod副本达到指定的数量,但是Deployment是一个更高级的概念,它管理ReplicaSet并为Pod和ReplicaSet提供声明性更新以及许多其他有用的功能,所以建议在生产环境下使用Deployment代替ReplicaSet。

Deployment一般用于部署公司的无状态服务,这个也是最常用的控制器,因为企业内部现在都是以微服务为主,而微服务实现无状态化也是最佳实践,可以利用Deployment的高级功能做到无缝迁移、自动扩容缩容、自动灾难恢复、一键回滚等功能。

4.2 创建Deployment

创建一个Deployment也很简单,将前面章节创建Pod的YAML文件稍微更改一下即可变成Deployment的资源文件,比如创建一个有3个Nginx副本(实例)的Deployment,可以看到只是apiVersion和Kind有所变化,如下所示:

4.2.1 Deployment 标签内容解析

  • nginx-deployment:Deployment的名称。
  • replicas:创建Pod的副本数。
  • selector:定义Deployment如何找到要管理的Pod,与template的label(标签)对应,apiVersion为apps/v1必须指定该字段。
  • template字段包含以下字段:
  • app: nginx使用label(标签)标记Pod。
  • spec:表示Pod运行一个名字为nginx的容器。
  • image:运行此Pod使用的镜像。
  • Port:容器用于发送和接收流量的端口。

注意:从Kubernetes 1.16版本开始,彻底废弃了其他的APIVersion,只能使用apps/v1,1.16以下的版本可以使用extension等。

4.2.2 kubectl create创建语句

使用kubectl create创建此Deployment:

kubectl create -f dp-nginx.yaml

4.2.3 查看Deployment的状态

使用kubectl get或者kubectl describe查看此Deployment的状态:

kubectl get deploy

  • NAME:集群中Deployment的名称。
  • DESIRED:应用程序副本数。
  • CURRENT:当前正在运行的副本数。
  • UP-TO-DATE:显示已达到期望状态的被更新的副本数。
  • AVAILABLE:显示用户可以使用的应用程序副本数,当前为1,因为部分Pod仍在创建过程中。
  • AGE:显示应用程序运行的时间。

4.3.4 使用rollout查看Deployment创建的状态

可以使用rollout命令查看整个Deployment创建的状态:

     kubectl rollout status deployment/nginx-deployment

当rollout结束时,再次查看此Deployment,可以看到AVAILABLE的数量和YAML文件中定义的replicas相同:

kubectl get deploy

4.3.5 查看Deployment对应的ReplicaSet

之前讲过Deployment通过ReplicaSet管理Pod,可以查看此Deployment当前对应的ReplicaSet:

kubectl get rs -l app=nginx

如果Deployment有过更新,对应的ReplicaSet可能不止一个,可以通过-o yaml获取当前对应的ReplicaSet是哪个,其余的ReplicaSet为保留的历史版本,用于回滚等操作。

注意:ReplicaSet的命名格式为[DEPLOYMENT-NAME]-[POD-TEMPLATE-HASH-VALUE]POD-TEMPLATE-HASH- VALUE,是自动生成的,不用手动指定。

4.3.6 查看Deployment创建的Pod

查看此Deployment创建的Pod,可以看到Pod的hash值5c689d88bb和上述Deployment对应的ReplicaSet的hash值一致:

kubectl get pods --show-labels

4.3 更新Deployment

4.3.1 说明

通过Deployment部署应用后,经常会有Deployment文件的配置更改或者镜像版本迭代的需求,更改配置后该Deployment会创建新的ReplicaSet,之后会对管理的Pod进行滚动升级。

注意:当且仅当Deployment的Pod模板(即.spec.template)更改时,才会触发Deployment更新,例如更改内存、CPU配置或者容器的image。

4.3.2 使用set 命令更新

假如更新Nginx Pod的image使用nginx:1.9.1,并使用--record记录当前更改的参数,后期回滚时可以查看到对应的信息:

     kubectl set image deployment nginx-deployment nginx=nginx:1.9.1 --record

4.3.3 使用edit命令编辑Deployment

     kubectl edit deployment.v1.apps/nginx-deployment

4.3.4 使用rollout查看Deployment查看更新过程

kubectl rollout status deployment.v1.apps/nginx-deployment

可以看出更新过程为新旧交替更新,首先新建一个Pod,当Pod状态为Running时,删除一个旧的Pod,同时创建一个新的Pod。

4.3.5 查看ReplicaSet

当触发一个更新后,会有新的ReplicaSet产生,旧的ReplicaSet会被保存,查看此时的ReplicaSet,可以从AGE或READY看出新旧ReplicaSet:

kubectl get rs

4.3.6 describe查看Deployment的详细信息

kubectl describe deploy nginx-deployment

在describe中可以看出,第一次创建时,它创建了一个名为nginx-deployment-5c689d88bb的ReplicaSet,并直接将其扩展为3个副本。更新部署时,它创建了一个新的ReplicaSet,命名为nginx-deployment-6987cdb55b,并将其副本数扩展为1,然后将旧的ReplicaSet缩小为2,这样至少可以有两个Pod可用,最多创建了4个Pod。以此类推,使用相同的滚动更新策略向上和向下扩展新旧ReplicaSet,最终新的ReplicaSet可以拥有3个副本,并将旧的ReplicaSet缩小为0。

4.4 回滚Deployment

4.4.1 多更新几次Deployment

当更新的版本不稳定或配置不合理时,可以对其进行回滚操作,假设我们又进行了几次更新(此处以更新镜像版本触发更新,更改配置效果类似):

     kubectl set image deployment nginx-deployment nginx=dotbalo/canary:v1 --record
     kubectl set image deployment nginx-deployment nginx=dotbalo/canary:v2 --record

4.4.2 查看更新历史

使用kubectl rollout history查看更新历史:

kubectl rollout history deployment/nginx-deployment

4.4.3 查看某次更新

查看Deployment某次更新的详细信息,使用--revision指定某次更新的版本号:

kubectl rollout history deployment/nginx-deployment -revision=3

4.4.4 回滚版本

如果只需要回滚到上一个稳定版本,使用kubectl rollout undo即可:

     kubectl rollout undo deployment/nginx-deployment

再次查看更新历史,发现REVISION5回到了canary:v1:

kubectl rollout history deployment/nginx-deployment

如果要回滚到指定版本,使用--to-revision参数:

      kubectl rollout undo deployment/nginx-deployment --to-revision=2

4.5 扩容Deployment

4.5.1 扩容操作

当公司访问量变大,或者有预期内的活动时,3个Pod可能已无法支撑业务时,可以提前对其进行扩展。

使用kubectl scale动态调整Pod的副本数,比如增加Pod为5个:

      kubectl scale deployment.v1.apps/nginx-deployment --replicas=5

查看Pod,此时Pod已经变成了5个:

kubectl get pods

4.6 暂停和恢复Deployment更新

4.6.1 说明

上述演示的均为更改某一处的配置,更改后立即触发更新,大多数情况下可能需要针对一个资源文件更改多处地方,而并不需要多次触发更新,此时可以使用Deployment暂停功能,临时禁用更新操作,对Deployment进行多次修改后再进行更新。

4.6.2 暂停更新

使用kubectl rollout pause命令即可暂停Deployment更新:

      kubectl rollout pause deployment/nginx-deployment

4.6.3 修改内容

然后对Deployment进行相关更新操作,比如先更新镜像,然后对其资源进行限制(如果使用的是kubectl edit命令,可以直接进行多次修改,无须暂停更新,kubectl set命令一般会集成在CICD流水线中):

kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.9.1

kubectl set resources deployment.v1.apps/nginx-deployment -C=nginx -limits=cpu=200m,memory=512Mi

4.6.4 rollout history 查看历史

通过rollout history可以看到没有新的更新:

kubectl rollout history deployment.v1.apps/nginx-deployment

4.6.5 恢复Deployment更新

进行完最后一处配置更改后,使用kubectl rollout resume恢复Deployment更新:

     kubectl rollout resume deployment.v1.apps/nginx-deployment

可以查看到Deployment的image(镜像)已经变为nginx:1.9.1:

kubectl describe deploy nginx-deployment

4.7 更新Deployment的注意事项

4.7.1 历史版本清理策略

在默认情况下,revision保留10个旧的ReplicaSet,其余的将在后台进行垃圾回收,可以在.spec.revisionHistoryLimit设置保留ReplicaSet的个数。当设置为0时,不保留历史记录。

4.7.2 更新策略

  • .spec.strategy.type==Recreate:表示重建,先删掉旧的Pod,再创建新的Pod。
  • .spec.strategy.type==RollingUpdate:表示滚动更新,可以指定maxUnavailable和maxSurge来控制滚动更新过程。
  • .spec.strategy.rollingUpdate.maxUnavailable:指定在回滚更新时最大不可用的Pod数量,可选字段,默认为25%,可以设置为数字或百分比,如果maxSurge为0,则该值不能为0。
  • .spec.strategy.rollingUpdate.maxSurge:可以超过期望值的最大Pod数,可选字段,默认为25%,可以设置成数字或百分比,如果maxUnavailable为0,则该值不能为0。

4.7.3 Ready策略

.spec.minReadySeconds是可选参数,指定新创建的Pod应该在没有任何容器崩溃的情况下视为Ready(就绪)状态的最小秒数,默认为0,即一旦被创建就视为可用,通常和容器探针连用。

好了,本次内容就分享到这,欢迎大家关注《Kubernetes》专栏,后续会继续输出相关内容文章。如果有帮助到大家,欢迎大家点赞+关注+收藏,有疑问也欢迎大家评论留言!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

视频分块上传Vue3+SpringBoot3+Minio

文章目录 一、简化演示分块上传、合并分块断点续传秒传 二、更详细的逻辑和细节问题可能存在的隐患 三、代码示例前端代码后端代码 一、简化演示 分块上传、合并分块 前端将完整的视频文件分割成多份文件块,依次上传到后端,后端将其保存到文件系统。前…

C++教学——从入门到精通 9.比大小

如果叫你比较a,b,c的大小并排序都会吧&#xff0c;先用我们学过的方法做 #include"iostream" using namespace std; int main(){int a,b,c;cin>>a>>b>>c;if(a>b&&a>c){if(b>c)cout<<c<<" "<<b;else…

Vue2电商前台项目(二):完成Home首页模块业务

一、项目开发的步骤 1、书写静态页面&#xff08;HTML&#xff0c;CSS&#xff09; 2、拆分组件 3、获取服务器的数据动态展示 4、完成相应的动态业务逻辑 经过分析之后&#xff0c;Home首页可以拆分为7个组件&#xff1a;TypeNav三级联动导航&#xff0c;ListContainer&…

先进电机技术 —— 无线电机

一、背景 无线电能传输电机是一种创新的电机设计&#xff0c;它结合了无线电能传输技术与传统的电机工作原理。这种电机的主要特点是通过无线方式传输电能&#xff0c;从而消除了传统电机中需要有线连接的限制&#xff0c;提高了系统的灵活性和可靠性。 无线电能传输技术主要…

C51实现每秒向电脑发送数据(UART的含义)

其实核心的问题是&#xff1a;串口的通信方式 异步串行是指UART&#xff08;Universal Asynchronous Receiver/Transmitter&#xff09;&#xff0c;UART包含TTL电平的串口和RS232电平的串口 UART要实现异步通信的&#xff1a; UART是异步串行接口&#xff0c;通信双方使用时…

LeetCode每日一题之专题一:双指针 ——快乐数

快乐数OJ链接&#xff1a;202. 快乐数 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 题目分析: 为了房便叙述&#xff0c;将「对于⼀个正整数&#xff0c;每⼀次将该数替换为它每个位置上的数字的平方和」这⼀个 操作记为 x 操作&#xff1b; 题目告诉我们&#…

Shell脚本之基础-2

目录 一、字符处理 cut命令 awk命令 sed命令 字符串排序 二、条件判断 文件类型判断 文件权限判断 两个文件的判断 整数比较 字符串判断 多重判断 三、流程控制 if分支 if else 双分支结构 case分支 for循环 while循环 一、字符处理 cut命令 命令格式&#x…

Python 金融数据分析工具库之zvt使用详解

​​​​​​​ 概要 Python在金融数据分析领域有着广泛的应用,而zvt库作为一款强大的金融数据分析工具,为开发者提供了丰富的功能和灵活的应用接口。本文将深入介绍zvt库的安装、特性、基本功能、高级功能、实际应用场景,并总结其在金融数据分析中的价值和优势。 安装 …

mysql故障排查

MySQL是目前企业最常见的数据库之一日常维护管理的过程中&#xff0c;会遇到很多故障汇总了常见的故障&#xff0c;MySQL默认配置无法满足高性能要求 一 MySQL逻辑架构图 客户端和连接服务核心服务功能存储擎层数据存储层 二 MySQL单实例常见故障 故障1 ERROR 2002 (HY000)…

(echarts)title和legend不重叠/legend图例滚动显示不换行

(echarts)title和legend不重叠/legend图例滚动显示不换行 title和legend都被放置在了不同的位置&#xff0c;从而避免了重叠。你可以根据实际的图表布局和需求调整left&#xff08;水平位置&#xff09;和top&#xff08;垂直位置&#xff09;等属性&#xff0c;确保它们不会相…

【SCI绘图】【箱型图系列1 python】多类对比及各类下属子类对比

SCI&#xff0c;CCF&#xff0c;EI以及核心期刊绘图宝典&#xff0c;爆款更新&#xff0c;助力科研&#xff01; 本期分享&#xff1a; 【SCI绘图】【箱型图系列1】多类对比各类下属子类对比 文末附带完整代码&#xff1a; 1.环境准备 python 3 from matplotlib import pyp…

QT-QPainter

QT-QPainter 1.QPainter画图  1.1 概述  1.1 QPainter设置  1.2 QPainter画线  1.3 QPainter画矩形  1.4 QPainter画圆  1.5 QPainter画圆弧  1.6 QPainter画扇形 2.QGradient  2.1 QLinearGradient线性渐变  2.2 QRadialGradient径向渐变  2.3 QConicalGr…

【Unity每日一记】如何从0到1将特效图集制作成一个特效

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

Prometheus+grafana环境搭建Nginx(docker+二进制两种方式安装)(六)

由于所有组件写一篇幅过长&#xff0c;所以每个组件分一篇方便查看&#xff0c;前五篇链接如下 Prometheusgrafana环境搭建方法及流程两种方式(docker和源码包)(一)-CSDN博客 Prometheusgrafana环境搭建rabbitmq(docker二进制两种方式安装)(二)-CSDN博客 Prometheusgrafana环…

数据分析python代码——数据填充

在Python中&#xff0c;我们通常使用pandas库来处理和分析数据。数据填充是数据预处理的一个重要步骤&#xff0c;用于处理数据中的缺失值。以下是使用pandas库进行数据填充的示例代码&#xff1a; 在数据分析中&#xff0c;处理缺失值&#xff08;空值&#xff09;是一个重要…

基于微信小程序的实验室预约系统的设计与开发

个人介绍 hello hello~ &#xff0c;这里是 code袁~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的…

c语言文件操作(超详细)

前言 这次的博客&#xff0c;可以让大家快速掌握文件操作&#xff0c;方便大家快速找到不懂的内容 文件操作的作用以及基础 1. 为什么使用文件&#xff1f; 如果没有文件&#xff0c;我们写的程序的数据是存储在电脑的内存中&#xff0c;如果程序退出&#xff0c;内存回收&…

(arxiv2401) CrossMAE

作者团队来自加州大学伯克利分校&#xff08;UC Berkeley&#xff09;和加州大学旧金山分校&#xff08;UCSF&#xff09;。论文主要探讨了在MAE的解码中&#xff0c;图像patch之间的依赖性&#xff0c;并提出了一种新的预训练框架 CrossMAE。 论文的主要贡献包括&#xff1a; …

代码随想录-算法训练营day02【滑动窗口、螺旋矩阵】

专栏笔记&#xff1a;https://blog.csdn.net/weixin_44949135/category_10335122.html https://docs.qq.com/doc/DUGRwWXNOVEpyaVpG?uc71ed002e4554fee8c262b2a4a4935d8977.有序数组的平方 &#xff0c;209.长度最小的子数组 &#xff0c;59.螺旋矩阵II &#xff0c;总结 建议…

(源码+部署+讲解)基于Spring Boot和Vue的大学生快递代取服务平台的设计与实现

一、引言 本报告旨在详细阐述基于Spring Boot后端框架和Vue前端框架的大学生快递代取服务平台的设计与实现过程。该平台旨在为大学生提供便捷的快递代取服务&#xff0c;解决因时间冲突或距离过远而无法及时取件的问题。通过该平台&#xff0c;用户可以发布代取需求&#xff0c…