首頁 >後端開發 >Golang >分析Kubernetes gRPC負載平衡(L4 vs L7 )

分析Kubernetes gRPC負載平衡(L4 vs L7 )

藏色散人
藏色散人轉載
2021-11-16 14:53:352358瀏覽

本文由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 git@github.com:jxlwqq/grpc-lb.gitcd grpc-lb

Makefile 介紹

安裝protoc-gen-go 和protoc-gen-grpc基於proto文件,產生*_pb.go 和*_grpc.pb.go建構docker 映像在叢集中部署服務#刪除服務#注入Istio 邊車
指令 說明
##make init
make protoc
#make docker-build
make kube-deploy
make kube-delete
make istio-inject
#具體邏輯,請查看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 )的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:learnku.com。如有侵權,請聯絡admin@php.cn刪除