前言

今天来说一说,在 KubeSphere 中两个 " 小姐姐 " 如何来回切换,这是什么意思哩?其实就是互联网产品中常用的灰度发布方式。

互联网产品需要快速迭代上线,既要保证新功能运行正常,又要保证质量,一旦出现问题可以很快控制局面,就需要设计一套灰度发布系统。用大白话讲就是某个 APP 的新版本已经开发完成了,而老版本用户正在正常使用着,这个时候要是直接上线新版本,那么所有的用户都会用新版本,但是这种情况下,一旦出现问题,将导致所有的用户都不可用,所以会有策略的挑选一部分用户先用新版本,即使出现问题,也只是一小部分用户,方便回滚到旧版本,提升用户良好的体验性。

概述

灰度发布(又名金丝雀发布)是指在黑与白之间,能够平滑过渡的一种发布方式。在其上可以进行 A/B testing,即让一部分用户继续用产品特性 A,一部分用户开始用产品特性 B,如果用户对 B 没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到 B 上面来。灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现、调整问题,以保证其影响度。

我们假设这个 A/B,就是 A 小姐姐和 B 小姐姐。

KubeSphere 的微服务治理功能

KubeSphere 基于 Istio 微服务框架提供可视化的微服务治理功能,如果您在 Kubernetes 上运行和伸缩微服务,您可以为您的分布式系统配置基于 Istio 的微服务治理功能。KubeSphere 提供统一的操作界面,便于您集成并管理各类工具,包括 Istio、Envoy 和 Jaeger 等。

流量治理

  • 金丝雀发布提供灵活的灰度策略,将流量按照所配置的比例转发至当前不同的灰度版本
  • 蓝绿部署支持零宕机部署,让应用程序可以在独立的环境中测试新版本的功能和特性
  • 流量镜像模拟生产环境,将实时流量的副本发送给被镜像的服务
  • 熔断机制支持为服务设置对单个主机的调用限制

在 KubeSphere 中应用治理可以以可插拔式方式开启。开启后如下:

准备工作

创建一个 SpringBoot 的项目用于测试,如下 pom.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>com.pkulaw</groupId>
<artifactId>ServiceA</artifactId>
<version>1.0-SNAPSHOT</version> <name>ServiceA</name> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
<docker.image.prefix>springboot</docker.image.prefix>
</properties> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency> <!-- 引入Actuator监控依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency> <dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency> <dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.0</version>
</dependency>
</dependencies> <build>
<finalName>ServiceA</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

controller 代码:

@RestController
@Slf4j
public class CommonController { /**
* 返回A/B小姐姐图片
* @param response
* @throws IOException
*/
@RequestMapping(method = RequestMethod.GET, produces = "image/jpeg")
public void getImage2(HttpServletResponse response) throws IOException {
ClassPathResource classPathResource = new ClassPathResource("images/B.jpg");
InputStream inputStream = classPathResource.getInputStream();
//将InputStream 转 File
File file = asFile(inputStream);
FileCopyUtils.copy(new FileInputStream(file), response.getOutputStream());
response.setHeader("Content-Type", "application/octet-stream");
} /**
* InputStream To File
* @param in
* @return
* @throws IOException
*/
public static File asFile(InputStream in) throws IOException {
File tempFile = File.createTempFile("test", ".tmp");
tempFile.deleteOnExit();
FileOutputStream out = new FileOutputStream(tempFile);
IOUtils.copy(in, out);
return tempFile;
}
}

注:直接通过接口返回一张图片。

项目目录结构如下:

镜像构建

在 KubeSphere 中有个超炫的功能叫镜像构建器,镜像构建器(Image Builder)是将代码或者制品制作成容器镜像的工具。您可以通过简单的设置将制品或代码直接制作成容器镜像,无需 Dockerfile 文件。

上面图片来自 KubeSphere 镜像构建官方介绍。

3.3.0 版本中就长下面这个样子:

harbor 中新建项目

创建镜像构建器

