业务中要在kubernetes中接入grpc, 之前写过一篇文章测试过grpc服务在kubernetes中由于http/2长连接的特性无法达到负载均衡效果, 上次使用的是直接在业务中引用kubernetes的list/watch机制,这次使用istio,同样可以实现grpc的负载均衡.
如上所说, 直接在业务代码中引用第三方库来实时地获取服务的ep变化情况,从而实现grpc的负载均衡, 测试情况可参考这里
近期在调研istio, 学习一段时间之内, 发现istio中的eds对象是实时地获取服务的ep情况, 这个特性是不是可以直接实现grpc的负载均衡功能.
需要指出的是,这次grpc服务端的svc使用的是clusterip类型,而不必一定是headless svc.
Kubernetes & Istio
首先有个kubernetes跟istio环境, 在这里就不细说安装流程了,各自的官网都有详细说明
grpc
准备一个grpc服务的demo,代码很简单,服务端跟客户端各自打印对方的容器地址,来反映负载均衡效果,详细的代码及使用方法在这里, 大家可参考
测试
先启动一个服务端,一个客户端,很平常,
服务端个数一个保持不变,客户端进行扩容,从一个扩到三个,这时在服务端显示有3个客户端的请求
客户端个数三个保持不变, 服务端进行扩容,从一个扩容至五个,这下图可以从客户端发现,请求被均匀地分配给了服务端的5个地址, 说明,通过istio是可以实现grpc服务的负载均衡效果的
最后,测试了服务端的缩容操作,从五个降至一个, 客户端也能实时地发现服务的变动, 如上图下半部分所示。
结论
从测试的结论可以看出, 在istio的流量管理的作用下, grpc服务不需要做额外的操作即可实现负载均衡效果, 原因就是因为istio的xds是动态模型, 得到cluster后,根据cluster 实时地查询endpoint列表,然后再根据istio中配置的负载均衡配置(默认是roundbalance)直接路由到endpoint,而不需要经过kubernetes中的service(kube-proxy)机制