一、滚动更新

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

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. aws 基于延迟策略配置dns故障切换

    前提:由于国内访问首尔地区经常出现不稳定情况,现将请求从nginx(sz)转发到nginx(hk)再转发到首尔地区,在基于不改变nginx(seoul)的配置的前提下,引入aws的延迟策略,同时保证国 ...

  2. BUUOJ reverse 不一样的flag

    不一样的flag 是不是做习惯了常规的逆向题目?试试这道题,看你在能不能在程序中找到真正的flag!注意:flag并非是flag{XXX}形式,就是一个’字符串‘,考验眼力的时候到了! 注意:得到的 ...

  3. Spark中分布式使用HanLP(1.7.0)分词示例

    HanLP分词,如README中所说,如果没有特殊需求,可以通过maven配置,如果要添加自定义词典,需要下载“依赖jar包和用户字典". 分享某大神的示例经验: 是直接"java ...

  4. 从入门到自闭之Python名称空间

    名称空间: 内置空间:python解释器自带的一块空间 全局空间:py文件中顶格写的就是全局空间 局部空间:函数体中就是局部空间 加载顺序: 内置空间 全局空间 局部空间 # def func(): ...

  5. idea 新建maven项目时,避免每次都需要指定自己的maven目录

    01 .File->Other Settings -> Settings for New Project 02. 将Maven home directory目录修改成我们自己安装Maven ...

  6. Dubbo消费方服务调用过程源码分析

    参考:dubbo消费方服务调用过程源码分析dubbo基于spring的构建分析Dubbo概述--调用过程dubbo 请求调用过程分析dubbo集群容错机制代码分析1dubbo集群容错策略的代码分析2d ...

  7. Postgresql 大小版本升级

    文章结构如下: Postgresql是一个非常活跃的社区开源项目,更新速度很快,每一次版本的更新都会积极的修复旧版本的BUG,性能上也会有不同幅度的提升.10之前的版本由三部分组成,10开始只有两部分 ...

  8. 分布式的几件小事(四)dubbo负载均衡策略和集群容错策略

    1.dubbo负载均衡策略 ①random loadbalance 策略 默认情况下,dubbo是random loadbalance 随机调用实现负载均衡,可以对provider不同实例设置不同的权 ...

  9. VUE 从零开始 学习笔记 一

    最近刚跳到一个新公司 不是很忙 决定系统的学习一下VUE这个前端框架 参考官方API 好了 废话不多说 开始了 首先 说一下吧 现在很火的主流三大前端框架 Vue,Angular.React, 为什么 ...

  10. 【版本控制工具】 Git进阶1

    一.Git常用命令 Git中的很多命令与Linux相同(比如修改,查询,编辑,移动等),这里可以参考我之前的一篇文章https://www.cnblogs.com/ywb-articles/p/105 ...