系列目录

简介

当kubernetes集群中的某个服务需要升级时,传统的做法是,先将要更新的服务下线,业务停止后再更新版本和配置,然后重新启动并提供服务。如果业务集群规模较大时,这个工作就变成了一个挑战,而且先全部了停止,再逐步升级的方式会导致服务较长时间不可用。kubernetes提供了滚动更新(rolling-update)的方式来解决上述问题。

简单来说,滚动更新就是针对多实例服务的一种不中断服务的更新升级方式。一般情况下,对于多实例服务,滚动更新采用对各个实例逐个进行单独更新而非同一时刻对所有实例进行全部更新的方式。

对于k8s集群部署的service来说,rolling update就是指一次仅更新一个pod,并逐个进行更新,而不是在同一时刻将该service下面的所有pod shutdown,避免业务中断。

Service、Deployment、RS、RC和Pod之间的关系

对于我们要部署的应用来说,一般是由多个抽象的service组成。在kubernetes中,一个service通过label selector match出一个pods集合,这些Pods作为service的endpoint,是真正承载业务的实体。而pod在集群内的部署、调度、副本数则是通过Deployment或者RC这些更高级别的抽象来管理的。如下图:

新版本的Kubernetes推荐用Deployment替代ReplicationController,在Deployment这个概念下在保持Pod副本数上实际发挥作用的是隐藏在背后的Replica Set。

因此,我们可以看到Kubernetes上Service的rolling update实质上是对Service所match出来的Pod集合的Rolling update,而控制Pod部署、调度和副本调度的却又恰恰是Deployment和replication controller,因此后两者才是kubernetes service rolling update真正要面对的实体。

使用kubectl rolling-update更新

使用kubectl rolling-update命令的方式,主要是针对使用RC创建的pods。
先来看下面一个示例,创建一个包含4个nginx副本的RC nginx-demo-v1-rc.yml:

apiVersion: v1
kind: ReplicationController
metadata:name: nginx-demo-v1
spec:replicas: 4selector:app: nginx-demover: v1template:metadata:labels:app: nginx-demover: v1spec:containers:- name: nginx-demoimage: nginx:1.10.1ports:- containerPort: 80protocol: TCPenv:- name: NGX_DEMO_VERvalue: v1

创建一个service,nginx-demo-svc.yml内容如下:

apiVersion: v1
kind: Service
metadata:name: nginx-demo-svc
spec:ports:- port: 80protocol: TCPselector:app: nginx-demo

创建rc和service:

kubectl create -f nginx-demo-v1-rc.yml
kubectl create -f nginx-demo-svc.yml

创建完成以后,可以通过访问任一Pod的环境变量查看NGX_DEMO_VER的值,为v1

现在我们创建一个nginx-demo-v2-rc.yml的文件,来升级现有的pod:

apiVersion: v1
kind: ReplicationController
metadata:name: nginx-demo-v2
spec:replicas: 4selector:app: nginx-demover: v2template:metadata:labels:app: nginx-demover: v2spec:containers:- name: nginx-demoimage: nginx:1.11.9ports:- containerPort: 80protocol: TCPenv:- name: NGX_DEMO_VERvalue: v2

执行更新操作:

kubectl rolling-update nginx-demo-svc -f nginx-demo-v2-rc.yml

需要注意的是,在执行滚动升级时,两个版本的yml文件区别:

  • RC的名字不能与旧的RC名字相同
  • 在selector中应至少有一个label与旧的RC的label不同,以标识其为新的RC。

我们可以通过如下操作来查看更新的完整过程:

kubectl rolling-update nginx-demo-v1 --udpate-period=10s -f nginx-demo-v2-rc.yml

当所有旧的pod被新的Pod替换完成以后,更新完成。

使用kubectl rolling-update实现滚动更新的不足:

  • rolling-update的逻辑是由kubectl发出N条命令到APIServer完成的,很可能因为网络原因导致update中断

  • 需要创建一个新的rc,名字与要更新的rc不能一样

  • 回滚还需要执行rolling-update,只是用老的版本替换新的版本

  • service执行的rolling-update在集群中没有记录,后续无法跟踪rolling-update历史

