使用 KubeSphere 实现微服务的灰度发布

article/2025/11/5 7:55:20

前言

今天来说一说,在 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 转 FileFile 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 发布!


http://chatgpt.dhexx.cn/article/j7luwUnb.shtml

相关文章

Spring Framework灰度发布

今天简单介绍下SpringFramework微服务中几种服务发布策略以及实现方式。我接触过的有蓝绿、滚筒和灰度发布。 蓝绿发布&#xff1a; 简单说就像美帝选总统投票一样&#xff0c;非蓝即绿一刀切&#xff0c;这个其实也是传统软件架构最常使用的升级方式&#xff0c;只不过服务需…

构建灰度发布环境

手把手教你搭建一个灰度发布环境 提示&#xff1a;灰度发布&#xff0c;又称金丝雀发布金丝雀发布 这一术语源于煤矿工人把笼养的金丝雀带入矿井的传统。矿工通过金丝雀来了解矿井中一氧化碳的浓度&#xff0c;如果一氧化碳的浓度过高&#xff0c;金丝雀就会中毒&#xff0c;从…

灰度发布与滚动发布、蓝绿发布介绍

文章目录 灰度发布与滚动发布、蓝绿发布介绍一、灰度发布与滚动发布、蓝绿发布介绍1、蓝绿部署2、滚动发布3、灰度发布 二、灰度发布好处三、Gitee上高热度的开源灰度发布系统四、安装使用 灰度发布与滚动发布、蓝绿发布介绍 一、灰度发布与滚动发布、蓝绿发布介绍 ​ 引用文…

不容闪失的灰度发布简介

目录 1 线上项目灰度发布的重大意义2 项目发布问题剖析3 解决方案3.1 蓝绿部署3.2 滚动发布3.3 灰度发布3.4 灰度发布方法 1 线上项目灰度发布的重大意义 上面这个软件相信大家一定不陌生&#xff0c;很多人和我一样一定还欠他钱&#xff01;支付宝经历了十多年&#xff0c;从未…

不停服更新应用的方案:蓝绿发布、滚动发布、灰度发布

原文网址&#xff1a;不停服更新应用的方案&#xff1a;蓝绿发布、滚动发布、灰度发布_IT利刃出鞘的博客-CSDN博客 简介 本文介绍不停服更新应用的方案&#xff1a;蓝绿发布、滚动发布、灰度发布。 升级服务器的应用时&#xff0c;要停止掉老版本服务&#xff0c;将程序上传…

互联网产品的灰度发布

互联网产品的灰度发布 在传统软件产品发布过程中&#xff08;例如微软的Windows 7的发布过程中&#xff09;&#xff0c;一般都会经历Pre-Alpha、Alpha、Beta、Release candidate(RC)、RTM、General availability or General Acceptance (GA)等几个阶段&#xff08;参考Softwa…

【产品】什么是灰度发布

灰度发布是指在黑与白之间,能够平滑过渡的一种发布方式,一级一级的发布逐渐的扩大发布范围,最后达到系统的完全上线。  在其上可以进行A/B testing,即让一部分用户继续用产品特性 A,一部分用户开始用产品特性 B,如果用户对 B 没有什么反对意见,那么逐步扩大范围,把所…

灰度发布 java_当我们说做灰度发布的时候我们在做什么

现在对于稳定性的要求越来越高&#xff0c;同时在维护的应用中有一个正在进行迁移&#xff0c;需要采取一些措施来实现平稳升级和迁移。采用灰度发布是一个可行的方案。 什么是灰度发布 百度百科上的解释是这样的 灰度发布是指在黑与白之间&#xff0c;能够平滑过渡的一种发布方…

版本升级之灰度发布

在项目迭代的过程中&#xff0c;不可避免需要“上线”。上线对应着部署&#xff0c;或者重新部署&#xff1b;部署对应着修改&#xff0c;修改则意味着风险。应用程序升级面临最大挑战是新旧业务切换&#xff0c;将软件从测试的最后阶段带到生产环境&#xff0c;同时要保证系统…

产品灰度发布

