一、前言

 上一篇文章中对yaml文件格式进行了解,并对k8s中各种主要资源通过yaml创建时的定义模板。接来下就进一步学习k8s的各种特点。并应用在示例中。

 接下来先实现.Net Core Api程序版本滚动升级、回滚,并在过程中进一步的对k8s进行了解

二、滚动升级

 1、推送新版本服务镜像v3到docker hub。  

  

 2、实现k8s中滚动升级:

  新建k8sweb-dep.yaml文件,用于创建Deployment资源:

apiVersion: apps/v1
kind: Deployment #定义Kubernetes资源的类型为Deployment
metadata:
name: k8sweb-deployment #定义资源的名称
spec:
replicas: 3 #定义运行Pod数量
selector:
matchLabels: #定义该部署匹配哪些Pod
name: k8sweb #定义Pod名称
template:
metadata: #定义指定Pod的模板
labels: #根据模板创建的Pod会被贴上该标签,与上面的matchLabels对应
name: k8sweb
spec:
containers: #容器定义
- name: k8sweb #容器名
image: cwsheng/k8sdemoweb:latest #镜像地址
ports:
- containerPort: 80
imagePullPolicy: IfNotPresent #不是最新则拉取

  表面上本次Deployment指定创建3个Pod、1个Deployment资源,实际上在Deployment和Pod中间还有ReplicaSet。

  Deployment 实际上一个两层控制器,Deployment 控制 ReplicaSet,ReplicaSet 控制 Pod。ReplicaSet 有版本区分,滚动更新的能力就是基于 ReplicaSet 的版本来实现。如下图:

  

 a)执行命令:

kubectl apply -f k8sweb-dep.yaml

 b)查看 deployment状态:

kubectl get deployments

  结果如下:

NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
k8sweb-deployment 3/3 3 3 54m
  • READY:当前处于 Running 状态的 Pod 的个数/用户期望的 Pod 个数(配置文件设置的 replicas 值);
  • UP-TO-DATE:当前处于最新版本的 Pod 个数(Pod 的 Spec 部分与 Deployment 里 Pod 模板里定义的完全一致),在滚动更新过程中会有不一致的阶段;
  • AVAILABLE:当前可用的 Pod 个数。

 c)查看上图中说描述的ReplicaSet资源:

kubectl describe replicaset

  结果如下:可以看出:Pod是由ReplicaSet控制着(创建、删除)、ReplicaSet则由Deployment控制 。结果和上图相同

  可发现:ReplicaSet 的名字是由 Deployment 名字 + 随机字符串,Pod 的名字是由 ReplicaSet 名字 + 随机字符串

  

 d)滚动更新

  该更新实际上是更新Pod中镜像版本。

  修改deployment文件中镜像文件进行更新,修改文件名加上版本号(k8s-dep-v3.yaml)

apiVersion: apps/v1
kind: Deployment #定义Kubernetes资源的类型为Deployment
metadata:
name: k8sweb-deployment #定义资源的名称
spec:
replicas: 3 #定义运行Pod数量
selector:
matchLabels: #定义该部署匹配哪些Pod
name: k8sweb #定义Pod名称
template:
metadata: #定义指定Pod的模板
labels: #根据模板创建的Pod会被贴上该标签,与上面的matchLabels对应
name: k8sweb
spec:
containers: #容器定义
- name: k8sweb #容器名
image:cwsheng/k8sdemoweb:v3 #镜像地址
ports:
- containerPort: 80
imagePullPolicy: IfNotPresent #不是最新则拉取

  重新执行命令

kubectl apply -f k8s-dep-v3.yaml --record

  --record的作用是将当前命令记录到 revision 记录中,这样我们就可以知道每个 revison 对应的是哪个配置文件。

  查看事件看资源如何变化:

kubectl describe deployment k8sweb-deployment

  

  Deployment 控制器根据修改后的 Pod 模板,创建新的 ReplicaSet(k8sweb-deployment-6594dd8ff7),Pod 数默认是 0,然后老的 ReplicaSet (k8sweb-deployment-954845689)Pod 数逐渐减少,

  新的 ReplicaSet 的 Pod 数逐渐增加,两个过程交替进行,新的增加一个,老的减少一个,直到全部升级完成。

  查看ReplicaSet状态:旧的ReplicaSet的Pod 已经缩减为 0 个,新的 ReplicaSet 的 Pod 扩展为 3 个,每次配置修改重新部署都可能创建一个新的 ReplicaSet

