前言
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的翻译和解读