简介

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

kubectl 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

参考链接:http://www.bubuko.com/infodetail-2560035.html

K8S滚动更新示例演示相关推荐

  1. k8s滚动更新(六)--技术流ken

    实践 滚动更新是一次只更新一小部分副本,成功后,再更新更多的副本,最终完成所有副本的更新.滚动更新的最大的好处是零停机,整个更新过程始终有副本在运行,从而保证了业务的连续性. 下面我们部署三副本应用, ...

  2. 实战演示k8s部署go服务,实现滚动更新、重新创建、蓝绿部署、金丝雀发布

    1 前言 本文主要实战演示k8s部署go服务,实现滚动更新.重新创建.蓝绿部署.金丝雀发布 2 go服务镜像准备 2.1 初始化项目 cd /Users/flying/Dev/Go/go-lesson ...

  3. k8s之滚动更新、金丝雀发布、蓝绿发布

    k8s Pod三种升级方式 哪几种发布方式 滚动更新 金丝雀发布 蓝绿发布 演示时间 滚动更新 金丝雀发布 蓝绿发布 哪几种发布方式 滚动更新 滚动更新通过设置MaxSurge和MaxUnavaila ...

  4. k8s滚动升级_kubernetes滚动更新

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

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

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

  6. 详解k8s deployment的滚动更新

    k8s deployment的滚动更新 一.知识准备 ● 本文详细探索deployment在滚动更新时候的行为 二.环境准备 组件 版本 OS Ubuntu 18.04.1 LTS docker 18 ...

  7. 深入玩转K8S之智能化的业务弹性伸缩和滚动更新操作

    在上篇我们讲到了较为傻瓜初级的弹性伸缩和滚动更新,那么接下来我们来看看较为高级的智能的滚动更新.本节的知识点呢是K8S的liveness和readiness探测,也就是说利用健康检查来做更为智能化的弹 ...

  8. K8s Kubectl基础命令的使用、滚动更新、以及回滚操作

    Kubectl基础命令的使用 kubernetes基本概念 kubectl管理命令 kubectl帮助 Kubectl常用命令的使用 explain edit scale autoscale clus ...

  9. k8s之滚动更新及pod流量分析

    一.LB Service流量 LoadBalancer 负责接收 K8s 集群外部流量并转发到 Node 节点上,ipvs/iptables 再负责将节点接收到的流量转发到 Pod 中(kube-pr ...

最新文章

  1. 斯坦福大学UFLDL教程列表
  2. 围城之势已起,拼多多骑虎难下
  3. [Python] Window机器上同时安装Python 2 和 Python 3,如何兼容切换使用?
  4. 问题 | 解决Intel MKL FATAL ERROR: Cannot load mkl_intel_thread.dll 问题(pycharm+Tensorflow)
  5. (转) SpringBoot接入两套kafka集群
  6. 用普罗米修斯和格拉法纳乐器来刺豪猪
  7. Netty的实现原理、特点与优势、以及适用场景
  8. 爱的十个秘密--3.尊重的力量
  9. 使用cordova调用相机在相机中添加蒙版
  10. 10个精选国外免费空间
  11. 剪映导出帧率选多少_剪映帧率|剪映帧率是什么 剪映帧率在哪设置_234游戏网
  12. JSP实现注册并显示信息
  13. 家居网络营销:定制家具行业如何做好全网营销?
  14. 尚硅谷es6新特性笔记
  15. NVl和NVL2的语法使用详解
  16. 期货开户需要具备⼀定的条件
  17. redis cluster C 客户端
  18. PPT设置多级项目符号和标号
  19. 外部数据导入qiime2软件内部
  20. 办公室礼仪:在工作中永远不要说的5件事

热门文章

  1. 数据结构与算法(C++)-- 算法分析
  2. 第四范式天枢入选毕马威首届“领先消费科技50”榜单
  3. LINUX内核杂记(1)-处理器与单内核
  4. vb.net机器学习-手写和本机数字识别-K均值和欧氏距离
  5. C指针原理(45)-LINUX应用
  6. 【深度学习】小目标检测、图像分类、图像识别等开源数据集汇总
  7. 【数据竞赛】长文本竞赛上分的三种策略。
  8. 温州大学《深度学习》课程课件(一)
  9. 【NLP】CS224N课程笔记|词向量I: 简介, SVD和Word2Vec
  10. 一文总结知识图谱基本概念和工程落地常见问题