前言
Knative Serving v0.11.0 版本已經于 12 月 11 号正式釋出。本次版本繼續優化activator負載均衡能力,這次解決了并發數為10的場景,測試結果顯示大部分請求在0.14秒完成,具體細節見以下内容。
主要變更
改進在低并發下的負載均衡
點我檢視設計文檔(google docs)
回顧上一個版本的變更,為了讓activator把請求更均勻發送到pod上,引入了two random choices算法,并且為了解決多個activator的場景,把pod配置設定給特定的activator來處理。舉個例子,假如有2個activator,5個pod,每個activator會配置設定到2個pod,最後剩下的按順序配置設定,也就是第一個activator負責3個pod,第二個負責兩個pod。這樣實作後,發現如果并發數是1的時候效果不錯,但并發數是10的時候效果不好。
目前的問題是如何處理剩下的pod如何平均配置設定流量。作者新的方案是去掉了two random choices算法,改用knative裡面的breaker來實作,通過設定容量達到平分的目的。具體算法如下,假設有2個activator,5個pod,并發數是10,則每個activator的容量為 5 * 10 / 2 = 25。另外每個pod的podIPTracker裡面有個breaker,根據之前的配置設定政策,每個activator獨自向兩個pod發送,podIPTracker裡面的breaker容量都是10,但還剩下一個pod,把這個pod的容量設定為10/2=5,也就是說對于這個pod,每個activator最多同時給它5個并發。
這次改動後,每次請求先判斷這個pod的容量是否滿了,如果沒滿會先發送給它處理,這樣會讓請求優先塞滿第一個pod,才會到第二個pod。作者認為這樣後面縮容時,可以針對空閑的進行縮容。
網絡接入層引入Kourier
Kourier是第一個Knative原生的入口實作,直接調和knative網絡層CRD到Envoy裡面。它作為istio的替換品之一,更輕量的提供入口流量路由服務,目前在0.11版本中把Kourier作為Knative e2e內建測試的一個選項。
其他變更
擴縮容
- 減少K8s services的數量,每個Revision3個減為2個,metrics service 改用 private service
- 修複livenessProbe導緻無法縮容的問題
- 修複Target annotation 可以覆寫預設值
- 在HPA的PodAutoscalers也彙報desired/actual名額
核心API
- 改進鏡像tag解析的錯誤資訊
- 允許在PodSpec使用
imagePullSecrets
- 分離 預設值和校驗的webhooks
網絡
- 相容 Istio 1.4,這個版本引入了正規表達式的長度限制 #6058
- 內建 istio/client-go #5969
- 當VirtualService調解失敗後,更新LoadBalancerReady condition #6048
- 端口命名方式遵循Istio約定 #5070
參考
文章來自于對knative release note的翻譯和解讀