PS F:\coding\project\k8s.demo\k8s> kubectl get rs
NAME DESIRED CURRENT READY AGE
k8sweb-deployment-6594dd8ff7 0 0 0 2m14s
k8sweb-deployment-954845689 3 3 3 116s

三、回滚升级

 回滚操作前,需要知道当前的版本记录情况:

 rollout 命令:

命令 说明
history 显示 rollout 历史
pause 标记提供的 resource 为中止状态
resume 继续一个停止的 resource
status 显示 rollout 的状态
undo 撤销上一次的 rollout

 a)通过命令:kubectl rollout history 查看历史版本。

PS F:\coding\project\k8s.demo\k8s> kubectl rollout history deployment.apps/k8sweb-deployment
deployment.apps/k8sweb-deployment
REVISION CHANGE-CAUSE
1 kubectl.exe apply --filename=k8s-dep.yaml --record=true
2 kubectl.exe apply --filename=k8s-dep-v3.yaml --record=true

  CHANGE-CAUSE 为命令内容。--record=true才会存储,否则为空:<none> 

 b)通过命令:kubectl rollout undo 将deployment回滚到指定的版本

#指定恢复到上一个版本
kubectl rollout undo deployment/k8sweb-deployment #恢复到指定版本1
kubectl rollout undo deployment/k8sweb-deployment --to-revision=1

 c)配置历史记录保存数量

  可以在 Deployment 配置文件中通过 revisionHistoryLimit 属性增加 revision 数量。

#……
spec:
replicas: 3
revisionHistoryLimit: 10 #Deployment revision history存储在它控制的ReplicaSets中。默认保存记录5个
strategy: #设置更新策略
rollingUpdate: #RollingUpdate更新设置
maxSurge: 25% #指定可以超过期望的Pod数量的最大数量。可以是一个绝对值(例如5)或者是期望的Pod数量的百分比(例如10%)。当MaxUnavailable为0时该值不可以为0。通过百分比计算的绝对值向上取整。默认值是1。
maxUnavailable: 25% #指定在升级过程中不可用Pod的最大数量。该值可以是一个绝对值(例如5),也可以是期望Pod数量的百分比(例如10%)。通过计算百分比的绝对值向下取整.
                     #如果.spec.strategy.rollingUpdate.maxSurge 为0时,这个值不可以为0。默认值是1。
type: RollingUpdate #Recreate:重建式更新(首先删除现有的Pod对象,然后由控制器基于新模板重新创建新版本资源对象),rollingUpdate:滚动更新
#……

在配置时,用户还可以使用Deployment控制器的spec.minReadySeconds属性来控制应用升级的速度。新旧更替过程中,新创建的Pod对象一旦成功响应就绪探测即被认为是可用状态,然后进行下一轮的替换。
而spec.minReadySeconds能够定义在新的Pod对象创建后至少需要等待多长的时间才能会被认为其就绪,在该段时间内,更新操作会被阻塞。

总结:

 本次对k8s中Deployment、ReplicaSet、Pod之间的关系有了更深的理解,并通过配置实现了滚动升级、回滚的效果。后续还将继续对k8s的其他特性继续学习。

