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 集群。
# 安装 Go
brew install go
# 安装 Protobuf
brew install protobuf
# 安装 Istio
brew install istioctl
kubectl config use-context docker-desktop
istioctl install -y
项目地址
https://github.com/jxlwqq/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 负载均衡的更多相关文章
- 【译】gRPC负载均衡
原文地址:https://github.com/grpc/grpc/blob/master/doc/load-balancing.md gRPC负载均衡 范围 本文档解释了gPRC的负载均衡的设计. ...
- gRPC负载均衡(客户端负载均衡)
前言 上篇介绍了如何使用etcd实现服务发现,本篇将基于etcd的服务发现前提下,介绍如何实现gRPC客户端负载均衡. gRPC负载均衡 gRPC官方文档提供了关于gRPC负载均衡方案Load Bal ...
- gRPC负载均衡(自定义负载均衡策略)
前言 上篇文章介绍了如何实现gRPC负载均衡,但目前官方只提供了pick_first和round_robin两种负载均衡策略,轮询法round_robin不能满足因服务器配置不同而承担不同负载量,这篇 ...
- 一步一步在Windows中使用MyCat负载均衡 下篇
之前在 一步一步在Windows中使用MyCat负载均衡 上篇 中已经讲了如何配置出MyCat.下面讲其相关的使用. 五.配置MyCat-eye 对于MyCat监控官网还提供一个MyCat-eye w ...
- Linux中keepalived+LVS负载均衡的搭建测试
1.1 LVS简介 LVS(Linux Virtual Server),也就是Linux虚拟服务器, 是一个自由软件项目.使用LVS技术要达到的目标是:通过LVS提供的负载均衡技术和Lin ...
- 一步一步在Windows中使用MyCat负载均衡
一步一步在Windows中使用MyCat负载均衡 http://www.cnblogs.com/zhangs1986/p/6408981.html mycat+sqlServer简单demo配置 ...
- LVS集群中的IP负载均衡技术
LVS集群中的IP负载均衡技术 章文嵩 (wensong@linux-vs.org) 转自LVS官方参考资料 2002 年 4 月 本文在分析服务器集群实现虚拟网络服务的相关技术上,详细描述了LVS集 ...
- Kubernetes:服务与负载均衡
Blog:博客园 个人 参考:Service | Kubernetes.<Kubernetes进阶实战> 有了 Workload,我们可以方便地管理多实例的应用,但是要想能够方便地访问应用 ...
- ASP.NET中如何实现负载均衡
ASP.NET站点中做负载均衡: 基于HTTP协议我们可能发现我们要解决两点问题: 第一,做到负载均衡,我们需要一个负载均衡器. 可以通过DNS轮询来做,在DNS服务器上配置为每次对我们做负载均衡的同 ...
随机推荐
- 使用AC自动机解决文章匹配多个候选词问题
解决的问题 KMP算法用于单个字符串匹配,AC自动机用于文章中匹配多个候选词. 流程 第一步,先将候选词先建立前缀树. 第二步,以宽度优先遍历的方式把前缀树的每个节点设置fail指针, 头节点的fai ...
- 如何从阿里云Code升级至云效Codeup
如果你还在使用阿里云Code,不防看看如何从阿里云Code升级至云效Codeup,云效代码管理Codeup是阿里云出品的一款企业级代码管理平台,提供代码托管.代码评审.代码扫描.质量检测等功能,全方位 ...
- 在Anaconda环境下安装Tensorflow
安装Anaconda 下载Anaconda 个人版Individual Edition.如果下载速度慢,可以复制下载链接到迅雷或者在清华大学开源镜像站TUNA中找合适的版本. 注意在安装过程中的&qu ...
- python自定义翻页配置
1.创建pager.py文件,针对翻页进行函数书写 class PageInfo(object): # current_page 当前页数 # all_count 所有行 # per_page 每页的 ...
- 七牛云的 python sdk 是如何 批量删除资源的
今天做项目的时候用到七牛云,关于对资源的操作是在后端做的,用的SDK,但是,在网上没找到详细的解析,官方文档也没有太详细的解说,所以无奈只好看下源码 这里做一下简单的记录 from qiniu imp ...
- WPF实现Win10汉堡菜单
WPF开发者QQ群: 340500857 | 微信群 -> 进入公众号主页 加入组织 前言 有小伙伴提出需要实现Win10汉堡菜单效果. 由于在WPF中没有现成的类似UWP的汉堡菜单,所以我们 ...
- PAT (Basic Level) Practice (中文)1025 反转链表 (25分)
1025 反转链表 (25分) 给定一个常数 K 以及一个单链表 L,请编写程序将 L 中每 K 个结点反转.例如:给定 L 为 1→2→3→4→5→6,K 为 3,则输出应该为 3→2→1→6→5→ ...
- Ysoserial Commons Collections7分析
Ysoserial Commons Collections7分析 写在前面 CommonsCollections Gadget Chains CommonsCollection Version JDK ...
- 【c++ Prime 学习笔记】第2章 变量和基本类型
2.1 基本内置类型 基本数据类型包含了算术类型(arithmetic type)和空类型(void) 算数类型,包含了字符.整型数.布尔值和浮点数 空类型,不对应具体的值 2.1.1 算术类型 算术 ...
- win 常用修复蓝屏,系统比对最后更新20210804
您可以尝试以下方案: 在管理员命令提示符下键入以下命令:Dism /Online /Cleanup-Image /ScanHealth这条命令将扫描全部系统文件并和官方系统文件对比,扫描计算机中的不一 ...