Maison >développement back-end >Golang >Analyse de l'équilibrage de charge Kubernetes gRPC (L4 vs L7)

Analyse de l'équilibrage de charge Kubernetes gRPC (L4 vs L7)

藏色散人
藏色散人avant
2021-11-16 14:53:352355parcourir

Cet article est introduit par la colonne tutoriel go language pour introduire l'équilibrage de charge gRPC dans Kubernetes. J'espère qu'il sera utile aux amis dans le besoin !

Dépendances de l'environnement d'installation

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

Téléchargez et installez Docker Desktop et démarrez le cluster Kubernetes intégré.

# 安装 Gobrew install go# 安装 Protobufbrew install protobuf# 安装 Istiobrew install istioctl
kubectl config use-context docker-desktop
istioctl install -y

Adresse du projet

github.com/jxlwqq/grpc-lb

Code d'extraction :

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

Introduction au fichier Makefile

Installez protoc-gen-go et protoc-gen-grpcmake protoc
Command Instructions
make init 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

En fonction du fichier proto, générez *_pb.go et *_grpc.pb. allez

make docker-build

Construisez l'image docker

make kube-deployDéployez le service dans le cluster

    make kube-delete
  • Delete service
  • make istio-inject

Injecter le side-car Istio

Pour une logique spécifique, veuillez consulter le Makefile.

Équilibrage de charge L4 vs L7

La couche quatre est l'équilibrage de charge basé sur IP + port, tandis que la couche sept est l'équilibrage de charge basé sur les informations de la couche d'application telles que l'équilibrage de charge du service intégré de Kubernetes ; basé sur iptables/ipvs. Seul L4 est pris en charge. En d’autres termes, Service prend en charge le protocole HTTP/1.1 mais ne prend pas en charge le protocole HTTP/2.

Envoy (Istio) est plus polyvalent et prend en charge toutes les fonctions HTTP/2 demandées et répondues par gRPC en tant que routage sous-jacent et équilibrage de charge.

Architecture du projet

Ce projet teste respectivement la prise en charge de Service et Envoy (Istio) pour l'équilibrage de charge HTTP/RPC.

cmd/server/main.go : serveur, fournissant à la fois les services HTTP et RPC. Les données de réponse sont le nom du pod où se trouve le conteneur de serveur (basé sur l'API descendante).

cmd/client-http/main.go : le client HTTP, via la méthode HTTP, appelle cycliquement l'interface du serveur et imprime la valeur de retour.

cmd/client-grpc/main.go : le client gRPC, via RPC, appelle à distance la méthode serveur en boucle et imprime la valeur de retour.

Principe du test

Le serveur déploie 3 copies dans le cluster Kubernetes sous forme de déploiement. Les noms de Pod des 3 copies sont différents, et client-http et client-grpc appelleront le service une fois par seconde. terminal et imprimez la valeur de retour. Si les trois noms de pod existent dans la valeur de retour, cela indique qu'un équilibrage de charge efficace est effectué, sinon cela indique qu'un équilibrage de charge efficace n'est pas effectué ;

Tester le service

Créer l'image :

make docker-build # 构建镜像(构建好的镜像,不 push 到远程仓库中)
Voir l'image :

docker images ls
Retour :

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
Déployer sur le cluster :

make kube-deploy  # 在集群中部署服务
Voir le pod :

kubectl get pods
Retour :

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
Voir le Journal du pod client-http :

export CLIENT_HTTP_POD=$(kubectl get pod -l app=client-http -o jsonpath={.items..metadata.name})kubectl logs "${CLIENT_HTTP_POD}"
Retour :

#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
Afficher le journal du pod client-grpc :
export CLIENT_GRPC_POD=$(kubectl get pod -l app=client-grpc -o jsonpath={.items..metadata.name})kubectl logs "${CLIENT_GRPC_POD}"

Retour : 🎜
#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
🎜On peut voir que la requête HTTP transporte une charge utile, tandis que la requête RPC contient une charge non valide charger. 🎜🎜🎜🎜Testing Envoy(Istio)🎜🎜Nous avons déployé un Istio dans le cluster, mais il n'y a pas d'espace de commande pour l'injection automatique, nous effectuons donc une injection manuelle ici. 🎜🎜Injection manuelle : 🎜
make istio-inject # 注入 Istio 边车
🎜Voir le pod : 🎜
kubectl get pods
🎜Retour : 🎜
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
🎜Voir le journal du pod client-http : 🎜
export CLIENT_HTTP_POD=$(kubectl get pod -l app=client-http -o jsonpath={.items..metadata.name})kubectl logs "${CLIENT_HTTP_POD}"
🎜Retour : 🎜
#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
🎜Voir le journal du pod client-grpc : 🎜
export CLIENT_GRPC_POD=$(kubectl get pod -l app=client-grpc -o jsonpath={.items..metadata.name})kubectl logs "${CLIENT_GRPC_POD}"
🎜Retour : 🎜
#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
🎜C'est On peut voir que les requêtes HTTP et les requêtes RPC transportent une charge utile. 🎜🎜🎜🎜Nettoyer🎜
make kube-delete
istioctl experimental uninstall --purge

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer