前言
Knative Serving v0.10.0 版本已经于 10 月 29 号正式发布。本次版本主要优化了activator负载均衡等能力,具体细节见以下内容。
主要变更
Activator半理想的负载均衡优化
这部分的设计文档见 Better Load Balancing in Activator (google doc)
在对activator负载均衡的优化中,设置 containerConcurrency: 1
后因为排队导致的错误已经解决。在有容器并发数(CC,Container Concurrency)感知负载均衡的activator中,实际看到通过activator比直接访问用户容器有更低的延迟(一般来说增加额外一跳会增加延迟)。当前只实现了CC=1的场景,CC=10的还没完成。
之前版本做过一次优化,由于iptable刷新时间间隔的问题,通过service clusterip发现pod ip会有延迟,如果clusterIP没准备好,会向pod ip直接发送请求。这次的负载均衡优化只是针对向pod ip发送请求的场景,如何均衡的向每个pod发送请求。
作者想到的方案有两个,一个是把请求分配到当前负载最低的那个,第二个是two random choices 算法。有文章建议第一种方案可能更糟糕,第二种方案的实现方式是随机选择两个节点,然后从中选择一个低负载的。测试下来后,当只有一个activator的时候,效果很明显,但是包含多个activator的时候,还是有比较大的延时。作者认为的原因是:1,不同的activator会分配请求到相同的pod,导致排队 2,activator自己的流量不均匀。我理解第一个原因是各个activator没有共享当前pod负载情况,所以导致算法失效,有可能某个pod的请求相对多一些。
解决方案是把pod列表分片,每个activator只向部分pod发送请求。
Kubernetes最低支持版本为1.14
这样可以同时支持多个CRD版本以及试验其他Kubernetes CRD新功能。如果检测到低版本,安装会失败。
使用Go1.13
Serving已经切换到 Go 1.13,在同步上有更好的性能,错误包装(error wrapping)和其他功能,比如 Duration.Milliseconds
。
其他变更
扩缩容
- Service名称不再使用GenerateName,我们在创建metrics和private K8s Service名称使用GenerateName,导致在测试和可靠性上很多问题,所以放弃使用。
- Activator重构和负载均衡,在 @greghaynes 的几个变更后,允许探测和路由请求到独立的pod,可以显著的简化代码,移除重复和不高效的部分。
- 显著提升集成测试,减少偶尔的报错
核心API
- 切换到 K8s 1.15.3 客户端库 #5570 ,这个客户端版本可以让Knative使用K8s的新特性,选择这个版本的原因是它兼容1.14,并且因为兼容K8s 1.16,可以使用更长时间。
- 切换回原来单一的安装方式,同时支持所有API版本,因为支持的K8s最低版本为1.14,这个版本已经解决了CRD多版本共存的问题,所以切换回之前的安装方式。
- 跳过复制last-applied-configuration注解到 Route
- ConfigMaps现在可以并行的校验了
- 分别为编辑和查看添加ClusterRole
- 在Configuration和Route里添加注解 /creator and /lastModifier
- Service和Route加上duck.knative.dev/addressable=true标签,给eventing使用 #5874
网络
- Activator优雅退出 #5542,activator在退出的时候,健康检查还返回成功,导致请求依然路由到退出中的activator,我们让SIGTERM信号触发健康检查失败,允许退出中的activator可以处理完剩余的请求。
- 在AutoTLS关闭的时候,避免创建通配符证书 #5636,在v0.9.0,我们尝试创建通配符证书甚至cert-manager没有部署,导致在创建新namespace时证书创建错误。
- 结束ClusterIngress迁移 #5689
- 改进健康检查支持HTTPS重定向,HTTPS,HTTP2和自定义端口 #5223,之前的健康检查依赖写入VirtualService特定的域名,现在可以探测实际的数据链路,允许使用真正服务的域名探测。
- 修复cluster-local的可见性问题 #5734
- 避免给cluster-local service创建错误的证书 #5611
监控
- 添加容器和pod标签到revision和activator的指标里
参考
本文内容大部分来自于 Knative Serving release note 的解读