使用 KubeSphere 實現微服務的灰度發佈

作者:何昌濤,北京北大英華科技有限公司高級 Java 工程師,雲原生愛好者。

前言

今天來說一說,在 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 我們可以很輕鬆的實現金絲雀發佈,緩慢地向一小部分用戶推送變更,從而將版本升級的風險降到最低。

關於 KubeSphere

KubeSphere (https://kubesphere.io)是在 Kubernetes 之上構建的開源容器平臺,提供全棧的 IT 自動化運維的能力,簡化企業的 DevOps 工作流。

KubeSphere 已被 Aqara 智能家居、愛立信、本來生活、東軟、華雲、新浪、三一重工、華夏銀行、四川航空、國藥集團、微衆銀行、杭州數跑科技、紫金保險、去哪兒網、中通、中國人民銀行、中國銀行、中國人保壽險、中國太平保險、中國移動、中國聯通、中國電信、天翼雲、中移金科、Radore、ZaloPay 等海內外數萬家企業採用。KubeSphere 提供了開發者友好的嚮導式操作界面和豐富的企業級功能,包括 Kubernetes 多雲與多集羣管理、DevOps (CI/CD)、應用生命週期管理、邊緣計算、微服務治理 (Service Mesh)、多租戶管理、可觀測性、存儲與網絡管理、GPU support 等功能,幫助企業快速構建一個強大和功能豐富的容器雲平臺。

✨ GitHub*: https://github.com/kubesphere

💻 官網(中國站): https://kubesphere.com.cn

微信羣:請搜索添加羣助手微信號 kubesphere

🔗 企業服務*: https://kubesphere.cloud

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/3IlQlZ4CzXyhlDnyz-_IWw