使用 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