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

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

浏览次数:1331次
信息来源: 银河系资源网
更新日期: 2022-05-14
文章简介

本文由go语言教程栏目给大家介绍Kubernetes中的gRPC负载均衡 ,希望对需要的朋友有所帮助! 安装环境依赖docker-desktop >= 4....

本文由go语言教程栏目给大家介绍Kubernetes中的gRPC负载均衡 ,希望对需要的朋友有所帮助!

安装环境依赖

  • docker-desktop >= 4.1.1
  • kubernetes >= 1.21.5
  • go >= 1.17
  • protobuf >= 3.17.3
  • istioctl >= 1.11.4

下载安装 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 [email protected]: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          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 )的详细内容

标签: 暂无标签
分析PHP7.2忽略父类方法以及Liskov替换原则相关问题
« 上一篇
看看PHP有哪四种方法实现交换两个整型变量
下一篇 »
  • php 怎么将json数据转成utf8
    45038阅读
    php将json数据转成utf8的方法:1、创建一个PHP示例文件;2、通过“json_encode($xm_json,JSON_UNESCAPED_UNICODE);”将json数组保存为utf8即可。本文操作环境:windows7系统、PHP7.1版、DELL G3电脑php 怎么将json数...
  • php安装 liunx参数有哪些
    6358阅读
    Linux安装PHP配置参数有:1、“--prefix”;2、“--with-config-file-path”;3、“--with-MySQL”;4、“--enable-safe-mode”;5、“--enable-zip”等等。本文操作环境:linux5.9.8系统、PHP7.1版、DELL G3电脑php...
  • php图片显示一片乱码怎么办
    2284阅读
    php图片显示一片乱码的解决办法:1、打开相应的PHP代码文件;2、在页面头部加上“header("Content-Type:image/jpg");”代码声明图片类型即可。本文操作环境:windows7系统、PHP7.1版、DELL G3电脑php图片显示一片乱码...
  • 如何解决php 长度不足问题
    2262阅读
    php长度不足的解决办法:1、创建一个PHP示例文件;2、通过“str_pad($value,2,0,STR_PAD_LEFT);”方式实现字符串固定长度不够补充其他字符串即可。本文操作环境:windows7系统、PHP7.1版、DELL G3电脑如何解决php 长...
  • php sql 字符串怎么转日期
    2085阅读
    php sql字符串转日期的方法:1、通过“date("Y-m-d",strtotime(""));”方式转换;2、通过“date("M-d-Y",mktime(0,0,0,$month,$day,$year));”方式转换。本文操作环境:windows7系统、PHP7.1版、DELL G3电脑php sql ...
  • 看看PHP有哪四种方法实现交换两个整型变量
    2081阅读
    看看PHP有哪四种方法实现交换两个整型变量?交换两个整型变量使用一个中间变量这种是最容易理解的$a = 1; $b = 2; $temp = $a; $a = $b; $b = $temp; var_dump($a, $b);不使用中间变量,就靠几次加减巧妙转换$a = 10...
  • php数组怎么求平均值
    1951阅读
    php数组求平均值的方法:1、用array_sum()计算数组中所有元素之和,语法“array_sum($arr)”;2、用count()获取数组中的元素个数,语法“count($arr)”;3、用“元素和/元素个数”语句计算出数组平均值。本教程操作环...
  • php 怎么判断错误次数
    1865阅读
    php判断错误次数的实现方法:1、实例化redis数据库;2、模拟数据库信息;3、接受用户输入信息;4、判断信息输入错误的次数即可。本文操作环境:Windows7系统、PHP7.1版、DELL G3电脑php 怎么判断错误次数?php 结合r...
  • php怎么实现点击删除代码
    1852阅读
    php实现点击删除代码的方法:1、创建一个PHP示例文件,并连接数据库;2、查询数据库;3、在超链接删除处调用javascript方法,并传递记录id即可。本文操作环境:windows7系统、PHP7.1版、DELL G3电脑php怎么实现点击删...
  • php 怎么把网页转换成图片格式
    1803阅读
    php把网页转换成图片格式的方法:1、装chrome-php/chrome;2、安装chromium;3、通过控制器实现转换逻辑即可。php 怎么把网页转换成图片格式?PHP将整个网页html转换为图片并保存【含滚屏】1、安装chrome-php/chrome...

如本文对您有帮助,随意赞赏一下!