文档章节

Kubernetes Deployment滚动更新场景分析

WaltonWang
 WaltonWang
发布于 2017/09/03 22:00
字数 1912
阅读 342
收藏 12
点赞 0
评论 0

基于Kubernetes v1.7.4

关于Kubernetes Deployment滚动更新

场景1:正常滚动更新流程

  • 新建deployment:webserver,replicas=10,image=tomcat。

这里写图片描述

  • 滚动更新应用镜像为:nginx

这里写图片描述

  • 观察Replicasets的变化,可发现升级后会创建新的Replicasets,删除老的Replicasets实例,滚动创建新实例。

这里写图片描述

  • 观察deployment的变化

这里写图片描述

  • DESIRED: 10(一直为10)
  • CURRENT: 在[replicas-maxUnavailable, replicas+maxSurge]:[8,13]之间变动,最终等于DESIRED值
  • UP-TO-DATE: 已更新为nginx镜像的实例,最终等于DESIRED值。
  • AVALIABLE: 新老replicaset总的实例数,最终等于DESIRED值。

场景2:应用滚动更新时,用户删除应用

  • 新建deployment:webserver,replicas=10,image=tomcat。

这里写图片描述

  • 更改容器镜像,触发deployment的滚动更新。

这里写图片描述

  • 新老Replicaset开始进行滚动更新。

这里写图片描述

  • 使用kubectl删除正在滚动更新的deployment。

这里写图片描述

  • 新老replicaset的实例数被缩减为0,实例开始被删除。

这里写图片描述

  • 观察deployment实例变化如下

这里写图片描述

从红框处,DESIRED=0,实例逐渐被删除。

场景3:应用滚动更新时,用户对该应用进行扩容

  • 新建deployment:webserver,replicas=15,image=tomcat。

这里写图片描述

  • 更改容器镜像,触发deployment的滚动更新。

这里写图片描述

开始进行滚动更新:

这里写图片描述

  • 更改deployment的实例数到20

这里写图片描述

  • 新老RS根据比例进行实例数扩容

    • RS实例数根据比例进行相应的增加: RS扩容后的实例数=扩容前实例数占比*扩容后最大实例数

    在此次升级中,在扩容前

    | NAME | DESIRED | CURRENT | READY | |----|----|----|----| | Webserver-1078791221 | 10 | 10 | 12 | | Webserver-3236788441 | 7 | 7 | 3 |

    升级前的总实例数:10+7=17
    升级前最多实例数:15+MaxSurge(25%)=19
    升级后最多实例数:20+ MaxSurge(25%)=25
    当前需扩容的总数:25-17=8
    所以:
    webserver-1078791221扩容后实例数=(10/19)*25=13.15(+0.5取整)=13 webserver-3236788441扩容后实例数=(7/19)*25=9.21(+0.5取整)=9

    • 剩余的实例分配给实例数最多的rs
      webserver-1078791221 较扩容前增加:13-10=3
      webserver-3236788441较扩容前增加:9-7=2
      仍剩余的实例(8-3-2=3个)分配给webserver-1078791221
      所以webserver-1078791221总实例数=10+3+3=16

      如下所示:

这里写图片描述

5)实例数更新以后,滚动升级继续进行,最终老的replicaset实例被删,替换为新的

这里写图片描述

场景4:应用滚动更新时,用户对该应用进行缩容

  • 新建deployment:webserver,replicas=15,image=tomcat。

这里写图片描述

  • 更改容器镜像,触发deployment的滚动更新。

这里写图片描述

开始进行滚动更新:

这里写图片描述

  • 更改deployment的实例数到4

这里写图片描述 - 新老RS根据比例进行实例数缩容
RS实例数根据比例进行相应的缩减(计算方法如扩容): RS缩容后的实例数=缩容前实例数占比*缩容后最大实例数

| NAME | DESIRED | CURRENT | READY |
|----|----|----|----|
|Webserver-1078791221 | 9 | 10 | 10|
|Webserver-3236788441 | 9 | 8 | 4 |

