• 技术文章 >后端开发 >Golang

    分析Kubernetes gRPC负载均衡(L4 vs L7 )

    藏色散人藏色散人2021-11-16 14:53:48转载731
    本文由go语言教程栏目给大家介绍Kubernetes中的gRPC负载均衡 ,希望对需要的朋友有所帮助!

    安装环境依赖

    下载安装 Docker Desktop ,并启动内置的 Kubernetes 集群。

    # 安装 Gobrew install go# 安装 Protobufbrew install protobuf# 安装 Istiobrew install istioctl
    kubectl config use-context docker-desktop
    istioctl 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 负载均衡的支持情况。

    测试原理

    服务端 server 在 Kubernetes 集群中以 Deployment 的方式部署 3 个副本,3 个副本的 Pod 名称各不相同,而 client-http 和 client-grpc 则会每秒调用一次服务端,并打印返回值。如果返回值中,三个 Pod 的名称都存在,则表明正在进行有效的负载均衡,否则,则表明未进行有效的负载均衡。

    测试 Service

    构建镜像:

    make docker-build # 构建镜像(构建好的镜像,不 push 到远程仓库中)

    查看镜像:

    docker images ls

    返回:

    REPOSITORY            TAG       IMAGE ID       CREATED          SIZE
    grpc-lb/client-grpc   latest    95d32ead8d9b   12 seconds ago   16.6MB
    grpc-lb/client-http   latest    dbf0341206f6   22 seconds ago   11.5MB
    grpc-lb/server        latest    1ef346785b2a   29 seconds ago   18.2MB

    部署到集群中:

    make kube-deploy  # 在集群中部署服务

    查看 Pod:

    kubectl get pods

    返回:

    NAME                           READY   STATUS    RESTARTS   AGE
    client-grpc-6c565594f4-tdf75   1/1     Running   0          2m48s
    client-http-55d95c744d-f7nx4   1/1     Running   0          2m49s
    server-7c4bfd74d-29c69         1/1     Running   0          2m51s
    server-7c4bfd74d-4btvw         1/1     Running   0          2m51s
    server-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   AGE
    client-grpc-7864f57779-f6blx   2/2     Running   0          17s
    client-http-f8964854c-jclkd    2/2     Running   0          21s
    server-7846bd6bb4-bcfws        2/2     Running   0          27s
    server-7846bd6bb4-fv29s        2/2     Running   0          40s
    server-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-delete
    istioctl experimental uninstall --purge

    以上就是分析Kubernetes gRPC负载均衡(L4 vs L7 )的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:learnku,如有侵犯,请联系admin@php.cn删除
    专题推荐:Kubernetes gRPC
    上一篇:一文解析Go中Int的最大数值 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • GRPC:谷歌发布的首款基于HTTP/2和protobuf的RPC框架• golang grpc无法安装原因• go语言grpc环境搭建的方法详解• 详解Windows10+golang+gRPC环境搭建
    1/1

    PHP中文网