前言

软件世界比以往任何时候都更快。为了保持竞争力,需要尽快推出新的软件版本,而不会中断活跃用户访问,影响用户体验。越来越多企业已将其应用迁移到 Kubernetes。

在 Kubernetes 中有几种不同的方式发布应用,所以为了让应用在升级期间依然平稳提供服务,选择一个正确的发布策略就非常重要了,本篇文章将讲解在 Kubernetes 使用蓝绿更新的方式更新镜像。

原理

蓝绿发布是版本 1 与版本 2 会同时存在,通过控制 Service 来决定使用具体哪一个版本,也称为红黑部署。蓝绿发布与滚动更新不同,版本 2 (绿) 与版本 1()一起部署,在测试新版本满足要求后,然后更新 Service 对象,通过替换 label selector 中的版本标签来将流量发送到新版本,更新过程如下图所示

实践

使用 Kubernetes 原生方式升级应用

准备

image

bebullish/demo:v1
bebullish/demo:v2

deployment-v1

apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-dp-v1
spec:
selector:
matchLabels:
app: demo
version: v1
replicas: 3
template:
metadata:
labels:
app: demo
version: v1
spec:
containers:
- name: demo
image: bebullish/demo:v1
ports:
- containerPort: 8080

deployment-v2

apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-dp-v2
spec:
selector:
matchLabels:
app: demo
version: v2
replicas: 3
template:
metadata:
labels:
app: demo
version: v2
spec:
containers:
- name: demo
image: bebullish/demo:v2
ports:
- containerPort: 8080

service

apiVersion: v1
kind: Service
metadata:
name: demo-service
spec:
selector:
app: demo
version: v1 # 通过更改 version 来控制流量走向
type: LoadBalancer
ports:
- port: 80
targetPort: 8080
protocol: TCP

将上述 deployment-v1 以及 service 保存为 yaml 文件,使用 kubectl apply -f 命令创建 yaml 资源,等待创建成功后,使用 kubectl get svc 获取 EXTERNAL-IP。

测试

如果使用浏览器测试的话,你会发现每次调用都会返回同一个 pod 的名字,那是因为浏览器发出的请求包含 keepAlive,所以需要使用 curl 来保证每次发出的请求都是重新创建的。

curl -X GET http://${EXTERNAL-IP}

升级

将上述 deployment-v2 保存为 yaml 文件,使用 kubectl apply -f 命令创建 yaml 资源,切换流量之前先执行命令,以便查看镜像更新过程

while true; do curl -X GET http://${EXTERNAL-IP} ; done

等待 deployment-v2 创建成功后,通过将 service 的 version 值改为 v2 来切换流量

kubectl edit service demo-service

查看日志

请求流量

结论

首先可以发现在更新过程中,程序保持一直可用的状态,v2 版本部署成功之后,所有请求还是 v1 版本,当流量切换后,立刻出现 v2 版本的日志,并且不会出现 v1 版本的日志,说明流量是一次性切换的,如果需要回滚只需要将流量切回 v1 版本即可。

使用 CODING CD 方式升级应用

创建服务

service

apiVersion: v1
kind: Service
metadata:
name: demo-service
spec:
selector:
createBy: demo-service # 这里填写的标签,会被添加到对应的 ReplicaSet 中
type: LoadBalancer
ports:
- port: 80
targetPort: 8080
protocol: TCP

这里注意,service 创建之后应不会匹配到任何资源,即 endpoint 为空,而在后面执行部署流程时会为 ReplicaSet 添加 label createBy: demo-service ,从而决定流量走向。

部署成功之后可以看到 demo-service

配置制品

使用 docker 官方镜像需要以 docker.io 开头

配置 yaml 及绑定制品

replicaSet

apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: demo-rs
spec:
replicas: 3
selector:
matchLabels:
app: demo
template:
metadata:
labels:
app: demo
spec:
containers:
- image: docker.io/bebullish/demo
name: demo
ports:
- containerPort: 8080

阶段中选择 部署(Manifest) ,输入上述 yaml 文件(目前发布策略选项仅支持 ReplicaSet),这里需要把镜像的版本删除掉,在需要绑定的制品选择之前配置的制品。这样配置之后,每次执行的时候版本是动态传入的。

蓝绿(红黑)发布配置

在下方勾选让 CODING 部署控制台管理入口流量,然后选择 demo-service 所在的命名空间(我这里是在 marlon 这个命名空间下),然后选择 demo-service ,策略选择 Red/Black(Blue/Green),保存即可。

发布制品

选择应用和部署流程,输入版本 v1。

查看结果

等待一小段时间后,就可以在部署控制台中看到发布的资源了。

更新镜像版本

再次执行发布,版本输入 v2。

更新原理

基于 CODING CD 的蓝绿发布和一般的蓝绿发布略有不同,一旦 v2 版本的 pod 处于就绪状态后,他就会立即获得流量,而当所有的 v2 版本的 pod 处于就绪状态后,会禁用 v1 版本的 pod,此时所有流量会打到 v2 版本上,从而完成更新。

注意:基于 CODING CD 的蓝绿发布会出现 v1 版本和 v2 版本同时获得流量的情况,具体取决于 pod 的就绪探针,v2 版本的 pod 一旦就绪,那么它就会获得流量,所以需要合理设计就绪探针,尽量减少 v1 版本和 v2 版本同时存在的时间差。

总结

使用 Kubernetes 原生方式实现蓝绿更新步骤较多,但也容易出错,推荐使用 coding.net 提供的 CD 功能,配置一次,永久使用。不仅降低了人工成本,提高容错率,还提供了非常丰富的 CD 功能,推荐使用哦~

参考文章

TrafficManagement

RolloutStrategies

CODING 持续部署

