k8sDeployment控制器
简写为deploy,是k8s控制器的另一种实现,它构建于ReplicaSet之上,可为pod和rs资源提供声明式更新。
deploy控制器资源的大部分功能均可通过调用rs来实现,同时,还增添了部分特性:
事件和状态查看:必要时可以查看deploy对象升级的详细进度和状态
回滚:升级操作完成后发现问题时,支持使用回滚机制将应用返回到前一个或由用户指定的历史记录中的版本
版本记录:对deploy对象的每一次操作都予以保存,以提供后续可能执行的回滚操作
暂停和启动:对于每一次升级,都能够随时暂停和启动
多种自动更新方案:一是Recreate,即重建更新机制,全面停止、删除旧的pod后用新版本替代;另一个RollingUpdate,即滚动升级机制,逐步替换旧的pod至新的版本
一、创建deploy
其spec字段中嵌套使用的字段包含了rs控制器支持的replicas、selector、template和minReadySeconds,它也正是利用这些信息完成了其二级资源rs对象的创建,如下示例:
- apiVersion: apps/v1
- kind: Deployment
- metadata:
- name: myapp-deploy
- spec:
- replicas:
- selector:
- matchLabels:
- labels:
- app: myapp
- spec:
- containers:
- - name: myapp
- image: ikubernetes/myapp:v1
- ports:
- - containerPort:
- name: http
使用命令“kubectl apply -f myapp-deploy.yaml --record”命令部署,使用“kubectl get deploy”命令可以列出创建的deploy对象相关信息。deploy控制器会自动创建相关的rs控制器,并以“[deployment_name]-[template-hash-value]”格式为其命名,其中的hash值由deploy自动生成。由deploy创建的rs对象会自动使用相同的标签选择器。deploy借助于rs管理pod资源,其大部分管理操作与rs相同,不过,deploy也有rs所不具有的部分高级功能,这其中最著名的为自动滚动更新机制。
二、更新策略
depoly只需要由用户指定在pod模板中要改动的内容交由其自动完成更新,更新应用程序的规模也只需要修改期望的副本数量,余下的事情交给deploy控制器即可。
deploy控制器支持两种更新策略:滚动更新和重新创建,默认为滚动更新。重新创建即首先删除现有的pod对象,而后由控制器基于新模板重新创建出新版本资源对象。通常,只应该在应用的新旧版本不兼容时才会使用recreate策略。
滚动更新在删除一部分旧版本pod资源的同时,补充创建一部分新版本的pod对象进行应用升级,其优势是升级期间,容器中应用提供的服务不会中断,但要求应用程序能够应对新旧版本同时工作的情形。
deploy控制器的滚动更新操作并非在同一个rs控制器对象下删除并创建pod资源,而是将它们分置于两个不同的控制器之下:旧控制器的pod对象数量不断减少的同时,新控制器的pod对象数量不断增加,直到旧控制器不再拥有pod对象,而新控制器的副本数量变得完全符合期望值为止。
滚动更新时,应用升级期间还要确保可用的pod对象数量不低于某阈值以确保可以持续处理客户端的服务请求,变动的方式和pod对象的数量范围将通过spec.strategy.rollingUpdate.maxSurge和spec.rollingUpdate.maxUnavailable两个属性协同进行定义。
maxSurge:指定升级期间存在的总pod对象数量最多可超出期望值的个数,其值可以是0或正整数,也可以是一个期望值的百分比
maxUnavailable:升级期间正常可用的pod副本数(包括新旧版本)最多不能低于期望数值的个数,其值可以是0或正整数,也可以是一个期望值的百分比;默认值为1.
maxSurge和maxUnavailable属性的值不可同时为0,否则pod对象的副本数在符合用户期望的数量后无法做出合理变动以进行滚动更新操作。
配置时,用户还可以使用deploy控制器的spec.minReadySeconds属性来控制应用的升级速度。新旧更替过程中,新创建的pod对象一旦成功响应就绪探测即被视为可用,而后即可立即开始下一轮的替换操作。而spec.minReadySeconds能够定义在新的pod对象来让k8s在每次创建出pod资源后都要等上一段时长后再开始下一轮的更替,这个时间长度的理想值是等到pod对象中的应用已经可以接受并处理请求流量。
deploy控制器也支持用户保留其滚动更新历史中的旧rs对象版本,控制器可保存的历史版本数量由spec.revisionHistoryLimit属性进行定义。在创建deploy对象时使用“--record”选项来保存版本升级的历史。
三、升级deploy
修改pod模板相关的配置参数便能完成deploy控制器资源的更新,对deploy控制器资源的修改尤其适合使用apply和patch命令来进行;
四、金丝雀发布
deploy控制器还支持自定义控制更新过程中的滚动节奏,如暂停(pause)或继续(resume)更新操作,尤其时借助于maxSurge和maxUnavailable属性还能实现更为精巧的过程控制。例如,待第一批新pod对象创建完成后立即暂停更新过程,此时,仅存在一小部分新版本的应用,主体部分还是旧版本。然后再根据用户特征精心筛选出小部分用户的请求路由至新版本的pod应用,并持续观察其是否能稳定低按期望的方式运行。确定没有问题后再继续完成余下pod资源的滚动更新,否则立即回滚更新操作,这便是金丝雀发布。
五、回滚deploy控制器下的应用发布
若因各种原因导致滚动更新无法正常进行,则应将应用回滚到之前的版本,或者回滚到由用户指定的历史记录中的版本,可使用命令“kubectl rollout undo”完成,也可使用选项“--to-version=*”来指定版本。回滚操作中,其revision记录中的信息会发生变动,回滚操作会被当作一次滚动更新追加进历史记录中,而被回滚的条目则会被删除。需要注意的是,如果此前的滚动更新过程处于暂停状态,那么回滚操作就需要先将pod模板的版本改回到之前的版本,然后继续更新,否则,其将一直处于暂停状态无法回滚。
六、扩容和缩容
通过修改spec.replicas即可修改deploy中pod资源副本数量,它将实时作用于控制器并直接生效。deploy是声明式配置,replicas属性的值可直接修改资源配置文件,然后使用kubectl apply进行应用,也可以使用kubectl edit对其进行实时修改。而前一种方式能够将修改结果予以长期留存。另外,kubectl scale命令是专用于扩展某些控制器类型的应用规模的,包括deploy和job等。而deploy通过replicaset控制其pod资源,因此扩缩容的方式是相同的。
k8sDeployment控制器的更多相关文章
- ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第二章:利用模型类创建视图、控制器和数据库
在这一章中,我们将直接进入项目,并且为产品和分类添加一些基本的模型类.我们将在Entity Framework的代码优先模式下,利用这些模型类创建一个数据库.我们还将学习如何在代码中创建数据库上下文类 ...
- ABP文档 - Mvc 控制器
文档目录 本节内容: 简介 AbpController基类 本地化 其它 过滤 异常处理和结果包装 审计日志 验证 授权 工作单元 反伪造 模型绑定器 简介 ABP通过nuget包Abp.Web.Mv ...
- 关于VS2015 ASP.NET MVC添加控制器的时候报错
调试环境:VS2015 数据库Mysql WIN10 在调试过程中出现类似下两图的同学们,注意啦. 其实也是在学习的过程中遇到这个问题的,找了很多资料都没有正面的解决添加控制器的时候报错的问题,还是 ...
- ASP.NET Core 中文文档 第四章 MVC(4.2)控制器操作的路由
原文:Routing to Controller Actions 作者:Ryan Nowak.Rick Anderson 翻译:娄宇(Lyrics) 校对:何镇汐.姚阿勇(Dr.Yao) ASP.NE ...
- ASP.NET Core 中文文档 第四章 MVC(4.5)测试控制器逻辑
原文: Testing Controller Logic 作者: Steve Smith 翻译: 姚阿勇(Dr.Yao) 校对: 高嵩(Jack) ASP.NET MVC 应用程序的控制器应当小巧并专 ...
- ASP.NET Core 中文文档 第四章 MVC(4.4)依赖注入和控制器
原文: Dependency Injection and Controllers 作者: Steve Smith 翻译: 刘浩杨 校对: 孟帅洋(书缘) ASP.NET Core MVC 控制器应通过 ...
- AngularJS 第四天----控制器
控制器的作用 今天和大家学习AngularJS中控制器方面的知识,本文会给出一些例子来说明如何使用AngularJS的控制器.在开始我们的例子之前,首先说说AngularJS控制器的作用.简单的来说A ...
- ASP.NET Web API 控制器执行过程(一)
ASP.NET Web API 控制器执行过程(一) 前言 前面两篇讲解了控制器的创建过程,只是从框架源码的角度去简单的了解,在控制器创建过后所执行的过程也是尤为重要的,本篇就来简单的说明一下控制器在 ...
- ASP.NET Web API 控制器创建过程(二)
ASP.NET Web API 控制器创建过程(二) 前言 本来这篇随笔应该是在上周就该写出来发布的,由于身体跟不上节奏感冒发烧有心无力,这种天气感冒发烧生不如死,也真正的体会到了什么叫病来如山倒,病 ...
随机推荐
- configparser模块 subprocess 模块,xlrd 模块(表格处理)
今日内容: 1.configparser模块 2.subprocess模块 3.xlrd(读),xlwt(写) 表格处理 configparser模块 import configparser # co ...
- 如何为根分区扩容(centos7为例)
linux系统所有的文件都是存放在根分区中的,如果根分区容量即将耗尽,我们就需要给根分区扩容,我们可以使用lsblk命令来查看,系统的根分区实际是逻辑卷,所以想要扩展根分区只要将逻辑卷扩容就可以了.此 ...
- jump用户管理命令
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa手动拷贝id_rsa.pub的内容到其他机器 或者用 ssh-copy,但你得知道对方root密码 ssh-copy-i ...
- 如何解决Oracle11g使用dmp命令无法导出空表问题
如何解决Oracle11g使用dmp命令无法导出空表问题 导出:exp username/password@orcl file=路径 tables=(tb1) //tables=(tb1)可有 ...
- ubuntu18.04 开机自动启动脚本的坑
哇 这个真的难受 找了半天的方案不能用 自暴自弃用的图形界面设置
- FFmpeg4.0笔记:封装ffmpeg的音频重采样功能类CSwr
Github https://github.com/gongluck/FFmpeg4.0-study/tree/master/Cff CSwr.h /************************* ...
- jQuery Mobile Slider Widget 使用js控制
jQuery Mobile 滑动条控件 基本用法不用多说了,看这里: http://www.runoob.com/jquerymobile/jquerymobile-form-sliders.html ...
- idea 新建maven项目时,避免每次都需要指定自己的maven目录
01 .File->Other Settings -> Settings for New Project 02. 将Maven home directory目录修改成我们自己安装Maven ...
- java中jar包的使用
1:在工程目录下新建一个文件lib 导入jar包在里面 2:在jar包上右键 ——>build path——>add to bulid path OK!
- 第三篇 jQuery操作DOM
3-1 DOM页面文档 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:/ ...