入门Kubernetes - 滚动升级/回滚的更多相关文章

  1. docker swarm实现java项目的发布/滚动更新/回滚/镜像管理

    使用docker swarm滚动更新java项目,部署集群,这一切的前提是使用Jenkins+maven进行项目打包,分发等功能 具体可以参考我的另外三篇文章 https://www.cnblogs. ...

  2. Swarm平滑升级回滚

    #滚动更新创建服务: docker service create --name my_web --replicas=5 nginx:1.12更新为1.14 docker service update ...

  3. Kubernetes:Pod 升级、回滚

    本篇主要讨论如何实现滚动更新和回滚,任意更换版本并且回滚以前的版本(版本更新),而下一章会讨论到 Pod 缩放,根据机器资源自动拓展和收缩应用(自动扩容实例). 本文为作者的 Kubernetes 系 ...

  4. kubectl rollout回滚和autoscale自动扩容

    系列目录 kubernetes 滚动升级 Kubernetes 中采用ReplicaSet(简称RS)来管理Pod.如果当前集群中的Pod实例数少于目标值,RS 会拉起新的Pod,反之,则根据策略删除 ...

  5. K8S服务滚动升级

    对于Kubernetes集群来说,一个service可能有多个pod,滚动升级(Rolling update)就是指每次更新部分Pod,而不是在同一时刻将该Service下面的所有Pod shutdo ...

  6. kubernetes云平台管理实战: 滚动升级秒级回滚(六)

    一.nginx保证有两个版本 1.查看当前容器运行nginx版本 [root@k8s-master ~]# kubectl get pod -o wide NAME READY STATUS REST ...

  7. kubernetes Pod的升级与回滚

    一:Deployment的升级 1.通过kubectl set image命令为Deployment设置新的镜像名称kubectl set image deployment/nginx-deploym ...

  8. kubernetes deployment升级和回滚

    a.创建deployment pod kubectl run mynginx --image=docker.io/nginx: --record 准备svc文件 apiVersion: v1 kind ...

  9. 浅入Kubernetes(12):Deployment 的升级、回滚

    目录 更新 上线 会滚 缩放 Deployment 直接设置 Pod 水平自动缩放 比例缩放 暂停 Deployment 上线 本篇内容讨论 Pod 的更新和回滚,内容不多. 更新 打开 https: ...

随机推荐

  1. 神奇的不可见空格<200b>导致代码异常

    故事是这样发生的,在做一个JSON对象转化的时候,出现了转化异常:刚开始还是以为是格式错误,后来一步步排除,才发现是不可见空格<200b>导致的解析异常 出现 使用Typora编写文字时, ...

  2. (Dubbo架构)基于MDC+Filter的跨应用分布式日志追踪解决方案

    在单体应用中,日志追踪通常的解决方案是给日志添加 tranID(追踪ID),生成规则因系统而异,大致效果如下: 查询时只要使用 grep 命令进行追踪id筛选即可查到此次调用链中所有日志,但是在 du ...

  3. gdb调试coredump(使用篇)

    gdb调试coredump(使用篇) 看到一个非常好的介绍coredump的文章,做个记录, 参考链接: https://blog.csdn.net/sunxiaopengsun/article/de ...

  4. 什么是环境变量,Linux环境变量及作用 echo

    什么是环境变量,Linux环境变量及作用 < Linux命令的执行过程是怎样的?(新手必读)Linux PATH环境变量是什么,有什么用?(入门必读) > <Linux就该这么学&g ...

  5. CentOS7中下载RPM及其所有的依赖包

    CentOS7中下载RPM及其所有的依赖包 转载beeworkshop 最后发布于2019-09-28 07:43:40 阅读数 1096  收藏 展开 利用 Downloadonly 插件下载 RP ...

  6. Ubuntu 18.04安装 Adob Flash player

    1.Ctrl + Alt + T 打开命令终端,启用Canonical Partners Repository存储库 (最新的Flash插件位于Canonical Partners的存储库中,默认情况 ...

  7. redis 和 mysql 的主从复制

    1. mysql主从复制 (1) 为什么要做主从复制? 1.在业务复杂的系统中,有这么一个情景,有一句sql语句需要锁表,导致暂时不能使用读的服务,那么就很影响运行中的业务,使用主从复制,让主库负责写 ...

  8. 聊聊 Spring 的 XML Schema 扩展机制的使用方式

    前言 在当前Java生态,Spring算的上是最核心的框架,所有的开发组件想要得到大范围更便捷的使用,都要和Spring进行整合,比如我们熟知的Mybatis.Dubbo等,以及内部封装的各类组件包括 ...

  9. Django(46)drf序列化类的使用(ModelSerializer)

    前言 我们上篇文章使用到了Serializer类,可能有小伙伴说太过复杂,那么本篇就为大家带来更加简便的序列化类ModelSerializer ModelSerializer 先来看下ModelSer ...

  10. [论文阅读笔记] Unsupervised Attributed Network Embedding via Cross Fusion

    [论文阅读笔记] Unsupervised Attributed Network Embedding via Cross Fusion 本文结构 解决问题 主要贡献 算法原理 实验结果 参考文献 (1 ...