乐趣区

关于云计算:使用-KubeSphere-实现微服务的灰度发布

前言

明天来说一说,在 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 公布!

退出移动版