gitlab 仓库秘钥和 harbor 镜像服务提前设置好。镜像名称为 service-a/service-a,镜像标签设置为 v1。

创建成功后,开始运行

构建成功如上所示。

harbor 中查看 v1 标签的镜像

以上就是 v1 版本由来的整个过程,我们简称为 A 小姐姐。

接下来制作 B 小姐姐,新建一个代码分支为 release, 调整代码返回为 B 小姐姐。

构建 v2 版本的镜像,也就是我们的 B 小姐姐。

项目网关

KubeSphere 项目中的网关是一个 NGINX Ingress 控制器。KubeSphere 内置的用于 HTTP 负载均衡的机制称为应用路由 (Ingress 路由规则),它定义了从外部到集群服务的连接规则。如需允许从外部访问服务,用户可创建路由资源来定义 URI 路径、后端服务名称等信息。

KubeSphere 除了提供项目范围的网关外,还提供集群范围的网关,使得所有项目都能共享全局网关。

在 KubeSphere 中开启项目网关以从外部访问服务和路由。

自制应用

在 KubeSphere 中实现金丝雀发布,必须先开启应用治理,且必须有一个可用的应用。

KubeSphere 支持基于模板的应用和自制应用。基于模板的应用创建自 KubeSphere 应用商店或应用模板,自制应用由用户自定义。这里我们以自制应用为例。

创建自制应用

创建服务

选择无状态服务

容器端口为 ServiceA 服务的端口 7777

在这里添加路由规则后,KubeSphere 会自动帮我们创建 ingress 路由规则。

创建成功后如下:

应用路由下会自动生成 ingress 路由规则,如下:

配置本地 hosts, 如:192.168.0.156 servicea.com

点击访问服务,立即返回 A 小姐姐,如下:

金丝雀发布

创建金丝雀发布任务

可以指定流量进行分配,也可以指定请求参数

创建成功,查看任务状态

默认 v1 和 v2 各占 50% 流量。

请求服务来查看流量走向,v1 和 v2 各占 50% 流量

拖动滑块设置发送给 v1 版本的流量比例和发送给 v2 版本的流量比例。

总结

利用 KubeSphere 我们可以很轻松的实现金丝雀发布,缓慢地向一小部分用户推送变更,从而将版本升级的风险降到最低。

本文由博客一文多发平台 OpenWrite 发布!

使用 KubeSphere 实现微服务的灰度发布的更多相关文章

  1. Taurus.MVC 微服务框架 入门开发教程:项目部署:4、微服务应用程序发布到Docker部署(上)。

    系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 开源地址:https://github.com/cyq1162/Taurus.MVC 本系列第一篇:Tauru ...

  2. Taurus.MVC 微服务框架 入门开发教程:项目部署:5、微服务应用程序发布到Docker部署(下)。

    系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 开源地址:https://github.com/cyq1162/Taurus.MVC 本系列第一篇:Tauru ...

  3. spring cloud微服务项目的发布与部署

    普通的javaweb项目要发布的话,一般就三种方法: 1.把项目直接放在tomcat的webApps下启动tomcat即可. 2.把项目打包成war包放在webApps下,启动tomcat,自动解压w ...

  4. Blazor+Dapr+K8s微服务之事件发布订阅

    我们要实现的是:在blazorweb服务中发布一个事件,并传递事件参数,然后在serviceapi1服务中订阅该事件,接收到blazorweb服务中发布的事件和参数. 1         在blazo ...

  5. Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单。

    前方: 开源地址:https://github.com/cyq1162/Taurus.MVC 上篇文章介绍过:工业制造行业的低代码开发平台思维架构图 规划中涉及到了微服务,近些天经过努力和不断的代码与 ...

  6. Istio 太复杂?KubeSphere基于Ingress-Nginx实现灰度发布

    在 Bookinfo 微服务的灰度发布示例 中,KubeSphere 基于 Istio 对 Bookinfo 微服务示例应用实现了灰度发布.有用户表示自己的项目还没有上 Istio,要如何实现灰度发布 ...

  7. springcloud灰度发布实现方案

    Nepxion Discovery是一款对Spring Cloud Discovery服务注册发现.Ribbon负载均衡.Feign和RestTemplate调用.Hystrix或者阿里巴巴Senti ...

  8. Spring Cloud灰度发布之Nepxion Discovery

    <蓝绿部署.红黑部署.AB测试.灰度发布.金丝雀发布.滚动发布的概念与区别> 最近公司项目在做架构升级,升级为 Spring Cloud,我们希望能够做到服务的灰度发布,根据访问量逐渐切换 ...

  9. Game On Serverless:SAE 助力广州小迈提升微服务研发效能

    作者:洛浩 小迈于 2015 年 1 月成立,是一家致力以数字化领先为优势,实现业务高质量自增长的移动互联网科技公司.始终坚持以用户价值为中心,以数据为驱动,为用户开发丰富的工具应用.休闲游戏.益智. ...

  10. Istio最佳实践:在K8s上通过Istio服务网格进行灰度发布

    Istio是什么? Istio是Google继Kubernetes之后的又一开源力作,主要参与的公司包括Google,IBM,Lyft等公司.它提供了完整的非侵入式的微服务治理解决方案,包含微服务的管 ...

