一、滚动更新

       应用程序一次只更新一小部分副本,更新成功后,再更新更多的副本,最终完成所有副本的更新。 滚动更新的优点:零停机,整个更新过程始终有副本在运行,从而保证了业务的连续性。

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滚动更新及回滚的更多相关文章

  1. Docker Swarm(八)滚动更新、回滚服务

    滚动更新.回滚服务 默认情况下, swarm一次只更新一个副本,并且两个副本之间没有等待时间,我们可以通过: # 定义并行更新的副本数量--update-parallelism# 定义滚动更新的时间间 ...

  2. linux运维架构师职业规划

    1.假如你从来未接触过Linux的话,首先要做的就找一本指导书来学习.现在公认的Linux的入门书籍是“鸟哥的私房菜”,讲的很全面,鸟哥的私房菜一共分为两部,一部是基础篇,一部是服务器篇.“鸟哥的私房 ...

  3. deployment控制pod进行滚动更新以及回滚

    更新pod镜像两种方式: 方式一:kubectl set image deployment/${deployment name} ${container name}=${image} 例: kubec ...

  4. Linux运维之--zabbix使用(实时更新)

    之前安装的是zabbix3.x版本,今天尝试安装zabbix4.2版本,并做个总结.建议生产环境还是使用3.4版本比较好,因为4.2版本上可能语法又增加了一些,所以建议使用熟练的版本 1.首先是安装z ...

  5. 从苦逼到牛逼,详解Linux运维工程师的打怪升级之路

    做运维也快四年多了,就像游戏打怪升级,升级后知识体系和运维体系也相对变化挺大,学习了很多新的知识点. 运维工程师是从一个呆逼进化为苦逼再成长为牛逼的过程,前提在于你要能忍能干能拼,还要具有敏锐的嗅觉感 ...

  6. Nginx+Lua+Redis整合实现高性能API接口 - 网站服务器 - LinuxTone | 运维专家网论坛 - 最棒的Linux运维与开源架构技术交流社区! - Powered by Discuz!

    Nginx+Lua+Redis整合实现高性能API接口 - 网站服务器 - LinuxTone | 运维专家网论坛 - 最棒的Linux运维与开源架构技术交流社区! - Powered by Disc ...

  7. Linux运维企业架构实战系列

    Linux运维企业架构项目实战系列 项目实战1-LNMP的搭建.nginx的ssl加密.权限控制的实现 项目实战2-LVS.nginx实现负载均衡系列 2.1 项目实战2.1-实现基于LVS负载均衡集 ...

  8. Linux运维企业架构项目实战系列

    Linux运维企业架构项目实战系列 项目实战1—LNMP的搭建.nginx的ssl加密.权限控制的实现 项目实战2—LVS.nginx实现负载均衡系列2.1 项目实战2.1—实现基于LVS负载均衡集群 ...

  9. Linux 运维入门到跑路书单推荐

    一.基础入门 <鸟哥的Linux私房菜基础学习篇>:最具知名度的Linux入门书<鸟哥的Linux私房菜基础学习篇>,全面而详细地介绍了Linux操作系统. https://b ...

随机推荐

  1. 第七次java实验报告

    Java实验报告 班级 计科二班 学号20188437 姓名 何磊 完成时间 2019/10/25 评分等级 实验四 类的继承 实验内容 )总票数1000张:(2)10个窗口同时开始卖票:(3)卖票过 ...

  2. 同sql server不同database间的数据访问

    虽未经测试,但是应该是登陆名同时具有此2数据库访问权限啦. select * from [basename].dbo.[tablename] done.

  3. robot-framework 利用evaluate关键字生成随机数

    robot-framework 利用evaluate关键字生成随机数 最近用RF(robot-framework简称)操作MangoDB,需要直接将数据写到数据库里,又不想每次写的数据完全相同,就想到 ...

  4. 【Vue高级知识】细谈Vue 中三要素(响应式+模板+render函数)

    [Vue高级知识]细谈Vue 中三要素(响应式+模板+render函数):https://blog.csdn.net/m0_37981569/article/details/93304809

  5. 设计模式在 Spring 框架中的良好应用

    在开始正文之前,请你先思考几个问题: 你项目中有使用哪些 GOF 设计模式 说一说 GOF 23 种设计模式的设计理念 说说 Spring 框架中如何实现设计模式 假设我是面试官问起了你这些面试题,你 ...

  6. C++序列容器之 vector常见用法总结

    一.关于vector 本文默认读者具有一定的c++基础,故大致叙述,但保证代码正确. vector是一个动态的序列容器,相当于一个size可变的数组. 相比于数组,vector会消耗更多的内存以有效的 ...

  7. Git服务器搭建与配置管理

    Git for Windows TortoiseGit:是一个开放的git版本控制系统的源客户端,支持Winxp/vista/win7.离不开真正的Git(Git for windows版本名字又叫M ...

  8. mysql事务、redo日志、undo日志、checkpoint详解

    转载: https://zhuanlan.zhihu.com/p/34650908 事务: 说起mysql innodb存储引擎的事务,首先想到就是ACID(不知道的请google),数据库是如何做到 ...

  9. CentOS7 安装ffmpeg

    安装EPEL Release,因为安装需要使用其他的repo源,所以需要EPEL支持:yum install -y epel-release#如果出现缺少Code提示,可以: sudo rpm --i ...

  10. 108、如何使用 Secret? (Swarm15)

    参考https://www.cnblogs.com/CloudMan6/p/8068057.html   我们经常要想容器传递敏感信息,最常见的就是密码.比如:   docker run -e MYS ...