天天看點

Tengine-Ingress 高性能高可用的雲原生網關

作者:閃念基因

引言

統一接入作為阿裡巴巴集團7層應用流量入口網關,其技術底座Tengine作為高性能的HTTP和反向代理web伺服器,日常承載千萬級QPS流量,為雙11等各類大促活動保駕護航,對外提供永不停機的HTTP(S)接入服務。

雖然Tengine以高性能和高可用著稱,但統一接入的一些限制卻一直為人诟病,最典型的就是應用域名新增和更新無法動态生效;新增證書和加簽域名無法動态生效;使用者側HTTP(S)流量可配置性和可觀測性能力弱;HTTP(S)路由能力弱;不支援應用分域名灰階變更;接入層叢集變更範圍影響過大等問題也一直困擾着我們。

随着雲原生ingress入口網關規範的事實标準化以及阿裡集團ASI的大範圍落地,統一接入新應用AServer-Ingress基于雲原生ingress标準實作了統一接入層的架構更新,其技術底座Tengine-Ingress在深度優化kubernetes/ingress-nginx基礎上融合Tengine-Proxy,不斷提升自身性能和可用性,徹底根除了上述痛點和問題,并已反哺開源社群,持續保持Tengine業界領先地位。

Tengine官網:https://tengine.taobao.org

Tengine-Ingress開源倉庫:https://github.com/alibaba/tengine-ingress

Tengine開源倉庫:https://github.com/alibaba/tengine

術語

  1. AServer-Ingress: 基于K8s雲原生ingress标準,實作阿裡統一接入層架構更新的新應用,為集團淘寶,天貓,高德,阿裡媽媽,國際化,菜鳥,UC,釘釘,考拉等BU提供穩定的7層應用流量入口網關。
  2. Tengine-Ingress:應用AServer-Ingress的技術底座,在深度優化kubernetes/ingress-nginx基礎上融合Tengine-Proxy。
  3. K8s: Kubernetes簡稱為K8s,K8s是用于自動部署、擴充和管理容器化應用程式的分布式系統。
  4. ASI:AlibabaCloud Serverless Infrastructure的簡稱,面向雲原生應用的統一基礎設施,提供全托管和半托管K8s叢集運維服務。
  5. ingress: K8s叢集向外部提供通路叢集内部服務的HTTP(S)七層負載均衡,TLS解除安裝和路由轉發的系統原生資源。
  6. annotations: 注解,ingress通過注解 (annotations) 來擴充七層負載均衡,TLS解除安裝和路由轉發相關的配置資訊。
  7. etcd: 用于存儲K8s叢集中配置資料的一種持久性,輕量型,分布式的鍵-值資料存儲元件。
  8. API server: API伺服器是K8s叢集的一個關鍵元件,通過K8s API和JSON over HTTP提供K8s的内部和外部接口。API伺服器處理和驗證REST請求并更新API對象在etcd中的狀态,進而允許用戶端在工作節點之間配置工作負載和容器。
  9. CRD: CustomResourceDefinition的簡稱,用于定義API伺服器上可公開通路的使用者自定義資源。
  10. MD5: Message-Digest Algorithm的簡稱,一種被廣泛使用的密碼雜湊函數,可以産生出一個128位元 (16個位元組) 的散列值,用于確定資訊傳輸完整一緻。

架構

應用AServer-Ingress作為7層應用流量入口網關,公網HTTPS請求首先路由到4層負載均衡SLB,SLB在4層将HTTPS封包轉發到7層網關AServer-Ingress,AServer-Ingress基于動态ingress域名和secret證書本地解除安裝TLS,基于單元化和路由政策向後端應用轉發HTTP請求。

Tengine-Ingress 高性能高可用的雲原生網關

圖1. 應用AServer-Ingress系統架構圖

