Configurer un maillage de services gRPC sans proxy
Ce guide explique comment configurer un maillage de services gRPC sans proxy.
La configuration est compatible avec les clients Preview, mais nous ne la recommandons pas aux nouveaux utilisateurs de Cloud Service Mesh. Pour en savoir plus, consultez les Présentation de Cloud Service Mesh
Avant de commencer
Ne créez pas de maillage de services gRPC sans proxy dans un espace de noms dans lequel l'injection side-car automatique Envoy est activée. Pour déterminer si l'injection side-car est activée, exécutez la commande suivante :
kubectl get namespace default --show-labels
Si l'injection side-car automatique est activée, exécutez la commande suivante pour supprimer le libellé :
kubectl label namespace default istio-injection-
Déployer un service gRPC
Dans cette section, vous allez déployer un exemple de service helloworld
gRPC. L'exemple de service helloworld
est une application de serveur gRPC qui renvoie un message simple en réponse à la requête d'un client gRPC. Le service helloworld
expose le service gRPC sur le port 8080 du cluster.
Dans le fichier
grpc-td-helloworld.yaml
, enregistrez les éléments suivants :apiVersion: v1 kind: Service metadata: name: helloworld namespace: default spec: ports: - port: 8080 name: helloworld protocol: TCP targetPort: 50051 selector: run: app1 type: ClusterIP --- apiVersion: apps/v1 kind: Deployment metadata: labels: run: app1 name: app1 namespace: default spec: selector: matchLabels: run: app1 replicas: 2 template: metadata: labels: run: app1 annotations: sidecar.istio.io/inject: "false" spec: containers: - image: grpc/java-example-hostname:1.37.0 name: app1 ports: - protocol: TCP containerPort: 50051
Appliquez le fichier
grpc-td-helloworld.yaml
:kubectl apply -f grpc-td-helloworld.yaml
Vérifiez que le service
helloworld
est créé :kubectl get svc -n default
Le résultat ressemble à ce qui suit :
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT (S) AGE helloworld ClusterIP 10.71.9.71 <none> 8080/TCP 41m [..skip..]
Vérifiez que le pod de l'application est en cours d'exécution :
kubectl get pods -n default
Les pods de sortie doivent ressembler à ce qui suit :
NAME READY STATUS RESTARTS AGE app1-6db459dcb9-zvfg2 1/1 Running 0 6m app1-6db459dcb9-hlvhj 1/1 Running 0 6m [..skip..]
Configurer un maillage de services gRPC
Dans cette section, vous allez configurer un maillage de services gRPC simple.
Dans le fichier
td-grpc-mesh.yaml
, enregistrez le fichier manifestemesh
suivant :kind: TDMesh apiVersion: net.gke.io/v1alpha1 metadata: name: td-grpc-mesh namespace: default spec: gatewayClassName: gke-td allowedRoutes: namespaces: from: All kinds: - group: net.gke.io kind: TDGRPCRoute
Appliquez le fichier manifeste de maillage à
gke-1
:kubectl apply -f td-grpc-mesh.yaml
L'exemple
TDMesh
ne permet d'associer queTDGRPCRoute
ressources. Le fichier manifeste définit les types de routes autorisés.Vérifiez que le nouveau maillage
td-grpc-mesh
est créé :kubectl describe tdmesh td-grpc-mesh -n default
Le résultat ressemble à ce qui suit :
... Status: Conditions: Last Transition Time: 2022-04-14T22:22:09Z Message: Reason: MeshReady Status: True Type: Ready Last Transition Time: 2022-04-14T22:21:41Z Message: Reason: Scheduled Status: True Type: Scheduled Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ADD 79s mc-mesh-controller Processing mesh default/td-grpc-mesh Normal UPDATE 79s mc-mesh-controller Processing mesh default/td-grpc-mesh Normal SYNC 50s mc-mesh-controller SYNC on default/td-grpc-mesh was a success
Dans le fichier
helloworld-route.yaml
, enregistrez le fichier manifeste suivant :kind: TDGRPCRoute apiVersion: net.gke.io/v1alpha1 metadata: name: helloworld-route namespace: default spec: parentRefs: - name: td-grpc-mesh namespace: default group: net.gke.io kind: TDMesh hostnames: - helloworld rules: - backendRefs: - name: helloworld port: 8080 namespace: default
Appliquez le fichier manifeste
helloworld-route.yaml
àgke-1
:kubectl apply -f helloworld-route.yaml
Vérifiez que la nouvelles ressource
GRPCRoute
helloworld-route
est créée :kubectl get tdgrpcroute -n default
Vérifier la configuration
Une fois le processus de configuration terminé, vérifiez que vous pouvez accéder au serveur gRPC helloworld
à l'aide d'un client gRPC sans proxy. Ce client se connecte à Cloud Service Mesh, obtient des informations sur le service helloworld
, puis utilise ces informations pour envoyer du trafic vers les backends du service.
Dans l'exemple suivant, vous utilisez l'outil grpcurl
pour vérifier que Cloud Service Mesh achemine correctement le trafic dans le maillage. Créez un pod client, puis ouvrez un shell et exécutez les commandes de validation à partir du shell.
Configurer la variable d'environnement et le fichier d'amorçage
Dans un fichier
grpc-client.yaml
, enregistrez le fichier manifeste de pod suivant :apiVersion: v1 kind: Pod metadata: name: static-sleeper namespace: default annotations: sidecar.istio.io/inject: "false" spec: containers: - image: curlimages/curl:7.82.0 imagePullPolicy: IfNotPresent name: sleeper command: - sleep - 365d env: - name: GRPC_XDS_BOOTSTRAP value: "/tmp/grpc-xds/td-grpc-bootstrap.json" volumeMounts: - name: grpc-td-conf mountPath: /tmp/grpc-xds/ initContainers: - args: - --config-mesh-experimental - "gketd-td-grpc-mesh" - --output - "/tmp/bootstrap/td-grpc-bootstrap.json" image: gcr.io/trafficdirector-prod/td-grpc-bootstrap:0.16.0 imagePullPolicy: IfNotPresent name: grpc-td-init volumeMounts: - name: grpc-td-conf mountPath: /tmp/bootstrap/ volumes: - name: grpc-td-conf emptyDir: medium: Memory
Appliquez le fichier manifeste de pod dans
gke-1
:kubectl apply -f grpc-client.yaml
Lorsque le pod est prêt, ouvrez un shell sur le pod client :
kubectl exec -it static-sleeper -- /bin/sh
Vous pouvez utiliser l'outil grpcurl
en tant que client gRPC sans proxy. L'outil grpcurl
utilise les informations sur les variables d'environnement et d'amorçage pour se connecter à Cloud Service Mesh. L'outil apprend ensuite le service helloworld
, qui a été configuré avec Cloud Service Mesh.
Pour vérifier votre configuration à l'aide de l'outil grpcurl
, procédez comme suit :
Téléchargez et installez l'outil
grpcurl
:cd /home/curl_user curl -L https://github.com/fullstorydev/grpcurl/releases/download/v1.8.1/grpcurl_1.8.1_linux_x86_64.tar.gz | tar -xz
Exécutez l'outil
grpcurl
avecxds:///helloworld
en tant qu'URI de service ethelloworld.Greeter/SayHello
en tant que nom de service et méthode à appeler. Les paramètres de la méthodeSayHello
sont transmis à l'aide de l'option-d
:./grpcurl --plaintext \ -d '{"name": "world"}' \ xds:///helloworld helloworld.Greeter/SayHello
Le résultat ressemble à ce qui suit, où
INSTANCE_HOST_NAME
correspond au nom d'hôte du pod :Greetings: Hello world, from INSTANCE_HOST_NAME
Le résultat confirme que le client gRPC sans proxy s'est bien connecté à
Cloud Service Mesh et découvert les backends du service helloworld
à l'aide du résolveur de noms xds
. Le client a envoyé une requête à l'un des backends du service sans avoir à connaître l'adresse IP ou effectuer la résolution DNS.