Kubernetes Deloyment实现滚动更新
滚动更新简介
当kubernetes集群中的某个服务需要升级时,传统的做法是,先将要更新的服务下线,业务停止后再更新版本和配置,然后重新启动并提供服务。如果业务集群规模较大时,这个工作就变成了一个挑战,而且先全部了停止,再逐步升级的方式会导致服务较长时间不可用。kubernetes提供了滚动更新(rolling-update)的方式来解决上述问题。
简单来说,滚动更新就是针对多实例服务的一种不中断服务的更新升级方式。一般情况下,对于多实例服务,滚动更新采用对各个实例逐个进行单独更新而非同一时刻对所有实例进行全部更新的方式。
对于k8s集群来说,rolling update就是指一次仅更新一个或者一组pod,而不是在同一时刻将一个Deployment管理的所有pod shutdown,避免业务中断。
新版本的Kubernetes推荐用Deployment替代ReplicationController,在Deployment这个概念下在保持Pod副本数上实际发挥作用的是隐藏在背后的Replica Set。
使用kubectl rolling-update更新RC
使用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.14
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.15
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.14
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.15
ports:
- containerPort: 80
protocol: TCP
一共就改了两个地方,将version改为了v2,将nginx镜像从1.14改到了1.15,执行如下操作应用更改:
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-revision=2
Kubernetes Deloyment实现滚动更新的更多相关文章
- kubernetes滚动更新
系列目录 简介 当kubernetes集群中的某个服务需要升级时,传统的做法是,先将要更新的服务下线,业务停止后再更新版本和配置,然后重新启动并提供服务.如果业务集群规模较大时,这个工作就变成了一个挑 ...
- Kubernetes集群中Service的滚动更新
Kubernetes集群中Service的滚动更新 二月 9, 2017 0 条评论 在移动互联网时代,消费者的消费行为已经“全天候化”,为此,商家的业务系统也要保持7×24小时不间断地提供服务以满足 ...
- Kubernetes Pod应用的滚动更新(八)
一.环境准备 我们紧接上一节的环境,进行下面的操作,如果不清楚的,可以先查看上一篇博文. 滚动更新是一次只更新一小部分副本,成功后,再更新更多的副本,最终完成所有副本的更新.滚动更新的最大的好处是零停 ...
- Kubernetes——滚动更新和数据管理
k8s——滚动更新滚动更新就是一次只更新一小部分副本,更新成功之后再更新更多的副本,最终完成所有副本的更新.滚动更新最大的好处是零停机,整个更新的过程中始终有副本运行,从而保证了业务的连续性.kube ...
- kubernetes之DaemonSet以及滚动更新
1.什么是DaemonSet? 1.1DaemonSet是Pod控制器的又一种实现方式,用于在集群中的全部节点上同时运行一份指定的Pod资源副本,后续加入集群的节点也会自动创建一个相关的Pod对象,当 ...
- Kubernetes 零宕机滚动更新
转载自:https://www.qikqiak.com/post/zero-downtime-rolling-update-k8s/ 软件世界的发展比以往任何时候都快,为了保持竞争力需要尽快推出新的软 ...
- 详谈kubernetes滚动更新-1
系列目录 这个系列分为两个小节,第一个小节介绍deployment滚动更新时,deployment.replicaset.pod的细节以及创建过程以及deployment版本管理的方式 第二个小节将介 ...
- k8s滚动更新(六)--技术流ken
实践 滚动更新是一次只更新一小部分副本,成功后,再更新更多的副本,最终完成所有副本的更新.滚动更新的最大的好处是零停机,整个更新过程始终有副本在运行,从而保证了业务的连续性. 下面我们部署三副本应用, ...
- k8s(6)-滚动更新
用户希望应用程序始终可用,开发人员应该每天多次部署新版本的应用程序.在Kubernetes中,这是通过滚动更新完成的.滚动更新允许通过使用新的实例逐步更新Pods实例来实现部署的更新,从而实现零停机. ...
随机推荐
- 2017年软件工程第十二次作业-PSP总结报告
回顾1 1.回想一下你曾经对计算机专业的畅想 当初你是如何做出选择计算机专业的决定的?经过一个学期,你的看法改变了么,为什么? 你认为过去接触到的课程是否符合你对计算机专业的期待,为什么?经过一个学期 ...
- C++:构造函数3——浅拷贝和深拷贝
一.默认拷贝构造函数 拷贝构造函数是一种特殊的构造函数(详情见:http://www.cnblogs.com/duwenxing/p/7429777.html),如果用户在定义类时没有显式地编写拷贝构 ...
- android随机运算器开发小结1
想到第一天自己写了一个简单的四则运算程序的情景:我便想起了引起我们不断迭代开发的程序背景是:二柱子接受老师安排的给孩子出题的任务,每次需要给孩子设置出题任务,生成相应的小学运算题目,所以我们面对的需求 ...
- String 类 的 使用
package com.StringUse; import java.util.Arrays; /* String 的构造方法: String() 创建一个空内容 的字符串对象. String(byt ...
- 软工1816 · Beta冲刺(6/7)
团队信息 队名:爸爸饿了 组长博客:here 作业博客:here 组员情况 组员1(组长):王彬 过去两天完成了哪些任务 推进Web端完成开发 推进修改一些后端接口的逻辑 着手制作视频 接下来的计划 ...
- [建树(非二叉树)] 1106. Lowest Price in Supply Chain (25)
1106. Lowest Price in Supply Chain (25) A supply chain is a network of retailers(零售商), distributors( ...
- angularJS1笔记-(1)-多控制器
前端写好: <div ng-app="myApp"> <div ng-controller="firstController"> < ...
- CANOpen的几种操作以及数据
其实3年前在21ic就准备做这篇文章了,那时,CANOpen也只是刚刚在国内推广,所以几乎没有项目用到.现在有了实际的项目,完全确认了以前移植和测试的代码,所以列举一些CANOpen的底层操作以及数据 ...
- vue2.0 keep-alive 最佳实战(转载)
1.基本用法 vue2.0提供了一个keep-alive组件用来缓存组件,避免多次加载相应的组件,减少性能消耗 <keep-alive> <component> <!-- ...
- PAT 1074 宇宙无敌加法器
https://pintia.cn/problem-sets/994805260223102976/problems/994805263297527808 地球人习惯使用十进制数,并且默认一个数字的每 ...