應用AServer-Ingress的技術底座Tengine-Ingress由兩部分組成,Tengine-Ingress控制器和Tengine-Proxy。Tengine-Ingress控制器是一個基于Tengine-Proxy的ingress控制器,在相容雲原生ingress标準規範的基礎上擴充了Server,Backend,TLS,Location和Canary。Tengine-Ingress控制器通過訂閱和處理ingress域名資源和secret證書資源,基于tengine ingress模闆轉換為動态配置寫入共享記憶體。Tengine-Proxy訂閱共享記憶體變化寫入内部運作時共享記憶體,将終端使用者的外部流量路由到K8s叢集中的應用服務。

Tengine-Ingress 高性能高可用的雲原生網關

圖2. Tengine-Ingress網關架構圖

Tengine-Ingress在Tengine基礎上新增很多新特性和功能,最顯著的變化是配置動态無損生效,無論是應用域名新增和路由變更,還是證書新增和加簽域名,都無需tengine reload,配置無損實時生效,長連接配接保持不變,成功率不受影響,應用變更效率提升翻倍,叢集穩定性進一步得到增強。支援分域名和單證書獨立分批次逐級生效,使用者可按需中斷和繼續變更,應用側風險可控,變更影響面小。TLS加解密允許同時加載ECC,RSA和國密多證書。

在應用域名灰階方面,支援基于request header,header值,header值正則比對,cookie和權重的流量切分,滿足應用在灰階釋出,藍綠部署和A/B測試不同場景的需求。在可觀測性方面,支援應用分域名獨立監控,使用者可實時檢視單域名QPS,成功率,RT和封包大小相關的監控資訊。Tengine-Ingress複用k8s ingress注解(進階配置)規範,基于内部運作時共享記憶體,通過tengine ingress模闆構造HTTP(S)進階功能,支援動态無損實時生效,滿足使用者基于不同應用場景下的HTTP(S)進階配置需求,例如使用者可配置應用域名是否允許網絡爬蟲和應用域名CORS (跨域資源共享)。綜上所述,Tengine-Ingress在應用配置更新模型,系統穩定性,TLS加解密,灰階路由,可觀測,HTTP(S)進階配置等多方面得到了顯著提升。

雲原生

Tengine-Ingress全面相容K8s ingress标準,在此基礎上不斷擴充和完善,相對于原生Kubernetes Ingress和NGINX Ingress,主要有以下優點和增強:

支援域名和證書接入的無損動态實時生效, Tengine-Ingress控制器實時監聽ASI ingress存儲叢集中的ingress域名和secret證書資源對象,在ingress域名和secret證書配置發生變化時,校驗域名和證書配置的合法性和全局一緻性,符合ingress标準和X509證書規範的配置資訊将全量寫入系統共享記憶體。Tengine-Proxy感覺系統共享記憶體變更,strategy程序重新整理運作時共享記憶體,雙緩存切換,worker程序運作時讀取配置動态生效。

Tengine-Ingress 高性能高可用的雲原生網關

圖3. 配置動态生效模型

Tengine-Ingress支援域名同時使用ECC和RSA雙證書,預設原生系統隻能使用單張證書,Tengine-Ingress擴充标準ingress規範,在相容單證書的場景下,滿足ECC和RSA雙證書同時動态生效的應用場景,且可以繼續擴充為ECC,RSA和國密的三證書複雜場景。

tls:
  - hosts:
    - {host1}
    secretName: {secret name1}
  - hosts:
    - {host1}
    secretName: {secret name2}           

Tengine-Ingress在基于雲原生ASI的基礎上,利用标準化的k8s資源ingress和secret分别存儲域名路由配置和TLS證書秘鑰資訊,在此基礎上提出單個ingress域名和單張secret證書分批次逐級生效機制,這不僅滿足了使用者側新增和修改應用域名和證書的灰階需求,同時保障接入層叢集整體運作的穩定性和可靠性。新增下述ingress和secret注解,用于辨別域名和證書逐級分批次灰階範圍。

1. ingress灰階開關
● annotation: nginx.ingress.kubernetes.io/ingress-rollout
注釋:是否灰階ingress
值類型:bool
預設值:false


