Set up Envoy proxies with HTTP services
This guide demonstrates how to configure Cloud Service Mesh with an Envoy
proxy-based service mesh, HTTP services, and Mesh
and HTTPRoute
resources.
HTTPRoute
and Mesh
resources (click to enlarge)Before you begin
Make sure that you complete the tasks described in Prepare to set up with Envoy and proxyless workloads .
Configure the Mesh
resource
Envoy proxies running as sidecars receive their service routing configuration
from Cloud Service Mesh. The Mesh
name is the key that the sidecar proxy uses
to request the configuration associated with the Mesh
resource.
Cloud Service Mesh provides the routing configuration to the proxy. The sidecar
proxy then directs traffic to the correct backend service, relying on request
parameters such as the hostname, headers, and others that are configured in the Route
resources.
-
Create the
Meshresource specification and save it in a file calledmesh.yaml.name: sidecar-mesh interceptionPort: 15001
The interception port defaults to 15001
if you don't specify it in the mesh.yaml
file.
-
Create the
Meshresource using the mesh.yaml specification.gcloud network-services meshes import sidecar-mesh \ --source=mesh.yaml \ --location=global
After the Mesh
resource is created, Cloud Service Mesh is ready to serve the
configuration, but because there are no services defined yet, the configuration
is empty. The next step is to define your services and attachment.
Configure the HTTP server
For demonstration purposes, you create a backend service with autoscaled VMs
using managed instance groups
as the backends. The VMs serve a hello world
text phrase, using the HTTP protocol
on port 80
.
-
Create the instance template with a
helloworldHTTP service on port80.gcloud compute instance-templates create td-httpd-vm-template \ --scopes=https://www.googleapis.com/auth/cloud-platform \ --tags=http-td-server \ --image-family=debian-11 \ --image-project=debian-cloud \ --metadata=startup-script="#! /bin/bash sudo apt-get update -y sudo apt-get install apache2 -y sudo service apache2 restart echo '<!doctype <html><body><h1>'\`$(/bin/hostname)\`'</h1></body></html>' | sudo tee /var/www/html/index.html"
-
Create a managed instance group based on the template.
gcloud compute instance-groups managed create http-td-mig-us-east1 \ --zone= ZONE \ --size=2 \ --template=td-httpd-vm-template
-
Create a health check.
gcloud compute health-checks create http http-helloworld-health-check
-
Create a firewall rule to allow incoming health check connections to instances in your network.
gcloud compute firewall-rules create http-vm-allow-health-checks \ --network=default \ --action=ALLOW \ --direction=INGRESS \ --source-ranges=35.191.0.0/16,130.211.0.0/22 \ --target-tags=http-td-server \ --rules=tcp:80
-
Create a global backend service with a load balancing scheme of
INTERNAL_SELF_MANAGEDand add the health check.gcloud compute backend-services create http-helloworld-service \ --global \ --load-balancing-scheme=INTERNAL_SELF_MANAGED \ --protocol=HTTP \ --health-checks http-helloworld-health-check
-
Add the managed instance group to the backend service. The following example uses the managed instance group you created previously. The VMs in the managed instance group run the sample HTTP service that you created.
gcloud compute backend-services add-backend http-helloworld-service \ --instance-group=http-td-mig-us-east1 \ --instance-group-zone= ZONE \ --global
Set up routing with an HTTPRoute
resource
The Mesh
resource and services are configured. Connect them with an HTTPRoute
resource that associates a hostname with a backend service.
-
Create the
HTTPRoutespecification and save it to a file calledhttp_route.yaml.You can use either
PROJECT_IDorPROJECT_NUMBER.name: helloworld-http-route hostnames: - helloworld-gce meshes: - projects/ PROJECT_NUMBER /locations/global/meshes/sidecar-mesh rules: - action: destinations: - serviceName: "projects/ PROJECT_NUMBER /locations/global/backendServices/http-helloworld-service"
-
Create the
HTTPRouteresource using the specification in thehttp_route.yamlfile.gcloud network-services http-routes import helloworld-http-route \ --source=http_route.yaml \ --location=global
Cloud Service Mesh is now configured to load balance traffic for the services
specified in the HTTPRoute
resource across the VMs in the managed instance
group.
Create an HTTP client with an Envoy sidecar
You can verify the deployment by creating a client VM with an Envoy sidecar
proxy that requests the Cloud Service Mesh configuration that was created
earlier. The mesh
parameter in the gcloud
command refers to the Mesh
resource that you already created.
-
Create an instance template.
gcloud beta compute instance-templates create td-vm-client-template \ --image-family=debian-11 \ --image-project=debian-cloud \ --service-proxy=enabled,mesh=sidecar-mesh
-
Create a VM with an Envoy proxy that is connected to Cloud Service Mesh.
gcloud compute instances create td-vm-client \ --zone= ZONE \ --source-instance-template td-vm-client-template
-
Sign in to the VM.
gcloud compute ssh td-vm-client --zone= ZONE -
Run the
curlcommand to verify HTTP connectivity to the test services.curl -H "Host: helloworld-gce" http://10.0.0.1/
The command should return a response from one of the VMs in the managed instance group, with its hostname printed to the console.
What's next
- For information about listing route resources associated with a
MeshorGatewayresource, see ListRouteresources .