升级前的总实例数:9+9=18
升级前最多实例数:15+MaxSurge(25%)=19
升级后最多实例数:4+ MaxSurge(25%)=5
当前需缩容的总数:18-5=13
所以
webserver-1078791221缩容后实例数=-(9/19)*5=-2.36(-0.5取整)=2
webserver-3236788441缩容后实例数=-(9/19)*5=-2.36(-0.5取整)=2

  • 多缩容的实例分配给实例数最多的rs

webserver-1078791221 较缩容前减少:9-2=7
webserver-3236788441较缩容前减少:9-2=7
多缩容的实例(7+7-13=1个)分配给实例数最多的rs(由于新老RS实例数都为9,则按照创建时间进行排序,分给最新的实例webserver-3236788441)
所以webserver-3236788441总实例数=9-7+1=3

如下所示:  

这里写图片描述

  • 最终老的replicaset实例被删,替换为新的,且缩容到指定个数。

这里写图片描述

从deployment角度观察结果如下:

这里写图片描述

场景5:应用扩容时,进行滚动更新

  • 新建deployment:webserver,replicas=10,image=tomcat。

这里写图片描述

  • 更改deployment的实例数到20

这里写图片描述

RS的实例数变为20,开始扩容

这里写图片描述

  • 更改容器镜像,触发deployment的滚动更新。

这里写图片描述

  • 新老的replicaset的实例变化。
    创建新的RS,按照滚动升级策略开始更新,如下:

这里写图片描述

  • 最终老的replicaset实例被删,替换为新的

这里写图片描述

  • 观察deployment的实例变化如下:

这里写图片描述

场景6:应用缩容时,进行滚动更新

  • 新建deployment:webserver,replicas=25,image=tomcat。

这里写图片描述

  • 更改deployment的实例数到4

这里写图片描述

RS的实例数变为4,开始缩容

这里写图片描述

  • 更改容器镜像,触发deployment的滚动更新。

这里写图片描述

  • 新老的replicaset的实例变化
    老的RS的实例会被逐渐删除,同时新的RS开始滚动更新,符合滚动升级策略。

这里写图片描述

  • 最终老的replicaset实例被删,替换为新的

这里写图片描述

  • 观察deployment的实例变化如下:

这里写图片描述

deployment的实例数先被缩容到4;
UP-TO-DATE从25-0-4,表明实例被滚动到最新版本。
CURRENT 实例数在开始滚动更新后,最大数不超过5,符合滚动更新的实例数区间。

场景7:应用回滚

  • 新建deployment:webserver,replicas=10,image=tomcat。

这里写图片描述

  • 更改容器镜像为nginx,触发deployment的滚动更新。

这里写图片描述

等待滚动更新完成:

这里写图片描述

3)更改容器镜像为httpd,触发deployment的滚动更新。

这里写图片描述

等待滚动更新完成:

这里写图片描述

4)回滚到nginx版本。

这里写图片描述

等待滚动更新完成:

这里写图片描述

回滚到 –to-revision=2 nginx版本后,nginx版本又成为了最新的版本vision:4。

场景8:滚动更新未完成时,又开始新的滚动更新

  • 新建deployment:webserver,replicas=15,image=tomcat。

这里写图片描述

  • 更改容器镜像为nginx,触发deployment的滚动更新。

这里写图片描述

更新后,触发滚动升级:

这里写图片描述

  • 在上个滚动更新未完成的情况下,接着更改容器镜像为httpd,再次触发deployment的滚动更新。

这里写图片描述

更新后,再次触发滚动升级:

这里写图片描述

  1. 第二次滚动升级webserver-2480438009初始DESIRED=0,因为两个老的RS当前实例总数为12+7=19,已经达到最大值,所以初始为0。
  2. 缩减老的RS时,遵循两个原则
    • 遍历所有老的RS,优先缩减那些unavailable的实例。
      webserver-3236788441缩减前7/7/ 3(还有4个unacailable),所以先被缩减到3/7/3。
    • 在保证最小available个实例的前提下,缩减老的RS。 计算方法如下:
      最小可用数minAvailable = deployment.Replicas – maxUnavailable;
      当前总可用数:availablePodCount = 所有RS的AvailableReplicas总和;
      可缩减的总数:totalScaleDownCount = availablePodCount - minAvailable;
      将老的RS按创建时间从新到老排序,逐个进行缩减。
      例如,在第一次缩减webserver-1078791221时:
      webserver-2480438009 7/7/1
      webserver-1078791221 9/9/9
      webserver-3236788441 3/3/3
      minAvailable=15-15*25%=12
      availablePodCount=1+9+3=13
      totalScaleDownCount=13-12=1

所以将webserver-1078791221缩减1个实例到 8/9/9(如上图最下面的红框)

再次缩减时:
webserver-2480438009 8/8/2
webserver-1078791221 8/8/8
webserver-3236788441 3/3/3
minAvailable=15-15*25%=12 availablePodCount=2+8+3=13 totalScaleDownCount=13-12=1

这里写图片描述

webserver-1078791221缩减为0/0/0,开始用同样的方法缩减
webserver-3236788441,这里不再敖述。
相关处理Replicasets代码在:
pkg/controller/deployment/rolling.go:reconcileOldReplicaSets

  • 从deployment角度观察滚动过程如下:

这里写图片描述

附录:

感谢同事陈俊超辛苦的测试分析。

© 著作权归作者所有

共有 人打赏支持
WaltonWang
粉丝 159
博文 88
码字总数 182269
作品 0
深圳
程序员
更新APP-执行滚动更新

目标: 使用kubectl做一次滚动更新 更新一个应用 用户期望应用一直是可用的,而开发者期望一天部署多次新版本。 在k8s里,这是通过滚动更新来实现的。 Rolling updates允许增量更新新的Pods实...

趁你还年轻233 ⋅ 03/12 ⋅ 0

Dashboard - Kubernetes的全功能Web界面

编者按:这篇文章是关于Kubernetes 1.3新功能一系列深入文章的一部分,本文是第八篇。 Kubernetes Dashboard(仪表盘)是一个旨在将通用的基于Web的监控和操作界面加入 Kubernetes 的项目。 ...

时速云 ⋅ 2016/08/10 ⋅ 0

创建和管理多个Pod--Deployment

创建和管理多个Pod--Deployment 说明 Deployment 为 Pod 和 ReplicaSet 提供了一个声明式定义(declarative)方法,用来替代以前的ReplicationController 来方便的管理应用。 你只需要在 Depl...

品鉴初心 ⋅ 05/15 ⋅ 0

Kubernetes 核心概念简介

Kubernets 中的Node, Pod,Replication Controller, Service 等都可以看作一种资源对象,这些资源几乎都可以通过使用Kubernetes提供的kubectl 工具执行增删改查,并将其保存在etcd中持久化储...

酥心糖 ⋅ 05/22 ⋅ 0

Kubernetes核心概念总结(转载)

转载一篇不错的文章:https://www.cnblogs.com/WayneZeng/p/7680597.html 1、基础架构 1.1 Master   Master节点上面主要由四个模块组成:APIServer、scheduler、controller manager、etcd。...

yushanjin0767 ⋅ 05/29 ⋅ 0

Kubernetes核心概念总结

1、基础架构 1.1 Master   Master节点上面主要由四个模块组成:APIServer、scheduler、controller manager、etcd。     APIServer。APIServer负责对外提供RESTful的Kubernetes API服务...

zwqjoy ⋅ 2017/12/13 ⋅ 0

伸缩APP-运行多个APP实例

原文地址:https://kubernetes.io/docs/tutorials/kubernetes-basics/scale-intro/ 目标: 使用kubectl扩展应用 在之前的单元里我们创建了一个Deployment,然后紧接着通过Service公开曝光了出...

趁你还年轻233 ⋅ 03/12 ⋅ 0

