简介

当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: 4

selector:

app: nginx-demo

ver: v1

template:

metadata:

labels:

app: nginx-demo

ver: v1

spec:

containers:

- name: nginx-demo

image: nginx:1.10.1

ports:

- containerPort: 80

protocol: TCP

env:

- name: NGX_DEMO_VER

value: v1

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

apiVersion: v1

kind: Service

metadata:

name: nginx-demo-svc

spec:

ports:

- port: 80

protocol: TCP

selector:

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: 4

selector:

app: nginx-demo

ver: v2

template:

metadata:

labels:

app: nginx-demo

ver: v2

spec:

containers:

- name: nginx-demo

image: nginx:1.11.9

ports:

- containerPort: 80

protocol: TCP

env:

- name: NGX_DEMO_VER

value: 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: 4

selector:

matchLabels:

app: nginx-demo

minReadySeconds: 10

template:

metadata:

labels:

app: nginx-demo

version: v1

spec:

containers:

- name: deployment-demo

image: nginx:1.10.1

ports:

- containerPort: 80

protocol: TCP

创建该deployment:

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

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

apiVersion: extensions/v1beta1

kind: Deployment

metadata:

name: nginx-demo

spec:

replicas: 4

selector:

matchLabels:

app: nginx-demo

minReadySeconds: 10

template:

metadata:

labels:

app: nginx-demo

version: v2

spec:

containers:

- name: deployment-demo

image: nginx:1.11.9

ports:

- containerPort: 80

protocol: 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

k8s滚动升级_kubernetes滚动更新相关推荐

  1. Deployment滚动升级

    一.简介 Deployment 是一种更高级的资源,用于部署或升级应用. 创建Deployment时,ReplicaSet资源会随之创建,实际Pod是由ReplicaSet创建和管理,而不是由Depl ...

  2. Oracle 19C新特性测试之滚动升级

    从Oracle的12.1或12.2版本升级到最新的19c版本,目前可供选择的几种升级方案有: 1.插拔式升级,通用性好,属于数据迁移式的升级方式,不能整库进行升级,数据量越大耗时越长,业务中断时间长. ...

  3. oracle18c升级19,Oracle 18C新特性测试之滚动升级

    原标题:Oracle 18C新特性测试之滚动升级 7月24日Oracle 18c通用版本正式对外发布后,三墩IT人在第一时间选取了Oracle 18c PDB在数据同步.迁移.切换方面的三项新功能的测 ...

  4. Docker Swarm mode与滚动升级

    Swarm mode与滚动升级 Swarm里面有个很好的姿势,就是可以动态的更新某个服务对应的镜像,已达到滚动升级的目的,而不是重新制作这个服务,并且重新制作的话不光麻烦,还不好管理,swarm的这个 ...

  5. 线上发版如何做到分批发的?详解蓝绿部署,滚动升级,A/B 测试,灰度发布/金丝雀发布

    过去的 10 年里,很多大公司都在使用蓝绿部署,安全.可靠是这种部署方式的特点.蓝绿部署虽然算不上" Sliver Bullet ",但确实很实用.在有关于"微服务&qu ...

  6. linux 不识别 svg,manjaro/archlinux用yaourt -Syu滚动升级后大量图标主题不能用svg图标不能识别...

    系统版本: manjaro linux 2016.10 升级日期: 2017.03.12 故障描述: 所有svg图标均不能识别.像maia.flattr这样的svg图标主题全都不能用,全都fallba ...

  7. HDFS的滚动升级: Rolling Upgrade

    前言 目前Hadoop版本更新迭代的速度还是比较快的,每次新版本的发布,都是一件令人期待的事情.因为这意味着用户可以使用新的功能特性,又或者说在新版中某某模块性能得到了巨大提升等等.现在问题来了,如果 ...

  8. 微软S2D2016滚动升级2019

    Storage Space Direct(简称S2D)是微软在Windows Server 2016数据中心版集成的第三代软件定义存储技术,S2D技术能够将工业标准X86服务器的本地磁盘汇总构建出具备 ...

  9. ansible中的角色使用--nginx+持续交付和滚动升级+时间同步角色+selinux+自动添加磁盘

    文章目录 1. nginx 2. 持续交付和滚动升级 3. noarch(时间同步角色) 4. selinux 5.自动添加磁盘 使用角色添加磁盘 用任务命令创建lv 用任务命令进行设备分区 ansi ...

最新文章

  1. kali-linux 完美解决sublime输入 中文
  2. 2、Ktor学习-自动重新加载;
  3. UNIX 环境高级编程 文件和目录
  4. 用C#开发.NET CF 蓝牙通信模块
  5. php原生好还是tp好_webapp/H5封装,混开APP,没有原生APP好?事实是这样的吗?
  6. 13种重要的云原生工具,让交付过程更快
  7. Oracle数据的导出与导入
  8. VC2008 Windows Media Player控件的使用技巧 三
  9. 201571030139/201571030134 小学生四则运算软件结对编程
  10. 删除百度网盘“我的应用数据”文件夹
  11. 解决github上的提交说明中文乱码的问题
  12. 6 种 Python 数据可视化工具
  13. idea 生成项目结构图
  14. 电脑网络经常断线是怎么回事?从这几个问题去下手
  15. AUTOSAR关于使用PDUR 进行路由的CDD使用策略
  16. element UI 之 el-cascader 下拉多级单选,每一级均可选中
  17. apisix插件之修改返回body
  18. Python三方库:RabbitMQ基本使用
  19. 【高等数学】通过俩条空间直线求得公垂线的求法
  20. 使用DOM4J解析XML文档,输出所有学员信息和添加学生信息

热门文章

  1. OpenCV之图像膨胀:dilate函数(C++实现)
  2. Keras 常用的图像增强方式
  3. 5个简单步骤掌握TensorFlow中的Tensor
  4. 图_SimpleGraph
  5. 打包后的apk微信分享依然失败
  6. 戴尔外星人戴尔外星人Alienware m15R7原厂预装win11中文家庭版系统带F12 Support Assist OS Recovery一键还原恢复功能
  7. 【译】代码中如何写出更有意义的命名
  8. 在Linux中安装P4遇到的问题
  9. java 输出文件到mac路径_Java 中几种获取文件路径的方式
  10. 使用Python制作个消灭病毒的小游戏吧(教程含源码)