一、什么是灰度发布&#xff08;灰度测试&#xff09; 如果软件要在不久的将来推出一个全新的功能&#xff0c;或者做一次比较重大的改版的话&#xff0c;要先进行一个小范围的尝试工作&#xff0c;然后再慢慢放量&#xff0c;直到这个全新的功能覆盖到所有的系统用户&…

灰度发布

1、什么是灰度发布&#xff0c;有哪些好处&#xff1f; 答&#xff1a;灰度发布&#xff08;又名金丝雀发布&#xff09;是指在黑与白之间&#xff0c;能够平滑过渡的一种发布方式。 在其上可以进行A/B testing&#xff0c;即让一部分用户继续用产品特性A&#xff0c;一部分用…

灰度发布究竟是啥

概述 目前产品优化迭代的方式&#xff0c;通常是直接将某版本上线发布给全部用户&#xff0c;一旦遇到线上事故&#xff08;或BUG&#xff09;&#xff0c;对用户的影响极大&#xff0c;解决问题周期较长&#xff0c;甚至有时不得不回滚到前一版本&#xff0c;严重影响了用户体…

项目灰度发布功能设计

平台项目迭代发布过程中&#xff0c;有一些功能发布时会产生较大的影响&#xff0c;一旦出现问题&#xff0c;会影响用户使用体验&#xff0c;降低产品信誉。为了解决这一问题&#xff0c;在重要功能发布时需要引入灰度发布功能&#xff0c;借助一小部分用户在生产环境进行功能…

【华为云技术分享】从零搭建一个灰度发布环境

DevUI是一支兼具设计视角和工程视角的团队&#xff0c;服务于华为云DevCloud平台和华为内部数个中后台系统&#xff0c;服务于设计师和前端工程师。 官方网站&#xff1a;devui.design Ng组件库&#xff1a;ng-devui&#xff08;欢迎Star&#xff09; 引言 灰度发布&#x…

什么是灰度发布

灰度发布是指在黑与白之间&#xff0c;能够平滑过渡的一种发布方式。AB test就是一种灰度发布方式&#xff0c;让一部用户继续用A&#xff0c;一部分用户开始用B&#xff0c;如果用户对B没有什么反对意见&#xff0c;那么逐步扩大范围&#xff0c;把所有用户都迁移到B上面 来。…

准确率(accuracy),精确率(Precision),召回率(Recall)和综合评价指标(F1-Measure )

自然语言处理(ML),机器学习(NLP),信息检索(IR)等领域,评估(evaluation)是一个必要的工作,而其评价指标往往有如下几点:准确率(accuracy),精确率(Precision),召回率(Recall)和F1-Measure。 本文将简单介绍其中几个概念。中文中这几个评价指标翻译各有不同&#xff0c;所以一般情…

多分类评价指标:准确率、精确率、召回率、F1值

准确率、精确率、召回率、F1值 定义&#xff1a; 准确率&#xff08;Accuracy&#xff09;&#xff1a;正确分类的样本个数占总样本个数&#xff0c; A (TP TN) / N 精确率&#xff08;Precision&#xff09;(查准率)&#xff1a;预测正确的正例数据占预测为正例数据的比…

准确率(Accuracy) VS 精确率(Precision) VS 召回率(Recall)

准确率(Accuracy) VS 精确率(Precision) VS 召回率(Recall) 在信息检索中, 准确率通常用于评价结果的质量, 而召回率用来评价结果的完整性。 我们的目标是训练一个模型,它可以将这个二维空间中的新数据点分成红色和蓝色两类。 数据有两种状态&#xff1a;测试集数据和预测结…

真正率、假正率、真负率

True Positive &#xff08;真正, TP&#xff09;被模型预测为正的正样本&#xff1b; True Negative&#xff08;真负 , TN&#xff09;被模型预测为负的负样本 &#xff1b; False Positive &#xff08;假正, FP&#xff09;被模型预测为正的负样本&#xff1b; False Negat…

关于召回率和准确率的理解

最近一直在做相关推荐方面的研究与应用工作&#xff0c;召回率与准确率这两个概念偶尔会遇到&#xff0c; 知道意思&#xff0c;但是有时候要很清晰地向同学介绍则有点转不过弯来。 召回率和准确率是数据挖掘中预测、互联网中的搜索引擎等经常涉及的两个概念和指标。 召回率&am…