企业深入使用微服务后会面临哪些问题?云原生全链路灰度给了新思路
作者:魁予、十眠
如何落地可灰度、可觀測、可回滾的安全生產三板斧能力,滿足業務高速發展情況下快速迭代和小心驗證的訴求,是企業在微服務化深入過程中必須要面對的問題。在云原生流行的當下,這個問題又有了一些新的思路與解法。
Kubernetes Ingress 網關
我們先從 Ingress 網關談起,聊一下通過 Ingress 配置路由轉發。
Kubernetes 集群內的網絡與外部是隔離的,即在 Kubernetes 集群外部無法直接訪問集群內部的服務,如何讓將 Kubernetes 集群內部的服務提供給外部用戶呢?Kubernetes 社區有三種方案:NodePort、LoadBalancer、Ingress,下圖是對這三種方案的對比:
通過對比可以看到 Ingress 是更適合業務使用的一種方式,可以基于其做更復雜的二次路由分發,這也是目前用戶主流的選擇。
隨著云原生應用微服務化深入,用戶需要面對復雜路由規則配置、支持多種應用層協議(HTTP、HTTPS和 QUIC 等)、服務訪問的安全性以及流量的可觀測性等訴求。Kubernetes 希望通過 Ingress 來標準化集群入口流量的規則定義,但實際業務落地時需要的功能點要遠比 Ingress 提供的多,為了滿足不斷增長的業務訴求,讓用戶輕松應對云原生應用的流量管理,各類 Ingress-Provider 也都在 Ingress 的標準下進行各種擴展。
各種 Ingress-Provider 如何路由轉發
下面我會簡單介紹 Kubernetes 下的各種 Ingress 網關的實現,以及如何配置路由轉發規則等。
Nginx Ingress
Nginx Ingress 由資源對象 Ingress、Ingress Controller、Nginx 三部分組成,Ingress Controller 用以將 Ingress 資源實例組裝成 Nginx 配置文件(nginx.conf),并重新加載 Nginx 使變更的配置生效。Ingress-nginx 是 Kubernetes 社區提供的 Ingress 控制器,最容易部署,但是受性能限制,功能較為單一,且更新 Nginx 配置需要 reload。
1、基于 Nginx Ingress Controller 配置路由轉發
基于部署了 Nginx Ingress Controller 組件的 Kubernetes 集群,可以實現路由轉發功能,能夠根據域名、路徑進行路由轉發,也能夠支持基于 Ingress 的 Annotations 進行簡單規則的灰度流量管理,如權重、Header 等。在當下趨勢中,Nginx Ingress 依舊是使用最廣泛的。
ALB Ingress
1、ALB 產品介紹
應用型負載均衡 ALB(Application Load Balancer)是阿里云推出的專門面向 HTTP、HTTPS 和 QUIC 等應用層負載場景的負載均衡服務,具備超強彈性及大規模七層流量處理能力。
2、ALB 特性
彈性自動伸縮: ALB 同時提供域名與 VIP(Virtual IP address),支持對多臺云服務器進行流量分發以擴展應用系統的服務能力,通過消除單點故障來提升應用系統的可用性。ALB 允許您自定義可用區組合,并支持在可用區間彈性縮放,避免單可用區資源瓶頸。
高級的協議: 支持 ALB 支持應用傳輸協議 QUIC,在實時音視頻、互動直播和游戲等移動互聯網應用場景中,訪問速度更快,傳輸鏈路更安全可靠。ALB 同時支持 gRPC 框架,可實現海量微服務間的高效 API 通信。
基于內容的高級路由: ALB 支持基于 HTTP 標頭、Cookie、HTTP 請求方法等多種規則來識別特定業務流量,并將其轉發至不同的后端服務器。同時 ALB 還支持重定向、重寫以及自定義 HTTPS 標頭等高級操作。
安全加持“ALB 自帶分布式拒絕服務 DDoS(Distributed Denial of Service)防護,一鍵集成 Web 應用防火墻(Web Application Firewall,簡稱 WAF)。同時 ALB 支持全鏈路 HTTPS 加密,可以實現與客戶端或后端服務器的 HTTPS 交互;支持 TLS 1.3 等高效安全的加密協議,面向加密敏感型業務,滿足 Zero-Trust 新一代安全技術架構需求;支持預制的安全策略,您可以自定義安全策略。
云原生應用: 在云原生時代,PaaS 平臺將下沉到基礎設施,成為云的一部分。隨著云原生逐步成熟,互聯網、金融、企業等諸多行業新建業務時選擇云原生部署,或對現有業務進行云原生化改造。ALB 與容器服務 Kubernetes 版(Alibaba Cloud Container Service for Kubernetes,簡稱 ACK)深度集成,是阿里云的官方云原生 Ingress 網關。
彈性靈活的計費: ALB 通過彈性公網 IP(Elastic IP Address,簡稱 EIP)和共享帶寬提供公網能力,實現公網靈活計費;同時采用了更先進的、更適合彈性業務峰值的基于容量單位(LCU)的計價方案。
3、基于 ALB Ingress Controller 配置路由轉發
ALB Ingress Controller 通過 API Server 獲取 Ingress 資源的變化,動態地生成AlbConfig,然后依次創建 ALB 實例、監聽、路由轉發規則以及后端服務器組。Kubernetes 中 Service、Ingress 與 AlbConfig 有著以下關系:
- Service 是后端真實服務的抽象,一個 Service 可以代表多個相同的后端服務。
- Ingress 是反向代理規則,用來規定 HTTP/HTTPS 請求應該被轉發到哪個 Service 上。例如:根據請求中不同的 Host 和 URL 路徑,讓請求轉發到不同的 Service 上。
- AlbConfig 是在 ALB Ingress Controller 提供的 CRD 資源,使用 AlbConfig CRD 來配置 ALB 實例和監聽。一個 AlbConfig 對應一個 ALB 實例。
ALB Ingress 基于阿里云應用型負載均衡 ALB(Application Load Balancer)之上提供更為強大的 Ingress 流量管理方式,兼容 Nginx Ingress,具備處理復雜業務路由和證書自動發現的能力,支持 HTTP、HTTPS 和 QUIC 協議,完全滿足在云原生應用場景下對超強彈性和大規模七層流量處理能力的需求。
APISIX Ingress
APISIX Ingress 跟 Kubernetes Ingress Nginx 的區別主要在于 APISIX Ingress 是以 Apache APISIX 作為實際承載業務流量的數據面。如下圖所示,當用戶請求到具體的某一個服務/API/網頁時,通過外部代理將整個業務流量/用戶請求傳輸到 Kubernetes 集群,然后經過 APISIX Ingress 進行后續處理。
從上圖可以看到,APISIX Ingress 分成了兩部分。一部分是 APISIX Ingress Controller,作為控制面它將完成配置管理與分發。另一部分 APISIX Proxy Pod 負責承載業務流量,它是通過 CRD(Custom Resource Definitions) 的方式實現的。Apache APISIX Ingress 除了支持自定義資源外,還支持原生的 Kubernetes Ingress 資源。
1、基于 APISIX Ingress Controller 的應用路由
如上圖所示,我們部署了 APISIX Ingress Controller 組件的集群,能夠實現基于Ingress 資源和自定義資源 ApisixRoute 進行路由配置,控制器監聽資源的變更事件,調用 apisix-admin api 進行規則的持久化存儲。流量經過 APISIX 配置的 LoadBalancer 類型 Service 網關從 ETCD 中同步配置,并將請求轉發到上游。
APISIX Ingress Controller 基于 Apache APISIX,支持 Kubernetes 中的 Ingress 資源進行路由配置,也支持通過自定義資源對接到 APISIX 的路由、插件、上游等資源配置。支持動態配置路由規則、熱插拔插件、更豐富的路由規則支持,APISIX 云原生網關也能夠提供可觀測、故障注入、鏈路追蹤等能力。使用高可靠 ETCD 集群作為配置中心,進行 apisix 配置的存儲和分發。
MSE 云原生網關 Ingress
MSE 云原生網關是阿里云推出的下一代網關,將傳統的流量網關和微服務網關合并,在降低 50%資源成本的同時為用戶提供了精細化的流量治理能力,支持 ACK 容器服務、Nacos、Eureka、固定地址、FaaS 等多種服務發現方式,支持多種認證登錄方式快速構建安全防線,提供全方面、多視角的監控體系,如指標監控、日志分析以及鏈路追蹤。
1、基于 MSE 云原生網關 Ingress Controller 的應用路由
上圖是 MSE 云原生網關在多集群模式下對業務應用進行流量管理的應用場景。MSE 云原生網關與阿里云容器服務 ACK 深度集成,可以做到自動發現服務以及對應的端點信息并動態秒級生效。用戶只需簡單在 MSE 管控平臺關聯對應的 Kubernetes ACK 集群,通過在路由管理模塊中配置路由來對外暴露 ACK 中服務即可,同時可以按集群維度進行流量分流以及故障轉移。此外,用戶可以為業務路由實施額外的策略,如常見的限流、跨域或者重寫。
MSE 云原生網關提供的流量治理能力與具體的服務發現方式解耦,無論后端服務采用何種服務發現方式,云原生網關以統一的交互體驗來降低上手門檻,滿足用戶業務日益增長的流量治理訴求。
上文介紹了 Nginx Ingress、ALB Ingress、APISIX Ingress 以及 MSE 云原生網關Ingress 這五種 Ingress 的路由轉發與配置,我們可以按照自己的業務需求與復雜度按需選擇合適的 Ingress 實現。
假設我們已經配好了 Ingress 的路由轉發,那么在多應用環境下,我們該如何簡單地玩轉全鏈路灰度呢?
基于 Ingress 實現全鏈路流量灰度
我們基于全鏈路灰度的實踐,提出了“泳道”這一個概念,當然這一概念在分布式軟件領域并非新詞。
名詞解釋
- 泳道 : 為相同版本應用定義的一套隔離環境。只有滿足了流控路由規則的請求流量才會路由到對應泳道里的打標應用。一個應用可以屬于多個泳道,一個泳道可以包含多個應用,應用和泳道是多對多的關系。
- 泳道組: 泳道的集合。泳道組的作用主要是為了區分不同團隊或不同場景。
- 基線: 指業務所有服務都部署到了這一環境中。未打標的應用屬于基線穩定版本的應用,我們這里指穩定的線上環境。
- 入口應用: 微服務體系內的流量入口。入口應用可以是 Ingress 網關、或者是自建的 Spring Cloud Gateway、Netflix Zuul Gateway 引擎類型網關或者 Spring Boot、Spring MVC、Dubbo 應用等。
為什么要區分出入口應用?因為全鏈路灰度場景下,我們只需對入口應用進行路由轉發的規則配置,后續微服務只需要按照透傳的標簽進行染色路由(實現“泳道”的流量閉環能力)。
從上圖中可以看到,我們分別創建了泳道 A 與泳道 B,里面涉及了交易中心、商品中心兩個應用,分別是標簽標簽 2,其中 A 泳道分流了線上 30%的流量,B 泳道分流了線上 20%的流量,基線環境(即未打標的環境)分流了線上 50%的流量。
全鏈路灰度的技術解析
我們通過在 deployment 上配置注解 alicloud.service.tag: gray 標識應用灰度版本,并帶標注冊到注冊中心中,在灰度版本應用上開啟全鏈路泳道(經過機器的流量自動染色),支持灰度流量自動添加灰度 x-mse-tag: gray 標簽,通過擴展 consumer 的路由能力將帶有灰度標簽的流量轉發到目標灰度應用。
基于各種 Ingress 網關的全鏈路灰度
基于全鏈路灰度能力搭配合適的入口路由網關即可實現全鏈路流量灰度,如上述使用 Ingress-Nginx、Ingress-APISIX、ALB、MSE 云原生網關均可以作為流量入口。
全鏈路灰度的產品實現
功能性與易用性是產品化必須思考的點,我們需要從用戶的視角出發,端到端思考全流程該如何去實踐、如何去落地。在阿里云上關于微服務全鏈路灰度能力有以下兩款產品都提供了完整的全鏈路灰度解決方案。
MSE 全鏈路灰度方案
全鏈路灰度作為 MSE 微服務治理專業版中的核心功能,具備以下六大特點:
- 全鏈路隔離流量泳道
通過設置流量規則對所需流量進行'染色','染色'流量會路由到灰度機器。
灰度流量攜帶灰度標往下游傳遞,形成灰度專屬環境流量泳道,無灰度環境應用會默認選擇未打標的基線環境。
端到端的穩定基線環境
未打標的應用屬于基線穩定版本的應用,即穩定的線上環境。當我們將發布對應的灰度版本代碼,然后可以配置規則定向引入特定的線上流量,控制灰度代碼的風險。
- 流量一鍵動態切流
流量規則定制后,可根據需求進行一鍵停啟,增刪改查,實時生效。灰度引流更便捷。
- 低成本接入,基于 Java Agent 技術實現無需修改一行業務代碼
MSE 微服務治理能力基于 Java Agent 字節碼增強的技術實現,無縫支持市面上近 5 年的所有 Spring Cloud 和 Dubbo 的版本,用戶不用改一行代碼就可以使用,不需要改變業務的現有架構,隨時可上可下,沒有綁定。只需開啟 MSE 微服務治理專業版,在線配置,實時生效。
- 可觀測能力
- 具備泳道級別的單應用可觀測能力
- 具備全鏈路應用的可觀測能力,可以從全局視角觀察流量是否存在逃逸情況。灰沒灰到,一目了然。
- 具備無損上下線能力,使得發布更加絲滑
應用開啟 MSE 微服務治理后就具備無損上下線能力,大流量下的發布、回滾、擴容、縮容等場景,均能保證流量無損。
1、創建流量泳道組
需要將泳道中涉及的應用添加到泳道組涉及應用中
2、創建流量泳道
在使用泳道功能前,我們默認已經存在了一個包含所有服務在內的基線(未達標)環境。
我們需要去部署隔離版本的應用 Deployment,同時去給他們打上標簽,并且給泳道選擇對應一一關聯的標簽(test 泳道關聯 gray 標簽)
然后需要去配置流量入口的 Ingress 規則,比如訪問 www.base.com 路由到 A 應用的 base 版本,訪問 www.gray.com 路由到 A 應用的 gray 版本。
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata:name: spring-cloud-a-base spec:rules:- host: www.base.comhttp:paths:- backend:serviceName: spring-cloud-a-baseservicePort: 20001path: /--- apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata:name: spring-cloud-a-gray spec:rules:- host: www.gray.comhttp:paths:- backend:serviceName: spring-cloud-a-grayservicePort: 20001path: /EDAS 全鏈路灰度方案
1、EDAS 產品介紹
EDAS 是應用托管和微服務管理的云原生 PaaS 平臺,提供應用開發、部署、監控、運維等全棧式解決方案,同時支持 Spring Cloud 和 Apache Dubbo 等微服務運行環境,助力您的應用輕松上云。
在 EDAS 平臺中,用戶可以通過 WAR 包、JAR 包或鏡像等多種方式快速部署應用到多種底層服務器集群,免集群維護,能夠輕松部署應用的基線版本和灰度版本。EDAS 無縫接入了 MSE 微服務治理能力,部署在 EDAS 的應用無需額外安裝 Agent 即可零代碼入侵獲得應用無損上下線、金絲雀發布、全鏈路流量控制等高級特性。
目前 EDAS 支持微服務應用為入口的全鏈路灰度能力,下面簡單介紹在 EDAS 中的配置全鏈路灰度流量的方法。
2、創建流量泳道組和泳道
在創建泳道時需要選擇入口類型,目前僅支持部署在 EDAS 中的入口應用作為泳道入口應用,需要將泳道中涉及的基線版本和灰度版本添加到泳道組涉及應用中。
在創建泳道時支持基于路徑配置規則定向引入特定的線上流量,配置打標流量應用形成灰度環境鏈路。泳道支持基于 Cookie、Header、Parameter 進行流量控制。
配置泳道成功后,可以在全鏈路流量控制界面選擇目標泳道組進行流量觀測,包括入口應用總的監控圖、未打標部分監控圖和打標部分監控圖,及泳道組內所有應用的監控圖。
3、應用路由作為流量入口實現全鏈路灰度
EDAS 平臺支持用戶為 Kubernetes 應用基于 Nginx Ingress 創建應用路由,結合 EDAS 對全鏈路流控的支持,用戶能夠直接在 EDAS 控制臺實現使用 Nginx Ingress 作為流量入口網關的全鏈路灰度。
在 EDAS 平臺中部署基線版本應用、灰度版本應用、入口應用后,根據上述創建流量泳道組和泳道的步驟創建灰度泳道后,可以為入口應用綁定 Kubernetes 的 Service 資源以提供流量入口。可以為入口應用配置 LoadBalancer 類型 Service,以提供入口應用的對外訪問,也可以基于 Kubernetes 集群中已有的 Nginx Ingress 網關,為入口應用配置 ClusterIP 類型 Service 并配置應用路由,以避免額外分配公網 IP。
下面簡單介紹為入口應用配置應用路由作為流量入口的方法。
在部署完成的應用詳情頁面,支持進行應用的訪問方式配置,在這里可以選擇為入口應用綁定 LoadBalancer 類型 Service 以直接對外訪問,也可以創建 ClusterIP 類型 Service,如下圖:
配置成功后,可以在 EDAS 應用路由頁面點擊創建應用路由,選擇該入口應用所在的集群,命名空間,應用名稱,上述步驟創建的服務名稱及端口以配置 Ingress 資源,如下圖:
配置成功后,即可使用該 Ingress 資源配置的域名和路徑并結合在泳道中配置的灰度流量規則實現全鏈路灰度。
4、更進一步
EDAS 中的全鏈路流量控制目前僅支持部署在 EDAS 中的入口應用作為流量入口,在Kubernetes 主導的云原生化趨勢下,EDAS 將支持使用 Ingress 作為流量入口,用戶不需要額外部署網關應用,直接使用 Ingress 資源配置轉發規則即可作為流量入口。不僅如此,EDAS 也將支持 ALB Ingress、APISIX Ingress 以及 MSE 云原生網關 Ingress,并且在這個基礎上全鏈路灰度能力也會進一步升級,支持基于各種 Ingress-Provider 網關的全鏈路灰度能力。
尾
我們發現在云原生抽象的 Ingress 下,再談全鏈路灰度,一切問題都變得更加標準化與簡單起來。本文通過介紹各種 Ingress 網關實現的路由轉發能力,再配合上基于“泳道”實現的 Ingress 全鏈路灰度方案,企業可以快速落地全鏈路灰度這個微服務核心能力。
點擊文末“ ??此處??? ”,了解更多產品相關~ ? 發布云原生技術最新資訊、匯集云原生技術最全內容,定期舉辦云原生活動、直播,阿里產品及用戶最佳實踐發布。與你并肩探索云原生技術點滴,分享你需要的云原生內容。
關注【阿里巴巴云原生】公眾號,獲取更多云原生實時資訊!
總結
以上是生活随笔為你收集整理的企业深入使用微服务后会面临哪些问题?云原生全链路灰度给了新思路的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 与容器服务 ACK 发行版的深度对话第二
- 下一篇: Fluid 架构创新论文被国际数据库顶会