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 ...
随机推荐
- MSF魔鬼训练营-3.2.2 操作系统辨识
利用操作系统视频进行社会工程学攻击.例如在探测到目标用户所使用的网络设备.服务器设备厂家型号等信息后.可伪装成相关厂家的技术人员通过电话.邮件等方式与系统管理员取得联系得到信任.NMAP 示例: 使用 ...
- mapreduce运行的bug收录
在8088端口可以看到日志文件(主要看error),操作如下: 1.window jdk版本最好和linux jdk 版本一致,不然容易出现莫名奇妙的bug 之前出现一个bug: Unsupporte ...
- CF 148D Bag of mice 题解
题面 这是我做的第一道概率DP题: 做完后发现没有后效性的DP是真的水: 在这里说主要是再捋顺一下思路: 设f[i][j]表示有i只白鼠,j只黑鼠是获胜的概率: 显然:f[i][0]=1; 然后分四种 ...
- KMP(next数组的更新理解)Codeforces Round #578 (Div. 2)--Compress Words
题目链接:https://codeforc.es/contest/1200/problem/E 题意: 有n串字符串,让你连起来:sample please ease in out ---> ...
- linux连接Windows系统之项目连接
在桥接模式下 在linux内需要设置 防火墙关闭 在Windows中连接 linux的ip连接 ***项目 在linux中命令行输入setup-->防火墙配置-->空格-->确定-- ...
- linux基础命令<二>
1.关机 init 0 poweroff halt shutdown –h now 2.重启 init 6 reboot shutdown –r now 3.查询都有那些用户在系统 ...
- mysql update join
随手记录一下 UPDATE information f1 LEFT JOIN topic f2 ON f1.id = f2.id SET f1.img_url = f2.img_url
- Linux 安装 python3.6 ,并且配置 Pycharm 远程连接开发
Linux下安装Python3.6和第三方库 如果本机安装了python2,尽量不要管他,使用python3运行python脚本就好,因为可能有程序依赖目前的python2环境, 比如yum!!! ...
- C# 面向对象4 构造函数
构造函数 1.构造函数用来创建对象,并且可以在构造函数中对对象进行初始化. (给对象的每个属性依次的赋值) 2.构造函数是用来创建对象的特殊方法: 1.方法名和类名一样. 2.没有返回值,连void都 ...
- LeetCode——全排列
给定一个没有重复数字的序列,返回其所有可能的全排列. 示例: 输入: [1,2,3]输出:[ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3 ...