现如今,RC的方式已经被Deployment替代。

Deployment的rolling-update

kubernetes的Deployment是一个更高级别的抽象。Deployment会创建一个Replica Set,用来保证Deployment中的Pod的副本数。要rolling-update deployment中的Pod,只需要修改Deployment自己的yml文件并应用即可。这个修改会创建一个新的Replica Set,在增加这个新RS的pod数的同时,减少旧RS的pod,直至完全升级。而这一切都发生在Server端,并不需要kubectl参与。

创建一个Deployment yml文件nginx-demo-dm.yml:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:name: nginx-demo
spec:replicas: 4selector:matchLabels:app: nginx-demominReadySeconds: 10template:metadata:labels:app: nginx-demoversion: v1spec:containers:- name: deployment-demoimage: nginx:1.10.1ports:- containerPort: 80protocol: TCP

创建该deployment:

kubect create -f nginx-demo-dm.yml --record

然后我们可以直接修改该deployment文件,如下 :

apiVersion: extensions/v1beta1
kind: Deployment
metadata:name: nginx-demo
spec:replicas: 4selector:matchLabels:app: nginx-demominReadySeconds: 10template:metadata:labels:app: nginx-demoversion: v2spec:containers:- name: deployment-demoimage: nginx:1.11.9ports:- containerPort: 80protocol: TCP

一共就改了两个地方,将version改为了v2,将nginx镜像从1.10.1改到了1.11.9,执行如下操作应用更改:

kubectl apply -f nginx-demo-dm.yml --record

这个时候,我们可以通过执行kubectl get rs来查看到rs的变化,以确认是否在执行升级。也可以通过kubectl describe deployment nginx-demo来查看详细的rolling-update的过程。还可以通过kubectl rollout status deployment/nginx-demo来查看更新状态。

除了使用apply方式来应用更改以外,还有另外一种方式可以直接升级。就是通过kubectl edit nginx-demo-dm.yml来编辑deployment文件,保存以后,不需要执行apply,就会自动完成升级。

我们可以注意到,在执行deployment的操作时,使用了一个--record参数,这个参数是用来告诉apiserver记录update的历史。可以通过如下命令来查看update历史:

kubectl rollout history deployment nginx-demo

查看指定revision的详细信息:

kubectl rollout history deployment hello-deployment --revision=2

需要说明的是,在升级完成以后,旧的RS也不会被删除,这些信息都会存储到server端,以方便回滚。
deployment下的pod的回滚操作相当简单,直接执行rollout undo即可将deployment回滚到record中记录的上一个revision:

kubectl rollout undo deployment nginx-demo

执行如下操作,回滚到指定版本:

kubectl rollout undo deployment hello-deployment --to-version=2

原文地址

转载于:https://www.cnblogs.com/tylerzhou/p/10995774.html

