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 控制器创建过程(二) 前言 本来这篇随笔应该是在上周就该写出来发布的,由于身体跟不上节奏感冒发烧有心无力,这种天气感冒发烧生不如死,也真正的体会到了什么叫病来如山倒,病 ...
随机推荐
- (转)arcengine+c# 修改存储在文件地理数据库中的ITable类型的表格中的某一列数据,逐行修改。更新属性表、修改属性表某列的值。
作为一只菜鸟,研究了一个上午+一个下午,才把属性表的更新修改搞了出来,记录一下: 我的需求是: 已经在文件地理数据库中存放了一个ITable类型的表(不是要素类FeatureClass),注意不是要素 ...
- Vim常用操作集合
基本上 vi/vim 共分为三种模式,分别是一般命令模式(Command mode),编辑模式(Insert mode)和命令行模式(Last line mode). 命令模式: 用户刚刚启动 vi/ ...
- rpm操作
--查找某个软件:abc rpm -qa |grep abc --删除某个软件:abc rpm -e --noscripts abc
- 【转载】深度学习中softmax交叉熵损失函数的理解
深度学习中softmax交叉熵损失函数的理解 2018-08-11 23:49:43 lilong117194 阅读数 5198更多 分类专栏: Deep learning 版权声明:本文为博主原 ...
- Java内存模型 (一)什么是进程?什么是线程?进程和线程之间的区别是什么?
什么是进程?什么是线程? 进程是系统中正在运行的一个程序,程序一旦运行就是进程. 进程可以看成程序执行的一个实例.进程是系统资源分配的独立实体,每个进程都拥有独立的地址空间.一个进程无法访问另一个进程 ...
- Linux 概念与快捷方式
概念 何为shell Shell 是指"提供给使用者使用界面"的软件(命令解析器),类似于 DOS 下的 command(命令行)和后来的 cmd.exe .普通意义上的 Shel ...
- JCC指令
0.JMP1.JE, JZ 结果为零则跳转(相等时跳转) ZF=12.JNE, JNZ 结果不为零则跳转(不相等时跳转) ZF=03.JS 结果为负则跳转 SF=14.JNS 结果为非负则 ...
- 搞懂MySQL GTID原理
从MySQL 5.6.5 开始新增了一种基于 GTID 的复制方式.通过 GTID 保证了每个在主库上提交的事务在集群中有一个唯一的ID.这种方式强化了数据库的主备一致性,故障恢复以及容错能力. GT ...
- mysql开启和关闭安全模式
今天在进行数据库UPDATE的时候出了一个问题,我把非主键的字段当作UPDATE的条件(筛选条件)时,提示了如下的语句 Error Code: 1175. You are using safe upd ...
- [BZOJ2594] [WC2006]水管局长(Kruskal+LCT)
[BZOJ2594] [WC2006]水管局长(Kruskal+LCT) 题面 SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可 ...