In this example, we deploy NGINX Gateway Fabric, a simple gRPC web application, and then configure NGINX Gateway Fabric to route traffic to that application using GRPCRoute resources.
-
Follow the installation instructions to deploy NGINX Gateway Fabric.
-
Save the public IP address of NGINX Gateway Fabric into a shell variable:
GW_IP=XXX.YYY.ZZZ.III
-
Save the port of NGINX Gateway Fabric:
GW_PORT=<port number>
-
Create the two helloworld Deployments and Services:
kubectl apply -f helloworld.yaml
-
Check that the Pods are running in the
default
Namespace:kubectl -n default get pods
NAME READY STATUS RESTARTS AGE grpc-infra-backend-v1-766c7d6788-rg92p 1/1 Running 0 12s grpc-infra-backend-v2-546f7c8d48-mjkkx 1/1 Running 0 12s
Save these pod names into variables:
POD_V1=<grpc-infra-backend-v1-xxxxxxxxxx-xxxxx> POD_V2=<grpc-infra-backend-v2-xxxxxxxxxx-xxxxx>
There are 3 options to configure gRPC routing. To access the application and test the routing rules, we will use grpcurl.
-
Create the Gateway and GRPCRoute resources:
kubectl apply -f exact-method.yaml
-
Test the Application:
grpcurl -plaintext -proto grpc.proto -authority bar.com -d '{"name": "exact"}' ${GW_IP}:${GW_PORT} helloworld.Greeter/SayHello
{ "message": "Hello exact" }
-
Clean up the Gateway and GRPCRoute resources:
kubectl delete -f exact-method.yaml
-
Create the Gateway and GRPCRoute resources:
kubectl apply -f hostname.yaml
-
Test the Application:
grpcurl -plaintext -proto grpc.proto -authority bar.com -d '{"name": "bar server"}' ${GW_IP}:${GW_PORT} helloworld.Greeter/SayHello
{ "message": "Hello bar server" }
To make sure this came from the correct server, we can check the application server logs:
kubectl logs ${POD_V1}
2024/04/29 09:26:54 server listening at [::]:50051 2024/04/29 09:28:54 Received: bar server
Now we'll send a request to
foo.bar.com
grpcurl -plaintext -proto grpc.proto -authority foo.bar.com -d '{"name": "foo bar server"}' ${GW_IP}:${GW_PORT} helloworld.Greeter/SayHello
{ "message": "Hello foo bar server" }
This time, we'll check the POD_V2 logs:
kubectl logs ${POD_V2}
2024/04/29 09:26:55 server listening at [::]:50051 2024/04/29 09:29:46 Received: foo bar server
-
Clean up the Gateway and GRPCRoute resources:
kubectl delete -f hostname.yaml
-
Create the Gateway and GRPCRoute resources:
kubectl apply -f headers.yaml
-
Test the Application:
grpcurl -plaintext -proto grpc.proto -authority bar.com -d '{"name": "version one"}' -H 'version: one' ${GW_IP}:${GW_PORT} helloworld.Greeter/SayHello
{ "message": "Hello version one" }
To make sure this came from the correct server, we can check the application server logs:
kubectl logs ${POD_V1}
<...> 2024/04/29 09:30:27 Received: version one
Now we'll send a request with the header
version: two
grpcurl -plaintext -proto grpc.proto -authority bar.com -d '{"name": "version two"}' -H 'version: two' ${GW_IP}:${GW_PORT} helloworld.Greeter/SayHello
{ "message": "Hello version two" }
This time, we'll check the POD_V2 logs:
kubectl logs ${POD_V2}
<...> 2024/04/29 09:32:46 Received: version two
Finally, we'll send a request with the headers
version: two
andcolor: orange
grpcurl -plaintext -proto grpc.proto -authority bar.com -d '{"name": "version two orange"}' -H 'version: two' -H 'color: orange' ${GW_IP}:${GW_PORT} helloworld.Greeter/SayHello
{ "message": "Hello version two orange" }
Now check the POD_V1 logs again:
kubectl logs ${POD_V1}
<...> 2024/04/29 09:30:27 Received: version one 2024/04/29 09:33:26 Received: version two orange
-
Clean up the Gateway and GRPCRoute resources:
kubectl delete -f headers.yaml