Soluciona problemas de implementaciones de gRPC sin proxy
En este documento, se proporciona información para ayudarte a resolver problemas de configuración cuando implementas servicios de gRPC sin proxy con Cloud Service Mesh. Para información sobre cómo usar la API del Servicio de descubrimiento de estado del cliente (CSDS) para investigar problemas con Cloud Service Mesh, consulta Información sobre el estado del cliente de Cloud Service Mesh.
Soluciona fallas de RPC en una aplicación de gRPC
Existen dos formas comunes de solucionar problemas de llamada de procedimiento remoto (RPC) en una aplicación de gRPC:
Revisa el estado que se muestra cuando falla una RPC. Por lo general, el estado contiene suficiente información para ayudarte a comprender la causa de una falla de RPC.
El manejo de errores de estado en gRPC se explica en la documentación de manejo de errores de gRPC.
Manejo de errores de estado de ejemplo en gRPC para Java. Una excepción puede tener otras excepciones como su causa, lo que podría proporcionar información adicional.
Habilita el registro en el entorno de ejecución de gRPC. A veces, deberás revisar los registros del entorno de ejecución de gRPC para comprender una falla que puede que no se propague en un estado de retorno de RPC. Por ejemplo, cuando una RPC falla con un estado que indica que se superó el plazo, los registros pueden ayudarte a comprender la falla subyacente que lo provocó.
Las diferentes implementaciones de lenguaje de gRPC tienen diferentes maneras de habilitar el registro en el entorno de ejecución de gRPC:
gRPC en Java: gRPC usa
java.util.logging
para el registro. Configuraio.grpc.level
en el nivelFINE
para habilitar el registro detallado suficiente en el entorno de ejecución de gRPC. Una forma típica de habilitar el registro en Java es cargar la configuración de registro desde un archivo y proporcionar la ubicación del archivo en una JVM mediante una función experimental de línea de comandos. Por ejemplo:# Create a file called logging.properties with the following contents: handlers=java.util.logging.ConsoleHandler io.grpc.level=FINE io.grpc.xds.level=FINEST java.util.logging.ConsoleHandler.level=ALL java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter # Pass the location of the file to JVM by using this command-line flag: -Djava.util.logging.config.file=logging.properties
Para habilitar el registro específico de los módulos xDS, establece
io.grpc.xds.level
comoFINE
. Para ver un registro más detallado, establece el nivel enFINER
oFINEST
.gRPC en Go: configura variables de entorno para activar el registro.
GRPC_GO_LOG_VERBOSITY_LEVEL=99 GRPC_GO_LOG_SEVERITY_LEVEL=info
gRPC en C++: Para habilitar el registro con gRPC en C++, consulta las instrucciones en Soluciona problemas de gRPC. Para habilitar el registro específico de los módulos xDS, habilita los siguientes rastreadores: con la variable de entorno
GRPC_TRACE
paraxds_client
,xds_resolver
,cds_lb
,eds_lb
,priority_lb
,weighted_target_lb
ylrs_lb
.gRPC en Node.js: Para habilitar el registro con gRPC en Node.js, consulta las instrucciones en Soluciona problemas de gRPC-JS. Para habilitar el registro específico de los módulos xDS, habilita los siguientes rastreadores mediante la variable de entorno
GRPC_TRACE
paraxds_client
,xds_resolver
,cds_balancer
,eds_balancer
,priority
yweighted_target
.
Según el error en el estado de la RPC o en los registros del entorno de ejecución, el problema puede encontrarse en una de las siguientes categorías.
No se pudo establecer una conexión con Cloud Service Mesh
Para solucionar los problemas de conexión, intenta lo siguiente:
- Comprueba que el valor de server_uri en el archivo de arranque sea
trafficdirector.googleapis.com:443
. - Asegúrate de que la variable de entorno
GRPC_XDS_BOOTSTRAP
esté definida y orientada al archivo de arranque. - Asegúrate de usar el esquema
xds
en el URI cuando crees un canal de gRPC. - Asegúrate de otorgar los permisos de IAM necesarios para crear instancias de procesamiento y modificar una red en un proyecto.
- Asegúrate de habilitar la cuenta de servicio para acceder a la API de Traffic Director. En APIs y servicios de la consola de Google Cloud del proyecto, busca los errores de la API de Traffic Director.
- Confirma que la cuenta de servicio tenga los permisos correctos. Las aplicaciones de gRPC que se ejecutan en la VM o el Pod usan la cuenta de servicio del host de VM de Compute Engine o la instancia de nodo de Google Kubernetes Engine (GKE).
Confirma que el permiso de acceso a la API de las VMs de Compute Engine o de los clústeres de GKE esté configurado para permitir el acceso completo a las APIs de Compute Engine. Para ello, especifica lo siguiente cuando crees las VM o el clúster:
--scopes=https://www.googleapis.com/auth/cloud-platform
Confirma que puedes acceder a
trafficdirector.googleapis.com:443
desde la VM. Si hay problemas de acceso, las razones posibles incluyen un firewall que impide el acceso atrafficdirector.googleapis.com
a través del puerto TCP443
o problemas de resolución de DNS para el nombre de hosttrafficdirector.googleapis.com
.
El nombre de host especificado en el URI no se puede resolver
Es posible que se muestre un mensaje de error como el siguiente en tus registros:
[Channel<1>: (xds:///my-service:12400)] Failed to resolve name. status=Status{code=UNAVAILABLE, description=NameResolver returned no usable address. addrs=[], attrs={}
Para solucionar los problemas de resolución de nombres de host, intenta lo siguiente:
- Asegúrate de usar una versión y un lenguaje de gRPC admitidos.
- Asegúrate de que el puerto que se usa en el URI para crear un canal de gRPC coincida con el valor del puerto en la regla de reenvío que se usó en la configuración. Si no se especifica un puerto en el URI, se usa el valor
80
para hacer coincidir una regla de reenvío. - Asegúrate de que el nombre de host y el puerto que se usan en el URI para crear un canal de gRPC coincidan con exactitud con una regla de host en el mapa de URL que se usó en la configuración.
- Asegúrate de que la misma regla de host no esté configurada en más de un mapa de URL.
- Asegúrate de que no haya comodines en uso. Se ignoran las reglas de host que contengan el carácter comodín
*
.
RPC falla porque el servicio no está disponible
Para solucionar fallas de RPC cuando un servicio no está disponible, intenta lo siguiente:
Verifica el estado general de Cloud Service Mesh y el estado de tu Servicios de backend en la consola de Google Cloud:
- En la columna Mapas de reglas de enrutamiento asociadas, asegúrate de que los mapas de URL correctos hagan referencia a los servicios de backend. Haz clic en la columna para verificar que los servicios de backend especificados en las reglas de coincidencia de host sean correctos.
- En la columna Backends, verifica que los backends asociados con los servicios de backend estén en buen estado.
- Si los backends están en mal estado, haz clic en el servicio de backend correspondiente y asegúrate de que se haya configurado la verificación de estado correcta. Las verificaciones de estado suelen fallar debido a reglas de firewall incorrectas o faltantes, o a una falta de coincidencia en las etiquetas especificadas en la VM y en las reglas de firewall. Para obtener más información, consulta Crea verificaciones de estado.
Para que las verificaciones de estado de gRPC funcionen correctamente, los backends de gRPC deben implementar el protocolo de verificación de estado de gRPC. Si no se implementa este protocolo, en su lugar usa una verificación de estado de TCP. Lo que no debes hacer usar una verificación de estado HTTP, HTTPS o HTTP/2 con servicios de gRPC.
Cuando uses grupos de instancias, asegúrate de que el puerto con nombre especificado en el grupo de instancias coincida con el puerto que se usó en la verificación de estado. Cuando uses grupos de extremos de red (NEG), asegúrate de que la especificación del servicio de GKE tenga la anotación de NEG correcta y de que la verificación de estado esté configurada para usar el puerto de entrega del NEG.
Comprueba que el protocolo del extremo esté configurado como
GRPC
.
RPC falla porque la política del balanceo de cargas no es compatible
Es posible que aparezca un mensaje de error como uno de los siguientes en tus registros:
error parsing "CDS" response: resource "cloud-internal-istio:cloud_mp_248715": unexpected lbPolicy RING_HASH in response
error={"description":"errors parsing CDS response", "file":"external/com_github_grpc_grpc/src/core/ext/xds/xds_api.cc", "file_line":3304, "referenced_errors":[{"description":"cloud-internal-istio:cloud_mp_248715: LB policy is not supported."
WARNING: RPC failed: Status{code=INTERNAL, description=Panic! This is a bug!, cause=java.lang.NullPointerException: provider at com.google.common.base.Preconditions.checkNotNull(Preconditions.java:910) at io.grpc.internal.ServiceConfigUtil$PolicySelection.<init>(ServiceConfigUtil.java:418) at io.grpc.xds.CdsLoadBalancer2$CdsLbState.handleClusterDiscovered(CdsLoadBalancer2.java:190)
Esto se debe a que RING_HASH no es compatible con el lenguaje y la versión particular del cliente que se usa. Si quieres solucionar el problema, actualiza la configuración del servicio de backend para que solo use políticas de balanceo de cargas compatibles o actualiza el cliente a una versión compatible. Para obtener versiones de cliente compatibles, consulta funciones de xDS en gRPC.
La configuración de seguridad no se genera como se esperaba
Si estás configurando la seguridad del servicio y esta no se genera como se espera, examina las políticas de extremos en tu implementación.
Cloud Service Mesh no admite situaciones en las que hay dos o más extremos de políticas que coinciden de forma equitativa con un extremo, por ejemplo, dos políticas con las mismas etiquetas y puertos, o dos o más políticas con diferentes con etiquetas que coinciden por igual con las etiquetas de un extremo. Si deseas obtener más información sobre cómo las políticas de extremos coinciden con las etiquetas de un extremo, consulta las API para EndpointPolicy.EndpointMatcher.MetadataLabelMatcher. En estos casos, Cloud Service Mesh no genera una configuración de seguridad de cualquiera de las políticas en conflicto.
Soluciona los problemas del estado de la malla de servicios
En esta guía, se proporciona información para ayudarte a resolver problemas de configuración de Cloud Service Mesh.
Comportamiento de Cloud Service Mesh cuando la mayoría de los extremos están en mal estado
Para una mejor confiabilidad, cuando el 99% de los extremos están en mal estado, Cloud Service Mesh configura el plano de datos para ignorar la el estado de los extremos. En cambio, el plano de datos balancea el tráfico entre todos los extremos porque es posible que el puerto de entrega aún funcione.
Los backends en mal estado generan una distribución subóptima del tráfico
Cloud Service Mesh usa la información del recurso HealthCheck
adjunto a un servicio de backend para evaluar el estado de los backends.
Cloud Service Mesh usa este estado para enrutar el tráfico al backend en buen estado más cercano. Si algunos de tus backends están en mal estado, es posible que el tráfico se siga procesando, pero con una distribución subóptima. Por ejemplo, el tráfico podría fluir a una región en la que los backends en buen estado todavía están presentes, pero esto está mucho más lejos del cliente, lo que genera latencia. Para identificar y supervisar el estado de los backends, prueba los siguientes pasos:
- Verifica el estado del servicio de backend en la consola de Google Cloud.
Ir a los servicios de Cloud Service Mesh - Asegúrate de que el registro esté habilitado para el recurso
HealthCheck
. - Si las verificaciones de estado comenzaron a fallar recientemente, inspecciona los registros de auditoría de Cloud para determinar si la configuración de
HealthCheck
cambió recientemente.
¿Qué sigue?
- Para obtener información sobre cómo funciona Cloud Service Mesh, consulta la Descripción general de Cloud Service Mesh.
- Para obtener información sobre cómo funciona Cloud Service Mesh con servicios de gRPC sin proxy, consulta la descripción general de Cloud Service Mesh con servicios de gRPC sin proxy.
- Para obtener información general sobre la solución de problemas de Cloud Service Mesh, consulta Soluciona problemas de implementaciones que usan Envoy.
- Para obtener asistencia adicional sobre el uso de Cloud Service Mesh, consulta Obtener asistencia.