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

这篇具有很好参考价值的文章主要介绍了使用 KubeSphere 实现微服务的灰度发布。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

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

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

概述

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

我们假设这个 A/B,就是 A 小姐姐和 B 小姐姐。

KubeSphere 的微服务治理功能

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

流量治理

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

在 KubeSphere 中应用治理可以以可插拔式方式开启。开启后如下:

kubesphere 灰度发布,k8s,容器平台,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 灰度发布,k8s,容器平台,kubesphere,云计算

镜像构建

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

kubesphere 灰度发布,k8s,容器平台,kubesphere,云计算

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

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

kubesphere 灰度发布,k8s,容器平台,kubesphere,云计算

harbor 中新建项目

kubesphere 灰度发布,k8s,容器平台,kubesphere,云计算

创建镜像构建器

kubesphere 灰度发布,k8s,容器平台,kubesphere,云计算

kubesphere 灰度发布,k8s,容器平台,kubesphere,云计算

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

创建成功后,开始运行

kubesphere 灰度发布,k8s,容器平台,kubesphere,云计算

构建成功如上所示。

harbor 中查看 v1 标签的镜像

kubesphere 灰度发布,k8s,容器平台,kubesphere,云计算

以上就是 v1 版本由来的整个过程,我们简称为 A 小姐姐。

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

kubesphere 灰度发布,k8s,容器平台,kubesphere,云计算

构建 v2 版本的镜像,也就是我们的 B 小姐姐。

kubesphere 灰度发布,k8s,容器平台,kubesphere,云计算

kubesphere 灰度发布,k8s,容器平台,kubesphere,云计算

kubesphere 灰度发布,k8s,容器平台,kubesphere,云计算

项目网关

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

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

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

kubesphere 灰度发布,k8s,容器平台,kubesphere,云计算

自制应用

在 KubeSphere 中实现金丝雀发布,必须先开启应用治理,且必须有一个可用的应用。

kubesphere 灰度发布,k8s,容器平台,kubesphere,云计算

KubeSphere 支持基于模板的应用和自制应用。基于模板的应用创建自 KubeSphere 应用商店或应用模板,自制应用由用户自定义。这里我们以自制应用为例。

创建自制应用

kubesphere 灰度发布,k8s,容器平台,kubesphere,云计算

创建服务

kubesphere 灰度发布,k8s,容器平台,kubesphere,云计算

选择无状态服务

kubesphere 灰度发布,k8s,容器平台,kubesphere,云计算

kubesphere 灰度发布,k8s,容器平台,kubesphere,云计算

kubesphere 灰度发布,k8s,容器平台,kubesphere,云计算

kubesphere 灰度发布,k8s,容器平台,kubesphere,云计算

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

kubesphere 灰度发布,k8s,容器平台,kubesphere,云计算

kubesphere 灰度发布,k8s,容器平台,kubesphere,云计算

在这里添加路由规则后,KubeSphere 会自动帮我们创建 ingress 路由规则。

创建成功后如下:

kubesphere 灰度发布,k8s,容器平台,kubesphere,云计算

kubesphere 灰度发布,k8s,容器平台,kubesphere,云计算

应用路由下会自动生成 ingress 路由规则,如下:

kubesphere 灰度发布,k8s,容器平台,kubesphere,云计算

kubesphere 灰度发布,k8s,容器平台,kubesphere,云计算

kubesphere 灰度发布,k8s,容器平台,kubesphere,云计算

配置本地 hosts, 如:192.168.0.156 servicea.com 点击访问服务,立即返回 A 小姐姐,如下:

kubesphere 灰度发布,k8s,容器平台,kubesphere,云计算

金丝雀发布

创建金丝雀发布任务

kubesphere 灰度发布,k8s,容器平台,kubesphere,云计算

kubesphere 灰度发布,k8s,容器平台,kubesphere,云计算

kubesphere 灰度发布,k8s,容器平台,kubesphere,云计算

kubesphere 灰度发布,k8s,容器平台,kubesphere,云计算

可以指定流量进行分配,也可以指定请求参数

kubesphere 灰度发布,k8s,容器平台,kubesphere,云计算

创建成功,查看任务状态

kubesphere 灰度发布,k8s,容器平台,kubesphere,云计算

kubesphere 灰度发布,k8s,容器平台,kubesphere,云计算

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

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

kubesphere 灰度发布,k8s,容器平台,kubesphere,云计算

kubesphere 灰度发布,k8s,容器平台,kubesphere,云计算

kubesphere 灰度发布,k8s,容器平台,kubesphere,云计算

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

总结

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

本文由博客一文多发平台 OpenWrite 发布!文章来源地址https://www.toymoban.com/news/detail-829368.html