kubernetes滚动更新相关推荐

  1. Kubernetes滚动更新速率控制解读

    女主宣言 利用kubernetes的滚动更新时,可能经常遇到发布"太快不稳定"或"太慢体验差"的情况.本文将介绍kubernetes滚动更新控制速率的特性. P ...

  2. Kubernetes滚动更新(无中断平滑发布)

    Kubernetes支持名为Rolling Update的功能,允许您不间断地, 接近几乎无缝地平滑升级部署应用程序 ,即在不停止对外服务的前提下完成应用的更新. 什么是滚动更新? 为了应用升级部署时 ...

  3. 万字长文带你全面认识 Kubernetes 中如何实现蓝绿部署、金丝雀发布和滚动更新...

    Kubernetes 中的部署策略 在本文中,我们将学习使用 Kubernetes 容器编排系统部署容器时的部署策略.在本文的最后,我们将学习如何在 Kubernetes 集群中使用不同的方式进行部署 ...

  4. Kubernetes部署策略:重建、滚动更新、蓝绿部署、金丝雀部署

    Kubernetes原生支持重建.滚动更新两种部署策略.通过修改Service的label,切换流量转发可以实现蓝绿部署.金丝雀部署. 部署前的准备 1.需要有一个k8s集群.没有可查看此博客 htt ...

  5. 使用动态jenkins从节点和kubernetes进行实时滚动更新的Web服务器

    The main motive of this article is to solve real-world problems. Can you imagine the loss of Instagr ...

  6. kubernetes(七)项目部署方式:蓝绿部署,灰度发布/金丝雀发布,滚动更新

    在项目迭代的过程中,不可避免需要上线进行部署. 目前项目部署的方式有很多种:像重新部署,蓝绿部署,金丝雀部署(灰度部署),滚动更新.本文简单介绍下这些常见的部署方案以及使用k8s怎么进行对应部署 重新 ...

  7. 详细聊聊k8s deployment的滚动更新(二)

    一.知识准备 ● 本文详细探索deployment在滚动更新时候的行为 ● 相关的参数介绍:   livenessProbe:存活性探测.判断pod是否已经停止   readinessProbe:就绪 ...

  8. K8S滚动更新示例演示

    简介 当kubernetes集群中的某个服务需要升级时,传统的做法是,先将要更新的服务下线,业务停止后再更新版本和配置,然后重新启动并提供服务.如果业务集群规模较大时,这个工作就变成了一个挑战,而且先 ...

  9. 不停机与停机更新_Istio的零停机滚动更新

    不停机与停机更新 本系列文章的第一部分介绍了如何在Kubernetes集群中实现真正的零停机时间更新. 我们专门解决了将流量从旧实例切换到新实例时出现的请求失败. 本文将展示如何使用Istio群集实现 ...

  10. Istio的零停机滚动更新

    本系列文章的第一部分介绍了如何在Kubernetes集群中实现真正的零停机时间更新. 我们专门解决了将流量从旧实例切换到新实例时出现的请求失败. 本文将展示如何使用Istio群集实现相同的目标. 服务 ...

最新文章

  1. 简单的按键控制LED
  2. 第五章、寻找满足条件的两个或多个数
  3. 网络视频贴片广告全面推行第三方监测
  4. linux c 11 运行库,11.1.3 运行库与I/O
  5. aud to php,HKD to PHP
  6. 腐蚀rust服务器命令_【使用 Rust 写 Parser】2. 解析Redis协议
  7. 一起谈.NET技术,Silverlight动态加载DLL
  8. python获取session里的_python 怎么取sessionid-问答-阿里云开发者社区-阿里云
  9. ios 类别(category)
  10. 使用 Mac 的 Safari 收看 Netflix 时出现错误码「S7361-1253」如何解决?
  11. [CSS3] :nth-child的用法
  12. API章节--第四节包装类总结
  13. 2020-02-24
  14. 新的Steam控制器,ScummVM上的Sherlock Holmes以及更多开放游戏新闻
  15. 摄像机成像原理(模型)与标定
  16. 网站URL被劫持怎么办?
  17. 百家号自媒体的文章在哪个时间段发文效果比较好?
  18. 熊厂远程办公!聊一聊我在家办公的真实体验!
  19. c语言编译器error,KEIL C编译器常见警告与错误信息的解决办法
  20. IPFS发展前景真有说的那么好么?

热门文章

  1. Linux学习(5)Linux用户管理、用户组管理
  2. 基于springboot+vue的智慧教室预约系统(前后端分离)
  3. 用户、角色、权限表的设计(mysql)
  4. 李炎恢老师的php源码以及附带一个php手册
  5. 利用后中遍历结果,重构二叉树
  6. sphinx php 扩展安装
  7. svn服务端安装、迁移教程、Eclipse切换svn连接库
  8. 阶段3 3.SpringMVC·_04.SpringMVC返回值类型及响应数据类型_4 响应之返回值是ModelAndView类型...
  9. 阶段3 2.Spring_09.JdbcTemplate的基本使用_3 JdbcTemplate在Dao中的使用
  10. SVN实现自动更新(Windows平台)