Kubernetes技术分析之灰度升级
2015-10-15 18:41
791 查看
【编者的话】Docker的流行激活了一直不温不火的PaaS,随着而来的是各类Micro-PaaS的出现,Kubernetes是其中最具代表性的一员,它是Google多年大规模容器管理技术的开源版本。本系列文章将逐一分析Kubernetes,本文介绍
Kubernetes对灰度升级的支持。
灰度升级(又称灰度发布、灰度更新)是指在黑与白之间,能够平滑过渡的一种发布方式。ABtest就是一种灰度发布方式,让一部用户继续用A,一部分用户开始用B,如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到B上面来。灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现、调整问题,以保证其影响度。
Kubenetes中支持灰度升级,现在我们先通过一个例子演示应用从V1版本灰度升级到V2版本,创建V1版本的Replication Controller ,配置文件my-web-v1-rc.yaml
通过配置文件创建Replication Controller
然后扩容Replication Controller到副本数目4:
现在需要升级V1版本到V2版本,V2版本的Replication Controller配置文件my-web-v2-rc.yaml:
开始灰度升级:
升级开始后,首先根据提供的配置文件创建新的Replication Controller(V2版本),然后每隔10s(通过--update-period设置)逐步增加新的Replication Controller(V1版本)的副本数,逐步减少旧的Replication
Controller的副本数,升级完成后后删除旧的Replication Controller,保留新的Replication Controller,即实现灰度升级。
升级期间通过查询Pod,V2版本的Pod目前相应增加逐渐替换V1版本的Pod,当然这是通过调整Replication Controller的副本数目来控制:
待升级完成,即V2的Pod完全替换V1的Pod,同时V1的Replication Controller也被V2的Replication Controller替换:
如果在升级过程中,发生错误中途退出的时候,可以选择继续升级,继续升级的话Kubernetes能够智能地判断出升级中断之前的阶段。然后紧接着继续执行升级。
另外也可以进行回退,命令如下。
回退的方式实际上就是升级的逆操作,逐步增加旧的Replication Controller(V1版本)的副本数,逐步减少新的Replication Controller(V2版本)的副本数。
https://github.com/kubernetes/
... te.md
==========================================================
作者简介
吴龙辉,现任网宿科技高级运营工程师,致力于云计算PaaS的研究和实践,活跃于CloudFoundry,Docker,Kubernetes等开源社区,贡献代码和撰写技术文档。
邮箱:wulh@chinanetcenter.com/wlh6666@qq.com
Kubernetes对灰度升级的支持。
Kubernetes灰度升级
灰度升级(又称灰度发布、灰度更新)是指在黑与白之间,能够平滑过渡的一种发布方式。ABtest就是一种灰度发布方式,让一部用户继续用A,一部分用户开始用B,如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到B上面来。灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现、调整问题,以保证其影响度。Kubenetes中支持灰度升级,现在我们先通过一个例子演示应用从V1版本灰度升级到V2版本,创建V1版本的Replication Controller ,配置文件my-web-v1-rc.yaml
apiVersion: v1 kind: ReplicationController metadata: name: my-web-v1 spec: selector: app: my-web version: v1 template: metadata: labels: app: my-web version: v1 spec: containers: - name: my-web image: my-web:v1 ports: - containerPort: 80 protocol: TCP
通过配置文件创建Replication Controller
$ kubectl create -f my-web-v1-rc.yaml replicationcontrollers/my-web-v1 $ kubectl get rc my-web-v1 CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS my-web-v1 my-web my-web:v1 app=my-web,version=v1 1
然后扩容Replication Controller到副本数目4:
$ kubectl scale rc my-web-v1 --replicas=4 scaled $ kubectl get pods -l app=my-web NAME READY STATUS RESTARTS AGE my-web-v1-2r7ag 1/1 Running 0 6s my-web-v1-mv9wg 0/1 Running 0 6s my-web-v1-qvi4r 1/1 Running 0 6s my-web-v1-v1w9e 1/1 Running 0 13s
现在需要升级V1版本到V2版本,V2版本的Replication Controller配置文件my-web-v2-rc.yaml:
apiVersion: v1 kind: ReplicationController metadata: name: my-web-v2 spec: selector: app: my-web version: v2 template: metadata: labels: app: my-web version: v2 spec: containers: - name: my-web image: my-web:v2 ports: - containerPort: 80 protocol: TCP
开始灰度升级:
$ kubectl rolling-update my-web-v1 -f my-web-v2-rc.yaml --update-period=10s Creating my-web-v2 At beginning of loop: my-web-v1 replicas: 3, my-web-v2 replicas: 1 Updating my-web-v1 replicas: 3, my-web-v2 replicas: 1 At end of loop: my-web-v1 replicas: 3, my-web-v2 replicas: 1 At beginning of loop: my-web-v1 replicas: 2, my-web-v2 replicas: 2 Updating my-web-v1 replicas: 2, my-web-v2 replicas: 2 At end of loop: my-web-v1 replicas: 2, my-web-v2 replicas: 2 At beginning of loop: my-web-v1 replicas: 1, my-web-v2 replicas: 3 Updating my-web-v1 replicas: 1, my-web-v2 replicas: 3 At end of loop: my-web-v1 replicas: 1, my-web-v2 replicas: 3 At beginning of loop: my-web-v1 replicas: 0, my-web-v2 replicas: 4 Updating my-web-v1 replicas: 0, my-web-v2 replicas: 4 At end of loop: my-web-v1 replicas: 0, my-web-v2 replicas: 4 Update succeeded. Deleting my-web-v1 my-web-v2
升级开始后,首先根据提供的配置文件创建新的Replication Controller(V2版本),然后每隔10s(通过--update-period设置)逐步增加新的Replication Controller(V1版本)的副本数,逐步减少旧的Replication
Controller的副本数,升级完成后后删除旧的Replication Controller,保留新的Replication Controller,即实现灰度升级。
Updating my-web-v1 replicas: 3, my-web-v2 replicas: 1 Updating my-web-v1 replicas: 2, my-web-v2 replicas: 2 Updating my-web-v1 replicas: 1, my-web-v2 replicas: 3 Updating my-web-v1 replicas: 0, my-web-v2 replicas: 4
升级期间通过查询Pod,V2版本的Pod目前相应增加逐渐替换V1版本的Pod,当然这是通过调整Replication Controller的副本数目来控制:
$ kubectl get rc,pods -l app=my-web CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS my-web-v1 my-web my-web:v1 app=my-web,version=v1 2 my-web-v2 my-web my-web:v2 app=my-web,version=v2 2 NAME READY STATUS RESTARTS AGE my-web-v1-2r7ag 1/1 Running 0 1m my-web-v1-mv9wg 1/1 Running 0 1m my-web-v2-bg8ur 1/1 Running 0 18s my-web-v2-qr33c 1/1 Running 0 41s
待升级完成,即V2的Pod完全替换V1的Pod,同时V1的Replication Controller也被V2的Replication Controller替换:
$ kubectl get rc,pods -l app=my-web CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS my-web-v2 my-web my-web:v2 app=my-web,version=v2 4 NAME READY STATUS RESTARTS AGE my-web-v2-785ok 1/1 Running 0 35s my-web-v2-bg8ur 1/1 Running 0 1m my-web-v2-qr33c 1/1 Running 0 1m my-web-v2-y2es3 1/1 Running 0 57s
如果在升级过程中,发生错误中途退出的时候,可以选择继续升级,继续升级的话Kubernetes能够智能地判断出升级中断之前的阶段。然后紧接着继续执行升级。
另外也可以进行回退,命令如下。
$ kubectl rolling-update my-web-v1 my-web-v2 --rollback --image=my-web:v2 Found existing update in progress (my-web-v2), resuming. Found desired replicas.Continuing update with existing controller my-web-v1. At beginning of loop: my-web-v2 replicas: 1, my-web-v1 replicas: 3 Updating my-web-v2 replicas: 1, my-web-v1 replicas: 3 At end of loop: my-web-v2 replicas: 1, my-web-v1 replicas: 3 At beginning of loop: my-web-v2 replicas: 0, my-web-v1 replicas: 4 Updating my-web-v2 replicas: 0, my-web-v1 replicas: 4 At end of loop: my-web-v2 replicas: 0, my-web-v1 replicas: 4 Update succeeded. Deleting my-web-v2 my-web-v2
回退的方式实际上就是升级的逆操作,逐步增加旧的Replication Controller(V1版本)的副本数,逐步减少新的Replication Controller(V2版本)的副本数。
参考
https://github.com/kubernetes/... te.md
==========================================================
作者简介
吴龙辉,现任网宿科技高级运营工程师,致力于云计算PaaS的研究和实践,活跃于CloudFoundry,Docker,Kubernetes等开源社区,贡献代码和撰写技术文档。
邮箱:wulh@chinanetcenter.com/wlh6666@qq.com
相关文章推荐
- RedHat 5.8 安装Oracle 11gR2_Grid集群
- Go 语言 Channel 实现原理精要
- Go语言将支持Android
- 8个你可能不知道的Docker知识
- MySQL slave_net_timeout参数解决的一个集群问题案例
- Redis 集群搭建和简单使用教程
- Golang实现的聊天程序服务端和客户端代码分享
- Windows Server 2003 下配置 MySQL 集群(Cluster)教程
- 在Docker中自动化部署Ruby on Rails的教程
- tomcat6_apache2.2_ajp 负载均衡加集群实战分享
- 搭建基于Docker的PHP开发环境的详细教程
- 利用OpenVSwitch在多台主机上部署Docker的教程
- ubuntu14.04+docker的安装及使用
- Docker 清理命令集锦
- GO语言类型转换和类型断言实例分析
- Golang学习笔记(三):控制流
- Golang学习笔记(二):类型、变量、常量
- Go语言实现的最简单数独解法
- Golang中的sync.WaitGroup用法实例
- Go实现比较时间大小