到了这里,关于使用 KubeSphere 实现微服务的灰度发布的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【k8s完整实战教程4】使用kubesphere部署项目到k8s

    系列文章:这个系列已完结,如对您有帮助,求点赞收藏评论。 读者寄语: 再小的帆,也能远航! 【k8s完整实战教程0】前言 【k8s完整实战教程1】源码管理-Coding 【k8s完整实战教程2】腾讯云搭建k8s托管集群 【k8s完整实战教程3】k8s集群部署kubesphere 【k8s完整实战教程4】使用

    2023年04月18日
    浏览(53)
  • k8s使用ingress实现应用的灰度发布升级

    v1是1.14.0版本nginx ,实操时候升级到v2是1.20.0版本nginx,来测试灰度发布实现过程 一、方案:使用ingress实现应用的灰度发布 1、服务端:正常版本v1,灰度升级版本v2 2、客户端:带有请求头version=v2标识的请求访问版本v2,其他的请求访问版本v1 3、待版本v2稳定后,所有请求切换

    2024年01月24日
    浏览(38)
  • 使用k8s 配置 RollingUpdate 滚动更新实现应用的灰度发布

    方案实现方式: RollingUpdate 滚动更新机制 当某个服务需要升级时,传统的做法是,先将要更新的服务下线,业务停止后再更新版本和配置,然后重新启动服务。 如果业务集群规模较大时,这个工作就变成了一个挑战,而且全部停止了服务,再逐步升级的方式会导致服务较长

    2024年01月24日
    浏览(33)
  • KubeSphere 3.3.2 版本正式发布!

    距离上一个版本 v3.3.1 发布,已经过了 3 个多月,今天我们很高兴宣布 KubeSphere v3.3.2 正式发布! 此版本由 68 位贡献者参与代码提交,感谢各位贡献者对 KubeSphere 项目的支持与贡献! 本次发布的 KubeSphere v3.3.2 带来了更多的优化增强,主要集中在对 DevOps 和应用商店易用性的提

    2024年02月15日
    浏览(30)
  • 【业务功能118】微服务-springcloud-springboot-Kubernetes集群-k8s集群-KubeSphere-OpenELB部署及应用

    网址: openelb.io OpenELB 是一个开源的云原生负载均衡器实现,可以在基于裸金属服务器、边缘以及虚拟化的 Kubernetes 环境中使用 LoadBalancer 类型的 Service 对外暴露服务。OpenELB 项目最初由 KubeSphere 社区发起,目前已作为 CNCF 沙箱项目加入 CNCF 基金会,由 OpenELB 开源社区维护与支

    2024年02月03日
    浏览(86)
  • 【kubernetes】使用KubeSphere devops部署我的微服务系统

    入门使用KubeSphere的Devops功能部署\\\"我的微服务系统\\\" (内容学习于尚硅谷云原生课程) kubesphere devops官方文档: https://v3-1.docs.kubesphere.io/zh/docs/devops-user-guide/how-to-use/create-a-pipeline-using-jenkinsfile/ 暂时部署这4个服务,auth服务、crm服务、gateway服务、前端ui服务 Dockerfile 前端kwspher

    2024年02月10日
    浏览(27)
  • 使用kubekey3.1.0搭建k8s(kubernetes1.28.0)+kubesphere3.4.0教程

    基于kubernetes的Kubesphere环境搭建教 创建三个虚拟机:一个master,其余为node 虚拟机配置: 建议:master(100G以上存储空间,8G以上运行内存) node(50G以上存储空间,4G以上运行内存) 示例: master:192.168.203.131 node1:192.168.203.129 node2:192.168.203.130 可以使用以上两种工具进行远程

    2024年01月20日
    浏览(39)
  • k8s管理工具Kubesphere

    Kubesphere是一个开源的容器管理平台,它提供了一系列的工具和服务,帮助开发者更轻松地管理和部署容器化应用。在本文中,我们将介绍Kubesphere的主要功能和使用方法,并分享一些学习Kubesphere的经验和技巧。 Kubesphere的主要功能 Kubesphere提供了一系列的功能,包括: 容器编

    2024年02月13日
    浏览(29)
  • kubernetes(k8s)+kubesphere部署

    目录 一 装备三台机器linux(centos) 二 准备前置环境并安装kubernetes 1  三台机器都要做如下操作  1.1 关闭防火墙: 1.2 关闭 selinux: 1.3 关闭 swap 1.4 添加主机名与 IP 对应关系 1.5 date 查看时间 (可选) 1.6 卸载系统之前的 docke 命令自行百度不做说明 1.7 安装 Docker-CE  1. 7.1 装

    2024年01月17日
    浏览(57)
  • Kubernetes(K8S) kubesphere 安装

    安装KubeSphere最好的方法就是参考官方文档,而且官方文档是中文的。 官网地址:https://kubesphere.com.cn/ https://github.com/kubesphere/kubesphere/blob/master/README_zh.md Kubernetes(K8S) kubesphere 介绍 安装提前条件: 使用 Kubeadm 部署 Kubernetes(K8S) 安装--附K8S架构图 使用 Kubeadm 部署 Kubernetes(K8S) 安装

    2024年02月01日
    浏览(84)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包