Knative Serving 0.11.0 版本变更,


前言

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

相关内容