将项目迁移到Kubernetes上的5个诀窍

我们将在本文中提供5个诀窍帮你将项目迁移到Kubernetes上,这些诀窍来源于过去12个月中OpenFaas社区的经验。下文的内容与Kubernetes 1.8兼容,并且已经应用于OpenFaaS - Serverless Functio...

Docker ⋅ 04/27 ⋅ 0

Kubernetes核心概念之Replication Controller详解

Replication Controller简称RC,它能够保证Pod持续运行,并且在任何时候都有指定数量的Pod副本,在此基础上提供一些高级特性,比如滚动升级和弹性伸缩 它在k8s中的架构如图: RC会在每个节点...

奋斗的寒霜 ⋅ 2017/12/08 ⋅ 0

Travix是如何部署应用程序到Kubernetes上的

在Travix内部的100个开发好的应用,有差不多一半是运行在谷歌GCE上面。早在2015年5月,Kubernetes还是Alpha版本的时候,Travix就已经开始使用了,从那之后接受它并且将它作为新应用程序的默认...

Caicloud ⋅ 2016/07/01 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Gitee 生成并部署SSH key

1.如何生成ssh公钥 你可以按如下命令来生成 sshkey: ssh-keygen -t rsa -C "xxxxx@xxxxx.com" # Generating public/private rsa key pair...# 三次回车即可生成 ssh key 查看你的 ...

晨猫 ⋅ 30分钟前 ⋅ 0

zblog2.3版本的asp系统是否可以超越卢松松博客的流量[图]

最近访问zblog官网,发现zlbog-asp2.3版本已经进入测试阶段了,虽然正式版还没有发布,想必也不久了。那么作为aps纵横江湖十多年的今天,blog2.2版本应该已经成熟了,为什么还要发布这个2.3...

原创小博客 ⋅ 今天 ⋅ 0

聊聊spring cloud的HystrixCircuitBreakerConfiguration

序 本文主要研究一下spring cloud的HystrixCircuitBreakerConfiguration HystrixCircuitBreakerConfiguration spring-cloud-netflix-core-2.0.0.RELEASE-sources.jar!/org/springframework/......

go4it ⋅ 今天 ⋅ 0

二分查找

二分查找,也称折半查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于...

人觉非常君 ⋅ 今天 ⋅ 0

VS中使用X64汇编

需要注意的是,在X86项目中,可以使用__asm{}来嵌入汇编代码,但是在X64项目中,再也不能使用__asm{}来编写嵌入式汇编程序了,必须使用专门的.asm汇编文件来编写相应的汇编代码,然后在其它地...

simpower ⋅ 今天 ⋅ 0

ThreadPoolExecutor

ThreadPoolExecutor public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, ......

4rnold ⋅ 昨天 ⋅ 0

Java正无穷大、负无穷大以及NaN

问题来源:用Java代码写了一个计算公式,包含除法和对数和取反,在页面上出现了-infinity,不知道这是什么问题,网上找答案才明白意思是负的无穷大。 思考:为什么会出现这种情况呢?这是哪里...

young_chen ⋅ 昨天 ⋅ 0

前台对中文编码,后台解码

前台:encodeURI(sbzt) 后台:String param = URLDecoder.decode(sbzt,"UTF-8");

west_coast ⋅ 昨天 ⋅ 0

实验楼—MySQL基础课程-挑战3实验报告

按照文档要求创建数据库 sudo sercice mysql startwget http://labfile.oss.aliyuncs.com/courses/9/createdb2.sqlvim /home/shiyanlou/createdb2.sql#查看下数据库代码 代码创建了grade......

zhangjin7 ⋅ 昨天 ⋅ 0

一起读书《深入浅出nodejs》-node模块机制

node 模块机制 前言 说到node,就不免得提到JavaScript。JavaScript自诞生以来,经历了工具类库、组件库、前端框架、前端应用的变迁。通过无数开发人员的努力,JavaScript不断被类聚和抽象,...

小草先森 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部