En este tema, se analizan los pasos que puedes seguir para solucionar problemas relacionados con el procesador de mensajes. El procesador de mensajes es parte del componente apigee-runtime
. Consulta también Descripción general de la configuración del servicio del entorno de ejecución.
La prueba de disponibilidad falla con el código de estado HTTP 500
Síntoma
Uno o más pods apigee-runtime
no están en el estado Listo.
Mensaje de error
Cuando usas kubectl
para describir un pod de apigee-runtime
con errores, verás el siguiente error:
Readiness probe failed: HTTP probe failed with statuscode: 500
Por ejemplo:
kubectl describe pod -n hybrid \ apigee-runtime-apigee-gcp-prod1-test-blue-67db4f457b-9c7c7 ... apigee-runtime-apigee-gcp-prod1-test-blue-67db4f457b-9c7c7 Readiness probe failed: HTTP probe failed with statuscode: 500 ...
Causas posibles
El error significa que no hay un contrato activo disponible para que el procesador de mensajes entregue el tráfico. En este estado, el procesador de mensajes no puede llamarse a sí mismo como “listo”.
Causa | Descripción |
---|---|
Problema de conexión del plano de administración con el sincronizador | El sincronizador no puede conectarse con el plano de administración. Este problema suele ocurrir en casos en los que anulas la URL contractProvider y asocias la cuenta de servicio incorrecta con ella. Por ejemplo, si configuras una cuenta de servicio para una implementación de etapa de pruebas con una URL contractProvider que apunta al servidor de producción.
|
Problema de conexión entre el procesador de mensajes y el sincronizador | Si aparece un nuevo MP como parte de un ajuste de escala automático o de un reinicio de Pod, es posible que veas este error. Por lo general, este problema ocurre cuando el sincronizador está inactivo y el MP no pudo cargar su contrato. |
Diagnóstico: Problema de conexión entre el Sincronizador y el plano de administración
Para diagnosticar un Problema de conexión entre el Sincronizador y el plano de administración, haz lo siguiente:
- Obtén una lista de los pods del clúster.
kubectl get pods -n namespace
- Abre una shell en un Pod
apigee-synchronizer
:kubectl exec -it -n namespace synchronizer-pod-name bash
Por ejemplo:
kubectl exec -it -n apigee apigee-synchronizer-apigee-gcp-prod1-test-blue-cnj5x bash
- Ve al siguiente directorio:
cd /application/opt/apigee/var/log/apigee-synchronizer
ls
dr-xr-sr-x 4 apigee apigee 4096 Sep 12 16:52 750 drwxr-sr-x 2 apigee apigee 4096 Sep 12 16:52 cachedFiles -rw-r--r-- 1 apigee apigee 22295 Sep 12 16:52 config.log -rw-r--r-- 1 apigee apigee 76 Sep 12 16:52 versions.properties - Verifica la versión activa en
version.properties
. Por ejemplo:cat versions.properties #active repository version #Sat Dec 14 19:45:00 GMT 2019 active.version=749
- Asegúrate de que el valor de
active.version
coincida con el nombre del número de carpeta del contrato. En el ejemplo anterior (que también se muestra a continuación), el nombre de la carpeta es750
. Por lo tanto, no coinciden:dr-xr-sr-x 4 apigee apigee 4096 Sep 12 16:52 750
- Sal de la shell del Pod.
Solución
Si falta version.properties
o si hay una coincidencia incorrecta de la versión como se explicó antes, revisa los registros de sincronizador para tratar de determinar por qué los contratos más actuales no se están descargado. Por ejemplo:
kubectl logs -f -n namespace synchronizer-pod-name
Si deseas obtener información para interpretar los registros de sincronización, consulta Registros del sincronizador.
Si el sincronizador está inactivo, intenta reiniciarlo mediante apigeectl
. Por ejemplo:
$APIGEECTL_HOME/apigeectl apply -f overrides/overrides.yaml --org --env env-name
Diagnóstico: Problema de conexión del procesador de mensajes para sincronizar la conexión
Para diagnosticar un problema de conexión del procesador de mensajes al sincronizador, haz lo siguiente:
- Obtén una lista de los Pods del clúster:
kubectl get pods -n namespace
- Revisa los registros del entorno de ejecución para descubrir por qué no se descargan los contratos:
kubectl logs -f -n namespace pod-name
Por ejemplo:
kubectl logs -f -n apigee apigee-runtime-apigee-gcp-prod1-test-blue-67db4f457b-9c7c7
Es posible que el nuevo MP aparezca como parte de un ajuste de escala automático o reinicio del Pod, que el MP no pueda cargar los contratos. Por lo general, el problema ocurre cuando el sincronizador está inactivo, lo cual evita que el MP cargue los contratos. Por ejemplo:
2019-09-13 16:59:24,331 podName:N/A ipAddress:N/A dpColor:N/A HttpClient@331886186-301 DEBUG o.e.j.c.AbstractConnectionPool - AbstractConnectionPool$1.failed() : Connection 1/64 creation failed java.net.UnknownHostException: apigee-synchronizer-apigee-gcp-prod1-test.hybrid.svc.cluster.local at java.net.InetAddress.getAllByName0(InetAddress.java:1281) at java.net.InetAddress.getAllByName(InetAddress.java:1193) at java.net.InetAddress.getAllByName(InetAddress.java:1127) at org.eclipse.jetty.util.SocketAddressResolver$Async.lambda$resolve$1(SocketAddressResolver.java:167) at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:672) at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:590) at java.lang.Thread.run(Thread.java:748) at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:590) at java.lang.Thread.run(Thread.java:748)
Solución
Intenta reiniciar el sincronizador. Por ejemplo:
$APIGEECTL_HOME/apigeectl apply -f overrides/overrides.yaml --org --env env-name
La prueba de disponibilidad falla para una clave de encriptación no válida.
Síntoma
Los pods apigee-runtime
no están en el estado Listo.
Diagnóstico
Cuando usas kubectl
para describir un Pod de apigee-runtime
con errores, verás este error: Readiness probe failed: Probe hybrid-encryption-key-validation-probe failed
.
Por ejemplo:
$ kubectl describe pod -n namespace apigee-runtime-pod-name ... Readiness probe failed: Probe hybrid-encryption-key-validation-probe failed due to com.apigee.probe.model.ProbeFailedException{ code = hybrid.encryption.key.InvalidEncryptionKey, message = Invalid encryption key. Please check the length of the encryption key, associated contexts = []} ...
Solución
Las longitudes de clave de encriptación admitidas son 16 o 24 o 32 bytes, y el valor de la clave debe estar codificado en base64. Si deseas obtener más información para crear una clave con el formato correcto, consulta Encriptación de datos.
Visualiza los registros del Message Processor
Si deseas obtener más información para interpretar y ver los registros del procesador de mensajes, consulta Registros del entorno de ejecución.
Llama a un proxy de API desde el Pod del entorno de ejecución
En algunas situaciones para ayudar a aislar un problema, se recomienda verificar si puedes realizar una llamada de proxy de API directamente desde el pod apigee-runtime
y, de ese modo, omitir la puerta de enlace de entrada.
- Ejecuta el siguiente comando para reenviar al puerto 8443. Esto te permite llamar a la API en el Pod:
kubectl port-forward -n namespace apigee-runtime-pod-name 8443:8443
- Llama a un proxy de API implementado. Por ejemplo, en el que la ruta base del proxy es
ilove-apis
:curl -k -v https://0:8443//ilove-apis < HTTP/1.1 200 OK < X-Powered-By: Apigee < Access-Control-Allow-Origin: * < X-Frame-Options: ALLOW-FROM RESOURCE-URL < X-XSS-Protection: 1 < X-Content-Type-Options: nosniff < Content-Type: text/html; charset=utf-8 < Content-Length: 18 < ETag: W/"12-Jb9QP1bUxNSmZkxQGt5KLQ" < Date: Fri, 13 Sep 2019 18:33:46 GMT < Via: 1.1 google < X-Apigee.Message-ID: 016f5f7f-c59e-404c-86e8-7b0737833f982 < X-Apigee.dp.color: blue < X-Apigee.proxy: /organizations/my-org/environments/test/apiproxies/i-loveapis/revisions/1 < X-Apigee.proxy.basepath: /ilove-apis < X-Apigee.target-latency: 9 < * Connection #0 to host 0 left intact <H2>I <3 APIs
Verifica la API de Management
Puedes usar la API que se describe a continuación para verificar si la API de Management funciona correctamente.
- Obtén los nombres de los pods en tu clúster:
kubectl get pods -n namespace
- Usa redirección de puertos para obtener acceso al pod
apigee-runtime
. La sintaxis para la redirección de puertos es la siguiente:kubectl port-forward -n namespace podname 8843:8843
Por ejemplo:
kubectl port-forward -n apigee \ apigee-runtime-my-organization-test-blue-57965b7789-6j4bp 8843:8843
- Luego, en otra ventana de la terminal, usa una utilidad como
curl
para enviar una solicitud a la APIclassification/tree
, como se muestra en el siguiente ejemplo:curl -k https://0:8843/v1/classification/tree
A continuación, se muestra una respuesta de ejemplo, en la que se enumera la información sobre los proxies implementados en el entorno de “prueba”:
[ { "condition" : "(always matches)", "virtualHost" : { "env" : "test", "name" : "default", "org" : "my-organization", "tree" : { "elements" : [ { "application" : "myproxy", "basePath" : "/myproxy", "name" : "default", "revision" : "1" } ], "name" : "IdentificationTree" } } } ]
Usa el registro para depurar problemas del Pod del entorno de ejecución
Para ayudar a solucionar problemas, puedes crear una sesión de registro a fin de producir un resultado de registro detallado para los pods apigee-runtime
.
Crea una sesión de registro
Para crear una sesión de registro para un Pod del entorno de ejecución, haz lo siguiente:
- Enumera los pods del entorno de ejecución. De forma predeterminada, están en el espacio de nombres
apigee
. Si eliges un espacio de nombres diferente, úsalo en su lugar:kubectl get pods -n apigee
- Elige cualquiera de los pods
apigee-runtime
enumerados para depurar. - Crea una sesión de registro en el pod del entorno de ejecución en la que deseas solucionar problemas mediante la API de
/logsessions
. Para obtener detalles sobre la API, consulta Acerca de la API de logsessions:kubectl exec -it RUNTIME_POD_NAME -n apigee \ -- curl "https://0:8843/v1/logsessions?loggerNames=ALL&level=FINE&timeout=60000" -k -X POST -v
Por ejemplo:
kubectl exec -it apigee-runtime-hybrid-18-01232-dev-d27ca57-190rc6-3klyg-lc7h5 -n apigee \ -- curl "https://0:8843/v1/logsessions?loggerNames=ALL&level=FINE&timeout=60000" -k -X POST -v
La respuesta es un ID de sesión de registro. Por ejemplo:
9f831a7d-e533-4ead-8e58-12ec1059a622
. - Imprime los registros:
kubectl logs -f -n apigee RUNTIME_POD_NAME
Enumerar sesiones de registro
Para obtener una lista de todas las sesiones de registro activas para un Pod de entorno de ejecución, haz lo siguiente:
kubectl exec -it RUNTIME_POD_NAME -n apigee \ -- curl "https://0:8843/v1/logsessions" -k -v
Obtén una sesión de registro
Para obtener los detalles de la sesión de registro, sigue estos pasos:
kubectl exec -it RUNTIME_POD_NAME -n apigee \ -- curl "https://0:8843/v1/logsessions/LOG_SESSION_ID" -k -v
Finaliza una sesión de registro
Para finalizar una sesión de registro, haz lo siguiente:
kubectl exec -it RUNTIME_POD_NAME -n apigee \ -- curl "https://0:8843/v1/logsessions/LOG_SESSION_ID" -k -X DELETE -v
Acerca de la API de logsessions
En esta sección, se describen los parámetros de búsqueda de la API de logsessions:
loggerNames
: Especifica el tipo de resultado de registro que se mostrará. Los valores posibles sonCONTRACT_REPLICATION
,DEBUG.SESSION
oALL
.level
: Especifica el nivel de resultado del registro. Estos son algunos de los valores posibles:FINEST
,FINER
,FINE
,INFO
,SEVERE
yALL
.timeout
: Especifica la cantidad de tiempo que la sesión de registro operará para el nivel de registro especificado. Después de tiempo de espera, el nivel de registro se revierte aINFO
.
Si se realiza de forma correcta, la API muestra un ID de sesión para la sesión de registro.