在KubeSphere中两个“小姐姐”如何来回切换

在KubeSphere中两个“小姐姐”如何来回切换

【摘要】在KubeSphere中两个“小姐姐”如何来回切换。

在KubeSphere中两个“小姐姐”如何来回切换

一、前言


天来说一说,在KubeSphere中两个“小姐姐”如何来回切换,这是什么意思哩?我们假设有两个“小姐姐”,一个叫A小姐姐,另一个叫B小姐姐。A小姐姐就是v1版本,B小姐姐就是v2版本。现在我们要将A小姐姐逐步过渡为B小姐姐,说的就是互联网产品中常用的灰度发布方式,互联网产品需要快速迭代上线,既要保证新功能运行正常,又要保证质量,一旦出现问题可以很快控制局面,就需要设计一套灰度发布系统。用大白话讲就是某个APP的新版本已经开发完成了,而老版本用户正在正常使用着,这个时候要是直接上线新版本,那么所有的用户都会用新版本,但是这种情况下,一旦出现问题,将导致所有的用户都不可用,所以会有策略的挑选一部分用户先用新版本,即使出现问题,也只是一小部分用户,方便回滚到旧版本,提升用户良好的体验性。

在KubeSphere中两个“小姐姐”如何来回切换

二、概述


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

在KubeSphere中两个“小姐姐”如何来回切换

三、KubeSphere的微服务治理功能


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

流量治理

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

在KubeSphere中应用治理可以以可插拔式方式开启。开启后如下:在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中两个“小姐姐”如何来回切换

五、镜像构建


在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中两个“小姐姐”如何来回切换

六、项目网关

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

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

在 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中两个“小姐姐”如何来回切换
在KubeSphere中两个“小姐姐”如何来回切换

认v1和v2各占50%流量。

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

在KubeSphere中两个“小姐姐”如何来回切换在KubeSphere中两个“小姐姐”如何来回切换

上图片来自百度,侵权可删。

在KubeSphere中两个“小姐姐”如何来回切换

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

在KubeSphere中两个“小姐姐”如何来回切换

九、总结


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


· END ·

如果这篇文章对您有帮助或者有所启发的话,请帮忙三连暴击点赞、转发和在看。您的支持是我坚持更新的最大动力。

最后,欢迎关注架构至美微信公众号,查看历史文章,希望我的文章可以给您带来收获,哪怕只是一点点。

原文始发于微信公众号(架构至美):在KubeSphere中两个“小姐姐”如何来回切换

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/42504.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!