2. ingress目前版本
● annotation: nginx.ingress.kubernetes.io/ingress-rollout-current-revision
注釋:ingress目前運作版本号
值類型:string
預設值:""


3. ingress更新版本
● annotation: nginx.ingress.kubernetes.io/ingress-rollout-update-revision
注釋:ingress更新版本号
值類型:string
預設值:""


4. ingress灰階範圍
● annotation: nginx.ingress.kubernetes.io/ingress-rollout-index-id
注釋:隻有Pod序号小于ingress-rollout-index-id的Pod才會更新ingress。
○ 0..N-1為Pod所在的序号,從0開始到N-1。
○ For a StatefulSet with N replicas, each Pod in the StatefulSet will be assigned an integer ordinal, from 0 up through N-1, that is unique over the Set.
值類型:number
預設值:-1           

Tengine-Ingress通過全局一緻性校驗機制保障記憶體中運作态持有的使用者側ingress域名和secret證書的有效性和正确性,秒級校驗10w+域名和1000+泛證書,在域名配置和證書資訊不符合标準化k8s資源ingress和secret規範及其相關RFC标準時,将不再更新本地緩存,并實時告警通知,保障運作态永遠可正常向外提供7層轉發服務。新增CRD IngressCheckSum和SecretCheckSum,用于定義全局一緻性校驗資訊。

type IngressCheckSum struct {  metav1.ObjectMeta
  Spec IngressCheckSumSpec
}


type IngressCheckSumList struct {
  metav1.TypeMeta
    metav1.ListMeta
  Items []IngressCheckSum
}


type IngressCheckSumSpec struct {
  // `Timestamp` is the time when the md5 of all the ingress was calculated.
  Timestamp metav1.Time
  // `Checksum` is the md5 of all the ingress.
  Checksum string
  // `ids` describes which id will match this ingress.
  Ids []string
}           

Tengine-Ingress複用k8s ingress注解(進階配置)規範,基于内部運作時共享記憶體,通過tengine ingress模闆構造HTTP(S)進階功能,支援ingress注解動态實時生效,滿足使用者基于不同應用場景下的HTTP(S)進階配置需求。

Tengine-Ingress在相容ingress canary注解的基礎上,支援基于request header,header值,header值正則比對,cookie和權重的流量切分,無需tengine reload,所有應用域名的ingress金絲雀規則實時動态無損生效。

Tengine-Ingress 高性能高可用的雲原生網關

圖4. 基于“Header值”和“服務權重”的灰階路由組合

ingress标準:https://kubernetes.io/docs/concepts/services-networking/ingress/

X509證書規範:https://datatracker.ietf.org/doc/html/rfc5280

ingress canary注解:https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#canary

高可用

Tengine-Ingress作為7層流量入口網關應用AServer-Ingress的技術底座,對于高可用有嚴苛的要求。任何的變更操作都必須可灰階,可監控,可復原。然而,K8s原生資源對象包括ingress域名,secret證書,configmap配置,service服務等,在被寫入etcd後,所有監聽控制器預設都會處理資源對象的配置更新,即相同命名空間内的所有Pod會同時加載新的配置對象,如果配置存在錯誤和髒資料,變更影響将會觸發全局風險,導緻線上事故。

統一接入每天大約存在上百次的應用域名新增,修改和删除的變更操作,每周都存在數十次的證書新增和加簽域名的變更操作,接入層任何一次應用域名和證書的配置變更都至關重要。Tengine-Ingress作為雲原生網關,必然通過K8s API處理和驗證資源對象,這就需要我們擴充支援ingress應用域名和secret證書的灰階能力,保障變更操作的可灰階,可中斷和可復原。

以ingress應用域名變更為例,按照相同命名空間内Tengine-Ingress Pod數量,通過新增的ingress灰階注解确定每批次ingress資源對象動态生效的Pod範圍。配置變更Pod範圍内的Tengine-Ingress監聽到ingress資源對象的更新事件,校驗域名配置的合法性和全局一緻性,将符合ingress标準的配置資訊全量寫入系統共享記憶體。在ingress域名分批次灰階生效的變更過程中,使用者可以基于應用域名成功率等監控名額随時主動終止和復原本次配置變更,将風險縮小到可控範圍内,保障應用域名變更的可灰階,可監控,可復原。

