掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
本文由go語言教程欄目給大家介紹Kubernetes中的gRPC負載均衡 ,希望對需要的朋友有所幫助!

創(chuàng)新互聯(lián)是專業(yè)的中寧網(wǎng)站建設(shè)公司,中寧接單;提供網(wǎng)站制作、網(wǎng)站建設(shè),網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進行中寧網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!
下載安裝 Docker Desktop ,并啟動內(nèi)置的 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
| 命令 | 說明 |
|---|---|
make init |
安裝 protoc-gen-go 和 protoc-gen-grpc |
make protoc |
基于 proto 文件,生成 *_pb.go 和 *_grpc.pb.go |
make docker-build |
構(gòu)建 docker 鏡像 |
make kube-deploy |
在集群中部署服務(wù) |
make kube-delete |
刪除服務(wù) |
make istio-inject |
注入 Istio 邊車 |
具體邏輯,請查看 Makefile 文件。
所謂的四層就是基于 IP + 端口的負載均衡,而七層就是基于 URL 等應(yīng)用層信息的負載均衡; Kubernetes 內(nèi)置的 Service 負載均衡基于 iptables/ipvs 實現(xiàn),僅支持 L4。換句話說, Service 支持 HTTP/1.1 協(xié)議,不支持 HTTP/2 協(xié)議。
而 Envoy(Istio) 則更為全能,支持被 gRPC 請求和響應(yīng)的作為路由和負載均衡底層的所有 HTTP/2 功能。
本項目分別測試 Service 和 Envoy(Istio) 對 HTTP/RPC 負載均衡的支持情況。
服務(wù)端 server 在 Kubernetes 集群中以 Deployment 的方式部署 3 個副本,3 個副本的 Pod 名稱各不相同,而 client-http 和 client-grpc 則會每秒調(diào)用一次服務(wù)端,并打印返回值。如果返回值中,三個 Pod 的名稱都存在,則表明正在進行有效的負載均衡,否則,則表明未進行有效的負載均衡。
構(gòu)建鏡像:
make docker-build # 構(gòu)建鏡像(構(gòu)建好的鏡像,不 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 # 在集群中部署服務(wù)
查看 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 請求在進行無效負載。
我們在集群中已經(jīng)部署了一個 Istio,但是沒有設(shè)置自動注入的命令空間,所以我們在這里進行手動注入。
手動注入:
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
make kube-delete istioctl experimental uninstall --purge

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流