linux运维、架构之路-K8s滚动更新及回滚
一、滚动更新
应用程序一次只更新一小部分副本,更新成功后,再更新更多的副本,最终完成所有副本的更新。 滚动更新的优点:零停机,整个更新过程始终有副本在运行,从而保证了业务的连续性。
1、创建三个副本Httpd服务,初始镜像为httpd:2.2.31,然后滚动更新至httpd:2.2.32
###cat httpd.yaml###
apiVersion: apps/v1beta2
kind: Deployment
metadata:
name: httpd
spec:
replicas:
selector:
matchLabels:
app: httpd
template:
metadata:
labels:
app: httpd
spec:
containers:
- name: httpd
image: httpd:2.2.
imagePullPolicy: IfNotPresent #默认值,本地有则使用本地镜像,不拉取
ports:
- containerPort:
①创建
kubectl apply -f httpd.yaml
②查看
③修改deployment文件进行更新
应用
kubectl apply -f httpd.yaml --record
④再次查看更新后的httpd版本
⑤使用命令查看滚动更新详细
kubectl describe deployment httpd
结果:每次只更新替换一个pod副本
⑥使用命令替换镜像
kubectl set image deployments/httpd httpd=httpd:2.2.
⑦验证如下:
[root@k8s-node1 rolling]# kubectl get deployment -o wide
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
httpd 42m httpd httpd:2.2. app=httpd
mtomcat 4d mtomcat liujixiao/java-demo:latest app=mtomcat
mynginx 9d mynginx nginx:latest name=mynginx
mytomcat 9d mytomcat tomcat: app=mytomcat
nginx 16d nginx nginx:latest name=nginx
[root@k8s-node1 rolling]# kubectl get rs -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
httpd-7584b484ff 11m httpd httpd:2.2. app=httpd,pod-template-hash=
httpd-cb5f5c5cb 38s httpd httpd:2.2. app=httpd,pod-template-hash=
httpd-fbdc45d78 42m httpd httpd:2.2. app=httpd,pod-template-hash=
mtomcat-7d6b5577b9 4d mtomcat tomcat: app=mtomcat,pod-template-hash=
mtomcat-b8d9c579 3d mtomcat liujixiao/java-demo:latest app=mtomcat,pod-template-hash=
mynginx-7659f869f4 9d mynginx nginx:latest name=mynginx,pod-template-hash=
mytomcat-698fb6789 9d mytomcat tomcat: app=mytomcat,pod-template-hash=
nginx-5bc649579b 5d nginx nginx:latest name=nginx,pod-template-hash=
nginx-fd7dc4fbc 16d nginx nginx:latest name=nginx,pod-template-hash=
二、回滚
kubectl apply每次更新应用时,都会记录下当前的配置文件,保存为一个revision (版本),这样就可以通过这个版本回滚到特定的时间。默认配置下,K8s只会保留最近的几个revision,可以在Deployment配置文件中通过revisionHistoryLimit属性增加reviseion数量。
1、实践回滚功能
①创建三个应用配置文件httpd-v1.yaml、httpd-v2.yaml、httpd-v3.yaml
httpd-v1.yaml
apiVersion: apps/v1beta2
kind: Deployment
metadata:
name: httpd
spec:
revisionHistoryLimit:
replicas:
selector:
matchLabels:
app: httpd
template:
metadata:
labels:
app: httpd
spec:
containers:
- name: httpd
image: httpd:2.4.
imagePullPolicy: IfNotPresent #默认值,本地有则使用本地镜像,不拉取
ports:
- containerPort:
httpd-v2.yaml
apiVersion: apps/v1beta2
kind: Deployment
metadata:
name: httpd
spec:
revisionHistoryLimit:
replicas:
selector:
matchLabels:
app: httpd
template:
metadata:
labels:
app: httpd
spec:
containers:
- name: httpd
image: httpd:2.4.
imagePullPolicy: IfNotPresent #默认值,本地有则使用本地镜像,不拉取
ports:
- containerPort:
httpd-v3.yaml
apiVersion: apps/v1beta2
kind: Deployment
metadata:
name: httpd
spec:
revisionHistoryLimit:
replicas:
selector:
matchLabels:
app: httpd
template:
metadata:
labels:
app: httpd
spec:
containers:
- name: httpd
image: httpd:2.4.
imagePullPolicy: IfNotPresent #默认值,本地有则使用本地镜像,不拉取
ports:
- containerPort:
②通过kubectl apply部署并更新应用
kubectl apply -f httpd-v1.yaml --record
deployment.apps "httpd" created
[root@k8s-node1 rolling]# kubectl get deployment httpd -o wide
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
httpd 16s httpd httpd:2.4. app=httpd
[root@k8s-node1 rolling]# kubectl apply -f httpd-v2.yaml --record
deployment.apps "httpd" configured
[root@k8s-node1 rolling]#
[root@k8s-node1 rolling]#
[root@k8s-node1 rolling]# kubectl get deployment httpd -o wide
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
httpd 27s httpd httpd:2.4. app=httpd
[root@k8s-node1 rolling]# kubectl apply -f httpd-v3.yaml --record
deployment.apps "httpd" configured
[root@k8s-node1 rolling]#
[root@k8s-node1 rolling]#
[root@k8s-node1 rolling]#
[root@k8s-node1 rolling]# kubectl get deployment httpd -o wide
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
httpd 36s httpd httpd:2.4. app=httpd
--record的作用是将当前命令记录到revision 记录中,这样我们就可以知道每个revison对应的是哪个配置文件,
通过kubectl rollout history deployment httpd查看历史记录,如下图:
[root@k8s-node1 rolling]# kubectl rollout history deployment httpd
deployments "httpd"
REVISION CHANGE-CAUSE
kubectl apply --filename=httpd-v1.yaml --record=true
kubectl apply --filename=httpd-v2.yaml --record=true
kubectl apply --filename=httpd-v3.yaml --record=true
③回滚到某个版本
查看当前版本:
[root@k8s-node1 rolling]# kubectl get deployment httpd -o wide
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
httpd 17m httpd httpd:2.4. app=httpd
回滚版本
kubectl rollout undo deployment httpd --to-revision=
查看回滚后版本
[root@k8s-node1 rolling]# kubectl get deployment httpd -o wide
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
httpd 19m httpd httpd:2.4. app=httpd
此时再查看历史记录也会发生相应的变化:
[root@k8s-node1 rolling]# kubectl rollout history deployment httpd
deployments "httpd"
REVISION CHANGE-CAUSE
kubectl apply --filename=httpd-v2.yaml --record=true
kubectl apply --filename=httpd-v3.yaml --record=true
kubectl apply --filename=httpd-v1.yaml --record=true
CHANGE-CAUSE就是--record的结果,这里可以通过CHANGE-CAUSE知道每个revision的具体含义,所以执行kubect apply时加上--record参数。
linux运维、架构之路-K8s滚动更新及回滚的更多相关文章
- Docker Swarm(八)滚动更新、回滚服务
滚动更新.回滚服务 默认情况下, swarm一次只更新一个副本,并且两个副本之间没有等待时间,我们可以通过: # 定义并行更新的副本数量--update-parallelism# 定义滚动更新的时间间 ...
- linux运维架构师职业规划
1.假如你从来未接触过Linux的话,首先要做的就找一本指导书来学习.现在公认的Linux的入门书籍是“鸟哥的私房菜”,讲的很全面,鸟哥的私房菜一共分为两部,一部是基础篇,一部是服务器篇.“鸟哥的私房 ...
- deployment控制pod进行滚动更新以及回滚
更新pod镜像两种方式: 方式一:kubectl set image deployment/${deployment name} ${container name}=${image} 例: kubec ...
- Linux运维之--zabbix使用(实时更新)
之前安装的是zabbix3.x版本,今天尝试安装zabbix4.2版本,并做个总结.建议生产环境还是使用3.4版本比较好,因为4.2版本上可能语法又增加了一些,所以建议使用熟练的版本 1.首先是安装z ...
- 从苦逼到牛逼,详解Linux运维工程师的打怪升级之路
做运维也快四年多了,就像游戏打怪升级,升级后知识体系和运维体系也相对变化挺大,学习了很多新的知识点. 运维工程师是从一个呆逼进化为苦逼再成长为牛逼的过程,前提在于你要能忍能干能拼,还要具有敏锐的嗅觉感 ...
- Nginx+Lua+Redis整合实现高性能API接口 - 网站服务器 - LinuxTone | 运维专家网论坛 - 最棒的Linux运维与开源架构技术交流社区! - Powered by Discuz!
Nginx+Lua+Redis整合实现高性能API接口 - 网站服务器 - LinuxTone | 运维专家网论坛 - 最棒的Linux运维与开源架构技术交流社区! - Powered by Disc ...
- Linux运维企业架构实战系列
Linux运维企业架构项目实战系列 项目实战1-LNMP的搭建.nginx的ssl加密.权限控制的实现 项目实战2-LVS.nginx实现负载均衡系列 2.1 项目实战2.1-实现基于LVS负载均衡集 ...
- Linux运维企业架构项目实战系列
Linux运维企业架构项目实战系列 项目实战1—LNMP的搭建.nginx的ssl加密.权限控制的实现 项目实战2—LVS.nginx实现负载均衡系列2.1 项目实战2.1—实现基于LVS负载均衡集群 ...
- Linux 运维入门到跑路书单推荐
一.基础入门 <鸟哥的Linux私房菜基础学习篇>:最具知名度的Linux入门书<鸟哥的Linux私房菜基础学习篇>,全面而详细地介绍了Linux操作系统. https://b ...
随机推荐
- C++深拷贝和浅拷贝细节理解
前提 在对象拷贝过程中,如果没有自定义拷贝构造函数,编译器会提供一个缺省的拷贝构造函数,缺省的拷贝构造函数对于基本类型的成员变量,按字节复制,对于类类型的成员变量则调用其相应的拷贝构造函数. 资料注解 ...
- [xpath] 定位中starts-with、contains和text()的用法
starts-with 顾名思义,匹配一个属性开始位置的关键字 contains 匹配一个属性值中包含的字符串 text() 匹配的是显示文本信息,此处也可以用来做定位用 eg //input[sta ...
- Shell初学(七)linux账户管理/群组管理
[1]新建用户 用户相关文件:/etc/passwd /etc/shadow useradd useradd的默认预设 [2]设置密码 passwd 常见修改密码使用技巧: echo "1 ...
- [转帖]开源许可证GPL、BSD、MIT、Mozilla、Apache和LGPL的区别
开源许可证GPL.BSD.MIT.Mozilla.Apache和LGPL的区别 https://www.geek-workshop.com/thread-1860-1-1.html liamj ...
- MyBatis动态SQL第一篇之实现多条件查询(if、where、trim标签)
一.动态SQL概述 以前在使用JDBC操作数据时,如果查询条件特别多,将条件串联成SQL字符串是一件痛苦的事情.通常的解决方法是写很多的if-else条件语句对字符串进行拼接,并确保不能忘了空格或在字 ...
- Mysql workbench 字段类型(转载)
转载自:https://blog.csdn.net/j_h_xie/article/details/52924521 项目初始,在使用workbench建表时,字段中有PK,NN,UQ,BIN,UN, ...
- 前端-CSS-更改标签样式-长宽字体-背景-边框-显示方式-定位-透明度-扩展点-02
目录 控制标签元素样式 长宽属性.字体属性.文本对齐.文本装饰.首行缩进 背景属性.边框属性.圆角 display 显示方式 盒子模型 margin.padding... float浮动 overfl ...
- js、jQuery各种高度
height.js ```$(document).height(); //整个网页的高度 $(window).height(); //浏览器可视窗口的高度 $(window).scrollTop(); ...
- DAX/PowerBI系列 - 关于时间系列 - 如何用脚本生成时间维度 (Generate TIME Dimension)
DAX/PowerBI系列 - 关于时间系列 - 如何用脚本生成时间维度 (Generate TIME Dimension) 难度: ★☆☆☆☆(1星) 适用范围: ★★★★★(5星) 这个时间系列想 ...
- 33.服务之间的调用之RPC、Restful深入理解
33.服务之间的调用之RPC.Restful深入理解 2018年05月08日 01:52:42 郑学炜 阅读数 13577更多 分类专栏: 6.框架 版权声明:本文为博主原创文章,遵循CC 4.0 ...