Rumah >pembangunan bahagian belakang >Golang >Menganalisis pengimbangan beban gRPC Kubernetes (L4 lwn L7)
Artikel ini diperkenalkan oleh ruangan tutorial go language untuk memperkenalkan pengimbangan beban gRPC di Kubernetes. Saya harap ia dapat membantu rakan yang memerlukan.
Muat turun dan pasang Desktop Docker dan mulakan kluster Kubernetes terbina dalam.
# 安装 Gobrew install go# 安装 Protobufbrew install protobuf# 安装 Istiobrew install istioctl kubectl config use-context docker-desktop istioctl install -y
github.com/jxlwqq/grpc-lb
Tarik kod:
git clone git@github.com: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 |
构建 docker 镜像 |
make kube-deploy |
在集群中部署服务 |
make kube-delete |
删除服务 |
make istio-inject |
注入 Istio 边车 |
Untuk logik tertentu, sila lihat fail Makefile.
Lapisan empat yang dipanggil ialah pengimbangan beban berdasarkan port IP, manakala lapisan tujuh ialah pengimbangan beban berdasarkan maklumat lapisan aplikasi seperti URL; Kubernetes Pengimbangan beban Perkhidmatan terbina dalam adalah berdasarkan iptables/ipvs dan hanya menyokong L4. Dengan kata lain, Perkhidmatan menyokong protokol HTTP/1.1 tetapi tidak menyokong protokol HTTP/2.
Envoy (Istio) lebih serba boleh dan menyokong semua fungsi HTTP/2 yang diminta dan dibalas oleh gRPC sebagai penghalaan asas dan pengimbangan beban.
Projek ini menguji sokongan Perkhidmatan dan Utusan (Istio) untuk pengimbangan beban HTTP/RPC masing-masing.
Pelayan menggunakan 3 salinan dalam gugusan Kubernetes dalam bentuk Deployment Nama Pod bagi 3 salinan adalah berbeza, dan klien -http dan klien-grpc akan memanggil pelayan sekali setiap saat dan mencetak nilai pulangan. Jika ketiga-tiga nama Pod wujud dalam nilai pulangan, ini menunjukkan bahawa pengimbangan beban yang berkesan sedang dilakukan, sebaliknya, ini menunjukkan bahawa pengimbangan beban yang berkesan tidak dilakukan.
Membina imej:
make docker-build # 构建镜像(构建好的镜像,不 push 到远程仓库中)
Lihat imej:
docker images ls
Kembali:
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
Kerahkan ke kluster:
make kube-deploy # 在集群中部署服务
Lihat Pod:
kubectl get pods
Kembali:
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
Lihat log klien-http Pod :
export CLIENT_HTTP_POD=$(kubectl get pod -l app=client-http -o jsonpath={.items..metadata.name})kubectl logs "${CLIENT_HTTP_POD}"
Pemulangan:
#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
Lihat log Pod client-grpc:
export CLIENT_GRPC_POD=$(kubectl get pod -l app=client-grpc -o jsonpath={.items..metadata.name})kubectl logs "${CLIENT_GRPC_POD}"
Pemulangan:
#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
Anda boleh melihatnya Di luar kotak, permintaan HTTP melakukan muatan, manakala permintaan RPC melakukan muatan.
Kami telah menggunakan Istio dalam kelompok, tetapi tiada ruang arahan untuk suntikan automatik, jadi kami melakukan suntikan manual di sini.
Suntikan manual:
make istio-inject # 注入 Istio 边车
Lihat Pod:
kubectl get pods
Pulangan:
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
Lihat log Pod klien-http:
export CLIENT_HTTP_POD=$(kubectl get pod -l app=client-http -o jsonpath={.items..metadata.name})kubectl logs "${CLIENT_HTTP_POD}"
Pulangan:
#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
Lihat log klien-grpc Pod:
export CLIENT_GRPC_POD=$(kubectl get pod -l app=client-grpc -o jsonpath={.items..metadata.name})kubectl logs "${CLIENT_GRPC_POD}"
Pulangan:
#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
Anda boleh lihat , kedua-dua permintaan HTTP dan permintaan RPC sedang melaksanakan muatan.
make kube-delete istioctl experimental uninstall --purge
Atas ialah kandungan terperinci Menganalisis pengimbangan beban gRPC Kubernetes (L4 lwn L7). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!