【腾讯云原生】云说新品、云研新术、云游新活、云赏资讯,扫码关注同名公众号,及时获取更多干货!!

持续部署入门:基于 Kubernetes 实现蓝绿发布的更多相关文章

  1. 附032.Kubernetes实现蓝绿发布

    蓝绿发布原理 蓝绿发布本质上是希望能优雅无误的迭代应用,以便于使应用平稳提供服务.通常是不停老版本的同时对新版本进行先发布,然后确认无误后进行流量切换,即并行部署. Kubernetes中可以通过de ...

  2. istio1.0 实现蓝绿发布(未完成)

    istio1.0 实现蓝绿发布 环境: 192.168.0.91 master 192.168.0.92 node 第一步:安装k8s集群,参照:https://www.cnblogs.com/eff ...

  3. 一文读懂蓝绿发布、A/B 测试和金丝雀发布的优缺点

    作者 | 扬少 背景 目前,业界已经总结出了几种常见的服务发布策略来解决版本升级过程中带来的流量有损问题.本文首先会对这些普遍的发布策略进行简单的原理解析,最后结合阿里云的云原生网关对这些发布策略进行 ...

  4. 手把手教你在 TKE 集群中实现简单的蓝绿发布和灰度发布

    概述 如何在腾讯云 Kubernetes 集群实现蓝绿发布和灰度发布?通常要向集群额外部署其它开源工具来实现,比如 Nginx Ingress,Traefik 等,或者让业务上 Service Mes ...

  5. 持续部署入门:基于 Kubernetes 实现滚动发布

    前言 软件世界比以往任何时候都更快.为了保持竞争力,需要尽快推出新的软件版本,而不会中断活跃用户访问,影响用户体验.越来越多企业已将其应用迁移到 Kubernetes. 在 Kubernetes 中有 ...

  6. 部署一个基于python语言的web发布环境

    ---恢复内容开始--- 1) 一门面向对象的语言 2)拥有丰富的库 3)可移植性 4)免费.开源 5)简单易易学 可做软件开发.人工智能.web开发等等 部署流程: Cnetos7.5+Nginx+ ...

  7. 蓝绿部署、A/B测试以及灰度发布(金丝雀发布)

    过去的10多年里,很多大公司都在使用蓝绿部署,安全.可靠是这种部署方式的特点.蓝绿部署虽然算不上”Sliver Bullet“,但确实很实用.在有关于“微服务”.“DevOps”.“Cloud-nat ...

  8. 蓝绿部署、红黑部署、AB测试、灰度发布、金丝雀发布、滚动发布的概念与区别(转)

    出处:https://www.baidu.com/link?url=QjboallwNm_jxcL3fHG57wEakiBfAs_3-TChTGu1eBXstlHEsGBc-NDA7AKTqsiroB ...

  9. 蓝 / 绿部署(Blue/Green) 金丝雀发布(Canary Release) 功能标记(Feature Flagging)

    https://www.cnblogs.com/apanly/p/8784096.html 最终,我选择了 GraphQL 作为企业 API 网关 蓝 / 绿部署(Blue/Green) 金丝雀发布( ...

随机推荐

  1. hashCode竟然不是根据对象内存地址生成的?还对内存泄漏与偏向锁有影响?

    起因 起因是群里的一位童鞋突然问了这么问题: 如果重写 equals 不重写 hashcode 会有什么影响? 这个问题从上午10:45 开始陆续讨论,到下午15:39 接近尾声 (忽略这形同虚设的马 ...

  2. Java 的几种运算符

    一.原码.反码.补码 1 用二进制表示 00000001 -1 如果只变符号位(原码) 10000001 那么 1 + -1 = 10000010 = -2 -1 的反码 11111110 除去符号位 ...

  3. 7、Prototype 原型模式 通过复制创造实例 创造型模式

    2020-07-19 发哥讲 发哥讲 其实上一节的末尾讲到如何去生成对象,其中有一个关于clone的,这其实就是Prototype原型模式. 通过克隆(拷贝)的方式生成对象 1.了解Prototype ...

  4. MySQL回表查询

    一.MySQL索引类型 1.普通索引:最基本的索引,没有任何限制 2.唯一索引(unique index):索引列的值必须唯一,但是允许为空 3.主键索引:特殊的唯一索引,但是不允许为空,一般在建表的 ...

  5. 2020重新出发,JAVA语言,什么是JAVA?

    @ 目录 什么是 java? JAVA三大体系 Java SE Java EE JavaME java的主要特性和优势 1. 面向对象 2. 平台无关性 3. 可移植性 4. 简单性 5. 解释执行 ...

  6. python中1 is True 的结果为False,is判断与==判断的区别

    python中1 is True 的结果为False,而1 == True的结果为True. python中True的数值就是1,那为什么1 is True 的结果为False呢? 因为is判断和== ...

  7. CPF 入门教程 - 样式和动画(三)

    CPF NetCore跨平台UI框架 系列教程 CPF 入门教程(一) CPF 入门教程 - 数据绑定和命令绑定(二) CPF 入门教程 - 样式和动画(三) 用样式可以对内部元素进行批量设置属性. ...

  8. kafka-clients 1.0 内部请求接口文档

    AddOffsetsToTxnRequest version:0 name type defaultValue docString transactional_id STRING null The t ...

  9. 图片降噪(Scipy)

    以登月图片为例,通过使用Scipy 傅立叶变换,实现图片消噪 scipy.fftpack模块用来计算快速傅里叶变换速度比传统傅里叶变换更快,是对之前算法的改进图片是二维数据,注意使用fftpack的二 ...

  10. Android Studio 代码回退

    1.VCS–Local History–Show History 或者 这个按钮 2.代码操作记录出现了,选定我们操作的一个历史阶段 3.点击左上角的按钮(revert),代码回退成功