Rumah >pembangunan bahagian belakang >Golang >Menganalisis pengimbangan beban gRPC Kubernetes (L4 lwn L7)

Menganalisis pengimbangan beban gRPC Kubernetes (L4 lwn L7)

藏色散人
藏色散人ke hadapan
2021-11-16 14:53:352356semak imbas

Artikel ini diperkenalkan oleh ruangan tutorial go language untuk memperkenalkan pengimbangan beban gRPC di Kubernetes. Saya harap ia dapat membantu rakan yang memerlukan.

Kebergantungan persekitaran pemasangan

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

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

Alamat projek

github.com/jxlwqq/grpc-lb

Tarik kod:

git clone git@github.com:jxlwqq/grpc-lb.gitcd grpc-lb

Pengenalan 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 边车

Untuk logik tertentu, sila lihat fail Makefile.

L4 vs L7 pengimbangan beban

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.

Seni Bina Projek

Projek ini menguji sokongan Perkhidmatan dan Utusan (Istio) untuk pengimbangan beban HTTP/RPC masing-masing.

  • cmd/server/main.go: Pelayan, menyediakan kedua-dua perkhidmatan HTTP dan RPC. Data tindak balas ialah nama Pod di mana bekas pelayan berada (berdasarkan API Ke Bawah).
  • cmd/client-http/main.go: Pelanggan HTTP, melalui kaedah HTTP, memanggil antara muka pelayan secara kitaran dan mencetak nilai pulangan.
  • cmd/client-grpc/main.go: klien gRPC, melalui mod RPC, menggelung untuk memanggil kaedah pelayan dari jauh dan mencetak nilai pulangan.

Prinsip Pengujian

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.

Perkhidmatan Ujian

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.

Utusan Pengujian(Istio)

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.

Bersihkan

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!

Kenyataan:
Artikel ini dikembalikan pada:learnku.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam