前语

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

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

概述

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

咱们假定这个 A/B,便是 A 小姐姐和 B 小姐姐。

KubeSphere 的微服务办理功用

KubeSphere 根据 Istio 微服务结构供给可视化的微服务办理功用,假如您在 Kubernetes 上运转和伸缩微服务,您能够为您的分布式系统装备根据 Istio 的微服务办理功用。KubeSphere 供给统一的操作界面,便于您集成并办理各类工具,包括 Istio、Envoy 和 Jaeger 等。

流量办理

  • 金丝雀发布供给灵敏的灰度战略,将流量按照所装备的份额转发至当前不同的灰度版别
  • 蓝绿部署支撑零宕机部署,让使用程序能够在独立的环境中测验新版别的功用和特性
  • 流量镜像模拟出产环境,将实时流量的副本发送给被镜像的服务
  • 熔断机制支撑为服务设置对单个主机的调用限制

在 KubeSphere 中使用办理能够以可插拔式方式敞开。敞开后如下:

使用 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 实现微服务的灰度发布

镜像构建

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

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

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

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

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

harbor 中新建项目

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

创立镜像构建器

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

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

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

创立成功后,开始运转

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

构建成功如上所示。

harbor 中检查 v1 标签的镜像

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

以上便是 v1 版别由来的整个过程,咱们简称为 A 小姐姐。

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

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

构建 v2 版别的镜像,也便是咱们的 B 小姐姐。

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

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

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

项目网关

KubeSphere 项目中的网关是一个 NGINX Ingress 操控器。KubeSphere 内置的用于 HTTP 负载均衡的机制称为使用路由 (Ingress 路由规矩),它界说了从外部到集群服务的衔接规矩。如需答应从外部拜访服务,用户可创立路由资源来界说 URI 途径、后端服务名称等信息。

KubeSphere 除了供给项目规模的网关外,还供给集群规模的网关,使得所有项目都能共享大局网关。

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

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

自制使用

在 KubeSphere 中完成金丝雀发布,必须先敞开使用办理,且必须有一个可用的使用。

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

KubeSphere 支撑根据模板的使用和自制使用。根据模板的使用创立自 KubeSphere 使用商店或使用模板,自制使用由用户自界说。这里咱们以自制使用为例。

创立自制使用

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

创立服务

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

选择无状况服务

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

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

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

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

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

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

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

在这里添加路由规矩后,KubeSphere 会主动帮咱们创立 ingress 路由规矩。

创立成功后如下:

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

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

使用路由下会主动生成 ingress 路由规矩,如下:

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

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

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

装备本地 hosts, 如:192.168.0.156 servicea.com 点击拜访服务,立即回来 A 小姐姐,如下:

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

金丝雀发布

创立金丝雀发布使命

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

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

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

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

能够指定流量进行分配,也能够指定恳求参数

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

创立成功,检查使命状况

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

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

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

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

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

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

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

拖动滑块设置发送给 v1 版别的流量份额和发送给 v2 版别的流量份额。

总结

利用 KubeSphere 咱们能够很轻松的完成金丝雀发布,缓慢地向一小部分用户推送改变,从而将版别晋级的风险降到最低。

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