前言
今天來說一說,在 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 發布!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/514259.html
標籤:其他
