It is assumed that you have a working Ruby environment and a Google Cloud account and SDK configured.
-
Install dependencies:
bundle gem install grpc-tools
-
Test running the code, optional:
# In the background or another terminal run the server: bundle exec ruby greeter_server.rb # Check the client parameters: bundle exec ruby greeter_client.rb # Run the client bundle exec ruby greeter_client.rb localhost:50051 test
-
The gRPC Services have already been generated in
lib/
. If you change the proto, or just wish to regenerate these files, run:grpc_tools_ruby_protoc -I protos --ruby_out=lib --grpc_out=lib protos/helloworld.proto
-
Generate the file descriptor set
out.pb
from the proto file.grpc_tools_ruby_protoc --include_imports --include_source_info protos/helloworld.proto --descriptor_set_out out.pb
-
Edit,
api_config.yaml
. ReplaceMY_PROJECT_ID
with your project id. -
Deploy your service config to Service Management:
gcloud endpoints services deploy out.pb api_config.yaml # The Config ID should be printed out, looks like: 2017-02-01r0, remember this # set your project to make commands easier GOOGLE_CLOUD_PROJECT=<Your Project ID> # Print out your Service name again, in case you missed it gcloud endpoints services configs list --service hellogrpc.endpoints.${GOOGLE_CLOUD_PROJECT}.cloud.goog
-
Also get an API key from the Console's API Manager for use in the client later. (https://console.cloud.google.com/apis/credentials)
-
Build a docker image for your gRPC server, store in your Registry
gcloud container builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/ruby-grpc-hello:1.0 .
-
Either deploy to Google Compute Engine (GCE) below or Google Container Engine (GKE) further down.
-
Create your instance and ssh in.
gcloud compute instances create grpc-host --image-family gci-stable --image-project google-containers --tags=http-server gcloud compute ssh grpc-host
-
Set some variables to make commands easier
GOOGLE_CLOUD_PROJECT=$(curl -s "http://metadata.google.internal/computeMetadata/v1/project/project-id" -H "Metadata-Flavor: Google") SERVICE_NAME=hellogrpc.endpoints.${GOOGLE_CLOUD_PROJECT}.cloud.goog
-
Pull your credentials to access Container Registry, and run your gRPC server container
/usr/share/google/dockercfg_update.sh docker run -d --name=grpc-hello gcr.io/${GOOGLE_CLOUD_PROJECT}/ruby-grpc-hello:1.0
-
Run the Endpoints proxy
docker run --detach --name=esp \ -p 80:9000 \ --link=grpc-hello:grpc-hello \ gcr.io/endpoints-release/endpoints-runtime:1 \ -s ${SERVICE_NAME} \ --rollout_strategy managed \ -P 9000 \ -a grpc://grpc-hello:50051
-
Back on your local machine, get the external IP of your GCE instance.
gcloud compute instances list
-
Run the client
bundle exec ruby greeter_client.rb <IP of GCE Instance>:80 <API Key from Console>
-
Cleanup
gcloud compute instances delete grpc-host
-
Create a cluster
gcloud container clusters create my-cluster
-
Edit
deployment.yaml
. ReplaceSERVICE_NAME
andGOOGLE_CLOUD_PROJECT
with your values. -
Deploy to GKE
kubectl create -f ./deployment.yaml
-
Get IP of load balancer, run until you see an External IP.
kubectl get svc grpc-hello
-
Run the client
bundle exec ruby greeter_client.rb <IP of GKE LoadBalancer>:80 <API Key from Console>
-
Cleanup
gcloud container clusters delete my-cluster