Tengine-Ingress 高性能高可用的雲原生網關

圖5. Ingress域名和Secret證書配置分批次逐級生效模型

Tengine-Ingress通過ASI core叢集與ASI ingress存儲叢集相隔離的高可靠性方案,将運作态和存儲态相分離,獨立ASI ingress叢集可以保證自身API伺服器和etcd性能穩定,并且在core叢集核心元件API伺服器和etcd不可用的高危場景下也能正常向外提供7層轉發服務。以ASI ingress存儲叢集标準3執行個體API伺服器 (16C64G, 100G ESSD)和3執行個體etcd (8C32G, 100G ESSD) 資源規格為條件,2萬個ingress域名資源對象 (1KB大小) 作為背景資料,以10 QPS更新ingress資源對象,随着Tengine-Ingress pod個數的增加,監聽ingress配置更新的時延也會相應增加,即使是上萬級别超大規模叢集,資源watch和list的時延均在可控範圍内。

Tengine-Ingress 高性能高可用的雲原生網關

表1. Ingress存儲叢集性能基線

K8s分布式系統本身可以保障單個ingress資源的一緻性,但分布式環境是無法保證使用者存儲在etcd中ingress域名配置的全局正确性和全局完整性,并且在API伺服器和etcd不可用的情況下,ingress域名配置的可用性更是無法保障。

是以,Tengine-Ingress提出了一種分布式環境下ingress全局一緻性方案,在新增和更新域名時,Tengine-Ingress基于ingress全局一緻性校驗算法計算全局MD5值,與CRD ingresschecksums資源對象中的MD5值相比對,則表明本次更新的ingress資源對象是全局一緻性,即可将ingress資源對象更新到本地緩存,并寫入共享記憶體,開始使用最新的ingress域名配置對外提供HTTP(S)七層負載均衡,TLS解除安裝和路由轉發功能;否則表明更新的ingress資源對象全局不一緻,系統存在髒資料,不再更新本地緩存和共享記憶體,仍舊使用存量的ingress域名配置對外提供HTTP(S)接入服務,保證運作态域名接入和路由服務的正确性和可靠性。

Tengine-Ingress 高性能高可用的雲原生網關

圖6. Ingress域名配置全局一緻性校驗模型

分布式系統K8s的核心元件是API伺服器和etcd,etcd作為K8s叢集中配置資料的存儲元件,而API伺服器對外提供标準接口處理用戶端請求并更新資源對象在etcd中的狀态,進而允許用戶端在工作節點之間配置各種流量負載和容器。

是以,在API伺服器和etcd因内部或外部原因導緻其不可正常提供服務的情況下,用戶端必然會出現各種服務異常。針對ingress資源對象,用戶端将無法正常通過API伺服器的接口擷取ingress的更新配置,并且在API伺服器或etcd異常誤删除等特殊場景下,系統會錯誤地觸發ingress删除事件,用戶端會清空域名配置,這将導緻用戶端無法再對外提供HTTP(S)接入服務。基于分布式環境下ingress全局一緻性方案,Tengine-Ingress在全局MD5值無法正常比對或比對失敗的情況下,預設系統資料不再信任可靠,Tengine-Ingress進入自保護狀态,不再更新本地緩存,仍舊使用緩存中存量的ingress域名配置繼續對外提供HTTP(S)接入服務。Secret證書資源對象采用了類似的全局一緻性方案。

綜上所述,基于分布式環境下ingress和secret全局一緻性方案,Tengine-Ingress保證使用者存儲在etcd中ingress域名和secret證書配置的全局正确性和全局完整性,并且在分布式系統K8s核心元件API伺服器或etcd不可用的情況下,仍然可以保障ingress域名和secret證書配置的可用性,對外提供永不停機的HTTPS接入服務。

Tengine-Ingress 高性能高可用的雲原生網關

圖7. Ingress全局一緻性校驗流程圖

高性能

阿裡集團web端标準接入網關基于遠端Keyless服務擷取TLS私鑰,新架構AServer-Ingress應用本地TLS加解密,對比新舊架構在HTTPS短連結場景下的性能差異。壓測模型使用HTTPS短連接配接,TLS 1.2協定ECDHE-RSA-AES128-GCM-SHA256算法,後端應用傳回22KB響應封包,被壓機Pod使用32核96G記憶體。

Tengine-Ingress 高性能高可用的雲原生網關

表2. 被壓環境

Tengine-Ingress 高性能高可用的雲原生網關

表3. 壓測模型

RT:由于Tengine-Ingress在TLS握手過程中減少了與遠端Keyless服務的互動過程,HTTPS 1.1短連結場景下Tengine-Ingress相比Tengine,請求平均響應時間 (RT) 可降低約9ms。

Tengine-Ingress 高性能高可用的雲原生網關

圖8. RT性能對比資料

Tengine-Ingress 高性能高可用的雲原生網關

表4. TLS握手時延細分對比

CPU:Tengine在HTTPS建鍊過程中消耗的CPU由遠端Keyless服務與本端Tengine-Proxy兩部分組成,而Tengine-Ingress在本端完成所有的TLS加解密。對比相同QPS所消耗的CPU,換算成CPU消耗比例,Tengine-Ingress消耗67.3% CPU,而Tengine需要消耗81.9% CPU,Tengine-Ingress在HTTPS短連結場景下性能提升約20.7%。

Tengine-Ingress 高性能高可用的雲原生網關

圖9. CPU開銷對比資料

Mem:由于Tengine實際運作時會加載大量的應用域名和路由的靜态配置資訊,32個worker程序需要各自申請一份記憶體,整個程序樹就會占用較多的記憶體;而Tengine-Ingress使用動态配置,所有32個worker程序共享一份應用域名和路由配置資訊,記憶體使用大幅下降,記憶體占用由20.4%下降至8.8%。

Tengine-Ingress 高性能高可用的雲原生網關

圖10. 記憶體消耗對比資料

現狀和展望

Tengine-Ingress已全場景覆寫阿裡集團線上,預發和日常的網際網路,VPN辦公網,辦公網和内網所有應用場景。Tengine-Ingress已承載十萬級規模應用域名,記憶體消耗下降57%,HTTPS短連結場景下,性能提升約20.7%,請求RT平均下降36%,Tengine-Ingress作為高性能高可用的雲原生網關得到了初步的考驗。

确定開源Tengine 3.0功能特性範圍:更新nginx core穩定版本;基于XQUIC支援QUIC和HTTP3協定;基于k8s ingress标準規範,支援域名和證書無損動态生效,ingress域名和secret證書配置的灰階分批生效,ingress和secret全局一緻性校驗,ECC和RSA雙證書,分布式環境下動态服務發現,應用域名的灰階釋出,藍綠部署和A/B測試;基于XUDP支援bypass核心的使用者态高性能UDP轉發。

展望未來,Tengine将向通用API網關方向持續演進和發展,在HTTP應用流量入口網關的基礎上,逐漸支援4/7層TLS,TCP,UDP和GRPC多協定路由能力,适配不同終端和不同應用,打造全場景通用網關,持續保持Tengine業界領先地位。

Tengine官網:https://tengine.taobao.org

Tengine-Ingress開源倉庫:https://github.com/alibaba/tengine-ingress

Tengine開源倉庫:https://github.com/alibaba/tengine

XQUIC開源倉庫:https://github.com/alibaba/xquic

XUDP開源倉庫:https://gitee.com/anolis/libxudp

作者:海蒼

來源:微信公衆号:阿裡巴巴終端技術

出處:https://mp.weixin.qq.com/s/G2c5yz5dDcZ0BGNlSz8VXg

繼續閱讀