本文由go语言教程栏目给大家介绍kubernetes中的grpc负载均衡 ,希望对需要的朋友有所帮助!
安装环境依赖docker-desktop >= 4.1.1kubernetes >= 1.21.5go >= 1.17protobuf >= 3.17.3istioctl >= 1.11.4下载安装 docker desktop ,并启动内置的 kubernetes 集群。
# 安装 gobrew install go# 安装 protobufbrew install protobuf# 安装 istiobrew install istioctlkubectl config use-context docker-desktopistioctl install -y
项目地址github.com/jxlwqq/grpc-lb
拉取代码:
git clone git@github.com:jxlwqq/grpc-lb.gitcd grpc-lb
makefile 介绍命令说明
make init 安装 protoc-gen-go 和 protoc-gen-grpc
make protoc 基于 proto 文件,生成 *_pb.go 和 *_grpc.pb.go
make docker-build 构建 docker 镜像
make kube-deploy 在集群中部署服务
make kube-delete 删除服务
make istio-inject 注入 istio 边车
具体逻辑,请查看 makefile 文件。
l4 vs l7 负载均衡所谓的四层就是基于 ip + 端口的负载均衡,而七层就是基于 url 等应用层信息的负载均衡; kubernetes 内置的 service 负载均衡基于 iptables/ipvs 实现,仅支持 l4。换句话说, service 支持 http/1.1 协议,不支持 http/2 协议。
而 envoy(istio) 则更为全能,支持被 grpc 请求和响应的作为路由和负载均衡底层的所有 http/2 功能。
项目架构本项目分别测试 service 和 envoy(istio) 对 http/rpc 负载均衡的支持情况。
cmd/server/main.go: 服务端,同时提供 http 和 rpc 服务。响应的数据为服务端容器所在的 pod 名称,(基于 downward api)。cmd/client-http/main.go: http 客户端,通过 http 方式,循环调用服务端接口,并打印返回值。cmd/client-grpc/main.go: grpc 客户端,通过 rpc 方式,循环远程调用服务端方法,并打印返回值。测试原理服务端 server 在 kubernetes 集群中以 deployment 的方式部署 3 个副本,3 个副本的 pod 名称各不相同,而 client-http 和 client-grpc 则会每秒调用一次服务端,并打印返回值。如果返回值中,三个 pod 的名称都存在,则表明正在进行有效的负载均衡,否则,则表明未进行有效的负载均衡。
测试 service构建镜像:
make docker-build # 构建镜像(构建好的镜像,不 push 到远程仓库中)
查看镜像:
docker images ls
返回:
repository tag image id created sizegrpc-lb/client-grpc latest 95d32ead8d9b 12 seconds ago 16.6mbgrpc-lb/client-http latest dbf0341206f6 22 seconds ago 11.5mbgrpc-lb/server latest 1ef346785b2a 29 seconds ago 18.2mb
部署到集群中:
make kube-deploy # 在集群中部署服务
查看 pod:
kubectl get pods
返回:
name ready status restarts ageclient-grpc-6c565594f4-tdf75 1/1 running 0 2m48sclient-http-55d95c744d-f7nx4 1/1 running 0 2m49sserver-7c4bfd74d-29c69 1/1 running 0 2m51sserver-7c4bfd74d-4btvw 1/1 running 0 2m51sserver-7c4bfd74d-fk8zf 1/1 running 0 2m51s
查看 client-http pod 的日志:
export client_http_pod=$(kubectl get pod -l app=client-http -o jsonpath={.items..metadata.name})kubectl logs ${client_http_pod}
返回:
#1: server-7c4bfd74d-4btvw#2: server-7c4bfd74d-4btvw#3: server-7c4bfd74d-29c69#4: server-7c4bfd74d-fk8zf#5: server-7c4bfd74d-fk8zf#6: server-7c4bfd74d-29c69#7: server-7c4bfd74d-fk8zf#8: server-7c4bfd74d-4btvw#9: server-7c4bfd74d-fk8zf
查看 client-grpc pod 的日志:
export client_grpc_pod=$(kubectl get pod -l app=client-grpc -o jsonpath={.items..metadata.name})kubectl logs ${client_grpc_pod}
返回:
#1: server-7c4bfd74d-fk8zf#2: server-7c4bfd74d-fk8zf#3: server-7c4bfd74d-fk8zf#4: server-7c4bfd74d-fk8zf#5: server-7c4bfd74d-fk8zf#6: server-7c4bfd74d-fk8zf#7: server-7c4bfd74d-fk8zf#8: server-7c4bfd74d-fk8zf#9: server-7c4bfd74d-fk8zf
可以看出,http 请求在进行有效负载,而 rpc 请求在进行无效负载。
测试 envoy(istio)我们在集群中已经部署了一个 istio,但是没有设置自动注入的命令空间,所以我们在这里进行手动注入。
手动注入:
make istio-inject # 注入 istio 边车
查看 pod:
kubectl get pods
返回:
name ready status restarts ageclient-grpc-7864f57779-f6blx 2/2 running 0 17sclient-http-f8964854c-jclkd 2/2 running 0 21sserver-7846bd6bb4-bcfws 2/2 running 0 27sserver-7846bd6bb4-fv29s 2/2 running 0 40sserver-7846bd6bb4-hzqj6 2/2 running 0 34s
查看 client-http pod 的日志:
export client_http_pod=$(kubectl get pod -l app=client-http -o jsonpath={.items..metadata.name})kubectl logs ${client_http_pod}
返回:
#1: server-7846bd6bb4-hzqj6#2: server-7846bd6bb4-fv29s#3: server-7846bd6bb4-hzqj6#4: server-7846bd6bb4-hzqj6#5: server-7846bd6bb4-hzqj6#6: server-7846bd6bb4-hzqj6#7: server-7846bd6bb4-hzqj6#8: server-7846bd6bb4-bcfws#9: server-7846bd6bb4-fv29s
查看 client-grpc pod 的日志:
export client_grpc_pod=$(kubectl get pod -l app=client-grpc -o jsonpath={.items..metadata.name})kubectl logs ${client_grpc_pod}
返回:
#1: server-7846bd6bb4-fv29s#2: server-7846bd6bb4-hzqj6#3: server-7846bd6bb4-fv29s#4: server-7846bd6bb4-bcfws#5: server-7846bd6bb4-fv29s#6: server-7846bd6bb4-hzqj6#7: server-7846bd6bb4-fv29s#8: server-7846bd6bb4-bcfws#9: server-7846bd6bb4-fv29s
可以看出,http 请求 和 rpc 请求均在进行有效负载。
清理make kube-deleteistioctl experimental uninstall --purge
以上就是分析kubernetes grpc负载均衡(l4 vs l7 )的详细内容。