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