随机推荐

  1. python报错:pyglet.canvas.xlib.NoSuchDisplayException: Cannot connect to "None"

    运行python代码报错: 问题发现: 问题其实十分的狗血,这个代码是在服务器上运行的,运行之前其实并没有看具体的代码情况,git clone 下载下来就直接运行了,原来这个代码需要进行图片绘制,说直 ...

  2. ubuntu系统升级软件sudo apt upgrade后GPU崩溃报错,显示驱动版本不匹配——ubuntu系统版本过低导致的问题

    ubuntu系统升级软件(sudo apt upgrade)后,GPU崩溃报错,查看系统日志: Aug 2 06:25:02 lcwt rsyslogd: [origin software=" ...

  3. 在Vue3中如何为路由Query参数标注类型

    前言 最近发布了一款支持IOC容器的Vue3框架:Zova.与以往的OOP或者Class方案不同,Zova在界面交互层面仍然采用Setup语法,仅仅在业务层面引入IOC容器.IOC容器犹如一把钥匙,为 ...

  4. .NET电子邮件高效处理解决方案

    前言 在日常软件开发中,电子邮件处理是一个不可或缺的功能,无论是用户注册验证.通知推送还是日常的业务沟通,都离不开电子邮件的支持.今天大姚给大家分享2款.NET开源.高效.强大的.NET电子邮件处理库 ...

  5. vue-表单与v-model

    使用 v-model 后,表羊控件显示的值只依赖所绑定的数据,不再关心初始化时的 value 属性,对于 textarea></textarea> 之间插入的值,也不会生效. 使用 ...

  6. Meissel_Lehmer模板

    复杂度 \(O(n^\frac 23)\),计算 \(1\sim n\) 的素数个数 #define div(a, b) (1.0 * (a) / (b)) #define half(x) (((x) ...

  7. 屏蔽RaiDrive的广告

    RaiDrive 广告域名:ads.raidrive.com 在 HOSTS 添加 127.0.0.1 ads.raidrive.com 或者在代理中设置为阻止即可. 效果: 补 最新版(2023.9 ...

  8. JavaScript设计模式样例七 —— 原型模式

    原型模式(Prototype Pattern) 定义:用于创建重复的对象,同时又能保证性能.目的:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.场景:在运行期建立和删除原型. let ...

  9. C primer plus笔记之初识C语言

    初识C语言 --本文参考书籍:         Stephen Prata的<C Primer Plus> 前言 C 语言是一门抽象的.面向过程的语言,C 语言广泛应用于底层开发,C 语言 ...

  10. 给网站添加Let's Encrypt的免费ssl证书

    概要 目前很多浏览器默认都会标记http访问的网站为不安全,https部署已经称为大趋势,我之前利用业余时间搭建了一个网站,本文就以这个域名为基础说明如何给网站加上证书.本文使用的操作系统centos ...