Configura VM de Compute Engine y servicios de gRPC sin proxy
En esta guía, se muestra cómo configurar los hosts de VM de Compute Engine, las aplicaciones de gRPC y los componentes del balanceo de cargas que requiere la malla de servicios de Cloud.
Antes de seguir las instrucciones de esta guía, revisa Prepárate para configurar Cloud Service Mesh con servicios de gRPC sin proxy.
Descripción general
La configuración de la malla de servicios de Cloud con máquinas virtuales (VM) de Compute Engine y servicios de gRPC sin proxy implica lo siguiente:
- Configurar un grupo de instancias administrado que aloje tus backends
- Configurar los backends para que ejecuten un servidor de gRPC que muestre
hello world
en respuesta a una solicitud de un cliente - Configurar Cloud Service Mesh mediante el grupo de instancias administrado y otros componentes del balanceo de cargas de Google Cloud
- Verificar que la implementación funcione de forma correcta mediante una aplicación cliente de gRPC sin proxy para enviar tráfico a la aplicación del servidor de gRPC
El cliente de gRPC sin proxy se conecta a Cloud Service Mesh mediante xDS. Cuando el cliente se conecta a Cloud Service Mesh, este servicio le envía información sobre los backends asociados con el servicio hello world
. Con esta información, el cliente de gRPC sin proxy envía solicitudes al servidor de gRPC hello world
.
Configura un grupo de instancias administrado para Cloud Service Mesh
Los grupos de instancias administrados usan el ajuste de escala automático para crear VM de backend nuevas, según sea necesario en tu implementación. En este ejemplo, se muestra cómo hacer lo siguiente:
- Crear una plantilla de instancias con un servicio de muestra que entregue un servicio
hello world
mediante el protocolo gRPC - Configurar un grupo de instancias administrado con la plantilla
Crea la plantilla de instancias
En esta sección, se proporcionan instrucciones para crear una plantilla de instancias. En el ejemplo, implementarás un servicio de gRPC helloworld
que se expone en el puerto 50051.
Console
- En la consola de Google Cloud, ve a la página Plantillas de instancia.
- Haz clic en Crear plantilla de instancias.
Completa los campos de la siguiente manera:
- Nombre: grpc-td-vm-template
- Versión del disco de arranque: Debian o Linux 10
- Cuenta de servicio: Cuenta de servicio predeterminada de Compute Engine
- Permiso de acceso: Permitir el acceso total a todas las API de Google Cloud
En Firewall, selecciona las casillas junto a Permitir tráfico HTTP y Permitir tráfico HTTPS.
Haz clic en Administración, seguridad, discos, redes, usuario único.
En la pestaña Administración, copia la siguiente secuencia de comandos en el campo Secuencia de comandos de inicio.
#! /bin/bash set -e cd /root sudo apt-get update -y sudo apt-get install -y openjdk-11-jdk-headless curl -L https://github.com/grpc/grpc-java/archive/v1.37.0.tar.gz | tar -xz cd grpc-java-1.37.0/examples/example-hostname ../gradlew --no-daemon installDist # Server listens on 50051 sudo systemd-run ./build/install/hostname-server/bin/hostname-server
Haz clic en Crear.
gcloud
Crea la plantilla de instancias.
gcloud compute instance-templates create grpc-td-vm-template \ --scopes=https://www.googleapis.com/auth/cloud-platform \ --tags=allow-health-checks \ --image-family=debian-10 \ --image-project=debian-cloud \ --metadata-from-file=startup-script=<(echo '#! /bin/bash set -e cd /root sudo apt-get update -y sudo apt-get install -y openjdk-11-jdk-headless curl -L https://github.com/grpc/grpc-java/archive/v1.37.0.tar.gz | tar -xz cd grpc-java-1.37.0/examples/example-hostname ../gradlew --no-daemon installDist # Server listens on 50051 sudo systemd-run ./build/install/hostname-server/bin/hostname-server')
Crea el grupo de instancias administrado
En esta sección, crearás un grupo de instancias administrado con la plantilla de instancias que creaste en la sección anterior.
Console
- Ve a la página Grupos de instancias en la consola de Google Cloud.
- Haz clic en Crear un grupo de instancias. De forma predeterminada, verás la página para crear un grupo de instancias administrado.
- Ingresa
grpc-td-mig-us-central1
para el nombre del grupo de instancias administrado y selecciona la zonaus-central1-a
. - En Plantilla de instancias, selecciona
grpc-td-vm-template
, que es la plantilla de instancias que creaste. - Especifica 2 como la cantidad mínima y máxima de instancias que quieres crear en el grupo.
- Haz clic en Crear.
gcloud
Crea el grupo de instancias administrado.
gcloud compute instance-groups managed create grpc-td-mig-us-central1 \ --zone us-central1-a \ --size=2 \ --template=grpc-td-vm-template
Configura el puerto con nombre
En esta sección, configurarás el puerto con nombre para el servicio de gRPC. El puerto con nombre es el puerto en el que el servicio de gRPC escucha las solicitudes. En este ejemplo, el puerto con nombre es el puerto 50051.
Console
- Ve a la página Grupos de instancias en la consola de Google Cloud.
- Haz clic en el nombre del grupo de instancias
grpc-td-mig-us-central1
que creaste. - Haz clic en Editar grupo.
- En el campo Nombre del puerto, ingresa
grpc-helloworld-port
. - En el campo Número de puerto, ingresa
50051
. - Haz clic en Guardar.
gcloud
Configura el puerto con nombre.
gcloud compute instance-groups set-named-ports grpc-td-mig-us-central1 \ --named-ports=grpc-helloworld-port:50051 \ --zone us-central1-a
Configura Cloud Service Mesh con componentes del balanceo de cargas de Google Cloud
En esta sección, se proporcionan instrucciones para configurar Cloud Service Mesh con componentes del balanceo de cargas de Google Cloud para tus servicios.
Crea la verificación de estado, la regla de firewall y el servicio de backend
En esta sección, crearás un servicio de backend global con un esquema de balanceo de cargas de INTERNAL_SELF_MANAGED
y el protocolo GRPC
y, luego, asociarás la verificación de estado y el grupo de instancias con el servicio de backend.
En este ejemplo, se usa el grupo de instancias administrado que creaste en Crea el grupo de instancias administrado. Este grupo de instancias administrado ejecuta el servicio de gRPC de muestra. El puerto en la marca --port-name
es el puerto con nombre que creaste en Configura el puerto con nombre.
gcloud
Crea la verificación de estado.
gcloud compute health-checks create grpc grpc-helloworld-health-check \ --use-serving-port
Cree la regla de firewall de la verificación de estado.
gcloud compute firewall-rules create grpc-vm-allow-health-checks \ --network default --action allow --direction INGRESS \ --source-ranges=35.191.0.0/16,130.211.0.0/22 \ --target-tags allow-health-checks \ --rules tcp:50051
Crea el servicio de backend.
gcloud compute backend-services create grpc-helloworld-service \ --global \ --load-balancing-scheme=INTERNAL_SELF_MANAGED \ --protocol=GRPC \ --port-name=grpc-helloworld-port \ --health-checks=grpc-helloworld-health-check
Agrega el grupo de instancias administrado al servicio de backend.
gcloud compute backend-services add-backend grpc-helloworld-service \ --instance-group grpc-td-mig-us-central1 \ --instance-group-zone us-central1-a \ --global
Crea el mapa de reglas de enrutamiento, el proxy de destino y la regla de reenvío
En esta sección, crearás un mapa de URL, un comparador de rutas de acceso y una regla de host para enrutar el tráfico de tu servicio según el nombre de host y una ruta de acceso. En el siguiente ejemplo, se usa helloworld-gce
como el nombre del servicio. La aplicación de gRPC usa este nombre de servicio en el URI de destino cuando se conecta a este servicio. De forma predeterminada, el comparador de rutas de acceso coincide con todas las solicitudes de ruta (/*
) para este host. También debes crear el proxy de gRPC de destino y la regla de reenvío.
Para obtener más información, consulta Mapas de reglas de enrutamiento.
En el siguiente ejemplo, el puerto 80 es el puerto especificado.
gcloud
Crea el mapa de URL.
gcloud compute url-maps create grpc-vm-url-map \ --default-service grpc-helloworld-service
Crea el comparador de rutas de acceso.
gcloud compute url-maps add-path-matcher grpc-vm-url-map \ --default-service grpc-helloworld-service \ --path-matcher-name grpc-vm-path-matcher \ --new-hosts helloworld-gce
Crea el proxy de gRPC de destino.
gcloud compute target-grpc-proxies create grpc-vm-proxy \ --url-map grpc-vm-url-map \ --validate-for-proxyless
Crea la regla de reenvío.
gcloud compute forwarding-rules create grpc-vm-forwarding-rule \ --global \ --load-balancing-scheme=INTERNAL_SELF_MANAGED \ --address=0.0.0.0 --address-region=us-central1 \ --target-grpc-proxy=grpc-vm-proxy \ --ports 80 \ --network default
Cloud Service Mesh ahora está configurado para balancear las cargas del tráfico en los backends del grupo de instancias administrado de los servicios especificados en el mapa de URL.
Verifica la configuración
Cuando se complete el proceso de configuración, verifica que puedas establecer una conexión gRPC con el servicio con balanceo de cargas de Cloud Service Mesh que creaste antes.
Para verificar que el servicio esté disponible, realiza una de las siguientes acciones:
- Accede a uno de los hosts de VM (backend del servicio de gRPC) y verifica que el servicio de gRPC se ejecute en el puerto de escucha. En el ejemplo, el puerto es 50051.
- Consulta la página de Cloud Service Mesh en la consola para obtener información sobre el servicio configurado
helloworld-gce
y confirma que los backends estén en buen estado. - Usa las siguientes instrucciones para usar un cliente de gRPC de Compute Engine en la verificación.
Verifica el servicio con una aplicación cliente de gRPC
En los siguientes ejemplos, usarás un cliente de gRPC en el lenguaje que prefieras o la herramienta de grpcurl
para probar el servicio de gRPC.
Primero, crea una VM de cliente en la que desees ejecutar el cliente de gRPC para probar el servicio.
gcloud compute instances create grpc-client \ --zone us-central1-a \ --scopes=https://www.googleapis.com/auth/cloud-platform \ --image-family=debian-10 \ --image-project=debian-cloud \ --metadata-from-file=startup-script=<(echo '#! /bin/bash set -e export GRPC_XDS_BOOTSTRAP=/run/td-grpc-bootstrap.json # Expose bootstrap variable to SSH connections echo export GRPC_XDS_BOOTSTRAP=$GRPC_XDS_BOOTSTRAP | sudo tee /etc/profile.d/grpc-xds-bootstrap.sh # Create the bootstrap file curl -L https://storage.googleapis.com/traffic-director/td-grpc-bootstrap-0.16.0.tar.gz | tar -xz ./td-grpc-bootstrap-0.16.0/td-grpc-bootstrap | tee $GRPC_XDS_BOOTSTRAP')
Configura la variable de entorno y el archivo de arranque
La aplicación cliente necesita un archivo de configuración de arranque. La secuencia de comandos de inicio de la sección anterior configura la variable de entorno GRPC_XDS_BOOTSTRAP
y usa una secuencia de comandos auxiliar para generar el archivo de arranque. Los valores para TRAFFICDIRECTOR_GCP_PROJECT_NUMBER
, TRAFFICDIRECTOR_NETWORK_NAME
y zone
del archivo de arranque generado se obtienen del servidor de metadatos que conoce estos detalles de las instancias de VM de Compute Engine. Puedes proporcionar estos valores a la secuencia de comandos auxiliar de forma manual con las opciones -gcp-project-number
y -vpc-network-name
.
Para verificar la configuración, accede a la VM de cliente y ejecuta los siguientes ejemplos.
Java
Si deseas verificar el servicio con un cliente de gRPC para Java, haz lo siguiente:
Descarga la última versión de gRPC para Java con el parche más reciente y compila la aplicación cliente
xds-hello-world
.sudo apt-get update -y sudo apt-get install -y openjdk-11-jdk-headless curl -L https://github.com/grpc/grpc-java/archive/v1.37.0.tar.gz | tar -xz cd grpc-java-1.37.0/examples/example-xds ../gradlew --no-daemon installDist
Ejecuta el cliente con
world
como su nombre yxds:///helloworld-gce
como el URI de servicio../build/install/example-xds/bin/xds-hello-world-client "world" \ xds:///helloworld-gce
Go
Si deseas verificar el servicio con un cliente de gRPC para Go, haz lo siguiente:
Descarga la última versión de gRPC para Go con el parche más reciente y crea la aplicación cliente
xds-hello-world
.sudo apt-get update -y sudo apt-get install -y golang git curl -L https://github.com/grpc/grpc-go/archive/v1.37.0.tar.gz | tar -xz cd grpc-go-1.37.0/examples/features/xds/client go get google.golang.org/grpc@v1.37.0 go build .
Ejecuta el cliente con
world
como su nombre yxds:///helloworld-gce
como el URI de servicio../client "world" xds:///helloworld-gce
C++
Si deseas verificar el servicio con un cliente de gRPC para C++, haz lo siguiente:
Descarga la última versión de gRPC para C++,con el parche más reciente, y crea el ejemplo de cliente
helloworld
.sudo apt-get update -y sudo apt-get install -y build-essential cmake git git clone --recurse-submodules -b v1.37.1 https://github.com/grpc/grpc cd grpc mkdir -p cmake/build pushd cmake/build cmake ../.. make sudo make install popd mkdir -p third_party/abseil-cpp/cmake/build pushd third_party/abseil-cpp/cmake/build cmake ../.. make sudo make install popd cd examples/cpp/helloworld mkdir -p cmake/build cd cmake/build/ cmake ../.. make
Ejecuta el cliente con “xds:///helloworld-gce” como el URI de servicio.
./greeter_client --target=xds:///helloworld-gce
grpcurl
Para verificar el servicio mediante la herramienta de grpcurl
, haz lo siguiente:
Descarga e instala la herramienta de
grpcurl
.curl -L https://github.com/fullstorydev/grpcurl/releases/download/v1.8.1/grpcurl_1.8.1_linux_x86_64.tar.gz | tar -xz
Ejecuta la herramienta de
grpcurl
con “xds:///helloworld-gce” como el URI del servicio yhelloworld.Greeter/SayHello
como el nombre del servicio y el método que se invocará. Los parámetros del métodoSayHello
se pasan con la opción-d
../grpcurl --plaintext \ -d '{"name": "world"}' \ xds:///helloworld-gce helloworld.Greeter/SayHello
Python
Si deseas verificar el servicio con un cliente de gRPC para Python, ejecuta lo siguiente. Usa la versión más reciente de gRPC con el parche más reciente.
sudo apt-get update sudo apt-get -y install python3-pip sudo pip3 install virtualenv curl -L https://github.com/grpc/grpc/archive/v1.37.1.tar.gz | tar -xz cd grpc-1.37.1/examples/python/xds virtualenv venv -p python3 source venv/bin/activate pip install -r requirements.txt python client.py xds:///helloworld-gce
Ruby
Si deseas verificar el servicio con un cliente de gRPC para Ruby, ejecuta lo siguiente. Usa la versión más reciente de gRPC con el parche más reciente.
sudo apt-get update sudo apt-get install -y ruby-full sudo gem install grpc curl -L https://github.com/grpc/grpc/archive/v1.37.1.tar.gz | tar -xz cd grpc-1.37.1/examples/ruby ruby greeter_client.rb john xds:///helloworld-gce
PHP
Si deseas verificar el servicio con un cliente de gRPC para PHP, ejecuta lo siguiente. Usa la versión más reciente de gRPC con el parche más reciente.
sudo apt-get update sudo apt-get install -y php7.3 php7.3-dev php-pear phpunit python-all zlib1g-dev git sudo pecl install grpc curl -sS https://getcomposer.org/installer | php sudo mv composer.phar /usr/local/bin/composer curl -L https://github.com/grpc/grpc/archive/v1.37.1.tar.gz | tar -xz cd grpc-1.37.1 export CC=/usr/bin/gcc ./tools/bazel build @com_google_protobuf//:protoc ./tools/bazel build src/compiler:grpc_php_plugin cd examples/php composer install ./../../bazel-bin/external/com_google_protobuf/protoc --proto_path=../protos \ --php_out=. --grpc_out=. \ --plugin=protoc-gen-grpc=../../bazel-bin/src/compiler/grpc_php_plugin \ ../protos/helloworld.proto php -d extension=grpc.so greeter_client.php john xds:///helloworld-gce
Node.js
Para verificar el servicio con un cliente Node.js de gRPC, ejecuta el siguiente comando. Usa la versión más reciente de gRPC con el parche más reciente.
sudo apt-get update sudo apt-get install -y nodejs npm curl -L https://github.com/grpc/grpc/archive/v1.34.0.tar.gz | tar -xz cd grpc-1.34.0/examples/node/xds npm install node ./greeter_client.js --target=xds:///helloworld-gce
Deberías ver un resultado similar a este, en el que INSTANCE_NAME
es el nombre de la instancia de VM:
Greeting: Hello world, from INSTANCE_HOSTNAME
Esto verifica que el cliente de gRPC sin proxy se conectó de forma correcta a Cloud Service Mesh y aprendió sobre los backends del servicio helloworld-gce
mediante el agente de resolución de nombres xds
. El cliente envió una solicitud a uno de los backends del servicio sin necesidad de conocer la dirección IP ni realizar la resolución de DNS.
¿Qué sigue?
- Obtén información sobre la administración avanzada del tráfico.
- Obtén más información sobre cómo configurar la observabilidad.
- Obtén información para solucionar problemas de implementaciones de Cloud Service Mesh sin proxy.