In diesem Thema werden Schritte erläutert, mit denen Sie Probleme mit dem Message Processor beheben können. Der Message Processor ist Teil der
apigee-runtime
-Komponente. Weitere Informationen finden Sie unter Laufzeitdienst-Konfiguration – Übersicht.
Bereitschaftsprüfung schlägt mit dem HTTP-Statuscode 500 fehl
Symptom
Mindestens ein apigee-runtime
-Pod ist nicht bereit.
Fehlermeldung
Wenn Sie kubectl
zur Beschreibung eines fehlgeschlagenen apigee-runtime
-Pods verwenden, wird folgender Fehler angezeigt:
Readiness probe failed: HTTP probe failed with statuscode: 500
Beispiele:
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 ...
Mögliche Ursachen
Der Fehler bedeutet, dass kein aktiver Vertrag für den Nachrichtenprozessor verfügbar ist, um Traffic zu verarbeiten. In diesem Status kann der Nachrichtenprozessor sich nicht als "bereit" deklarieren.
Ursache | Beschreibung |
---|---|
Verbindungsproblem zwischen Synchronizer und Verwaltungsebene | Der Synchronizer kann keine Verbindung zur Verwaltungsebene herstellen. Dieses Problem tritt normalerweise auf, wenn Sie die contractProvider -URL überschreiben und ihr ein falsches Dienstkonto zuweisen. Beispiel: Sie konfigurieren ein Dienstkonto für eine Staging-Bereitstellung mit einer contractProvider -URL, die auf den Produktionsserver verweist.
|
Problem mit dem Nachrichtenprozessor zum Verbindungsaufbau mit Synchronizer | Startet ein neuer MP im Rahmen einer automatischen Skalierung oder eines Pod-Neustarts, wird dieser Fehler möglicherweise angezeigt. Dieses Problem tritt im Allgemeinen auf, wenn der Synchronizer nicht verfügbar ist und der MP seinen Vertrag nicht laden konnte. |
Diagnose: Verbindungsproblem zwischen Synchronizer und Verwaltungsebene
So diagnostizieren Sie ein Verbindungsproblem zwischen Synchronizer und Verwaltungsebene:
- Lassen Sie die im Cluster enthaltenen Pods auflisten:
kubectl get pods -n namespace
- Öffnen Sie eine Shell in einem
apigee-synchronizer
-Pod:kubectl exec -it -n namespace synchronizer-pod-name bash
Beispiele:
kubectl exec -it -n apigee apigee-synchronizer-apigee-gcp-prod1-test-blue-cnj5x bash
- Wechseln Sie zum folgenden Verzeichnis:
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 - Prüfen Sie die aktive Version in
version.properties
. Beispiele:cat versions.properties #active repository version #Sat Dec 14 19:45:00 GMT 2019 active.version=749
- Achten Sie darauf, dass der Wert von
active.version
mit dem Namen des Vertragsordners übereinstimmt. Im obigen Beispiel ist der Ordnername750
. Die Elemente stimmen nicht überein:dr-xr-sr-x 4 apigee apigee 4096 Sep 12 16:52 750
- Beenden Sie die Pod-Shell.
Lösung
Wenn version.properties
fehlt oder wie oben beschrieben eine Version nicht übereinstimmt, prüfen Sie die Synchronizer-Logs, um festzustellen, warum die neuesten Verträge nicht heruntergeladen werden. Beispiele:
kubectl logs -f -n namespace synchronizer-pod-name
Informationen zum Interpretieren der Synchronizer-Logs finden Sie unter Synchronizer-Logs.
Wenn der Synchronizer ausgefallen ist, starten Sie ihn mit apigeectl
neu. Beispiele:
$APIGEECTL_HOME/apigeectl apply -f overrides/overrides.yaml --org --env env-name
Diagnose: Verbindungsproblem zwischen Nachrichtenprozessor und Synchronizer
So diagnostizieren Sie ein Verbindungsproblem zwischen Nachrichtenprozessor und Synchronizer:
- Lassen Sie die im Cluster enthaltenen Pods auflisten:
kubectl get pods -n namespace
- Prüfen Sie anhand der Laufzeitlogs, warum die Verträge nicht heruntergeladen werden:
kubectl logs -f -n namespace pod-name
Beispiele:
kubectl logs -f -n apigee apigee-runtime-apigee-gcp-prod1-test-blue-67db4f457b-9c7c7
Startet ein neuer MP im Rahmen eines Autoscalings oder Pod-Neustarts, so kann es sein, dass der MP die Verträge nicht lädt. Normalerweise tritt das Problem auf, wenn der Synchronizer nicht verfügbar ist. In diesem Fall kann der MP die Verträge nicht laden. Beispiele:
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)
Lösung
Versuchen Sie, den Synchronizer neu zu starten. Beispiele:
$APIGEECTL_HOME/apigeectl apply -f overrides/overrides.yaml --org --env env-name
Die Bereitschaftsprüfung schlägt wegen einem ungültigen Verschlüsselungsschlüssel fehl
Symptom
Die apigee-runtime
-Pods befinden sich nicht im Status „Bereit“.
Diagnose
Wenn Sie kubectl
für die Beschreibung eines fehlgeschlagenen apigee-runtime
-Pods verwenden, wird folgender Fehler angezeigt: Readiness probe failed: Probe hybrid-encryption-key-validation-probe failed
.
Beispiele:
$ 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 = []} ...
Lösung
Unterstützte Längen für Verschlüsselungsschlüssel sind 16, 24 oder 32 Byte. Der Wert des Schlüssels muss base64-codiert sein. Weitere Informationen zum Erstellen eines korrekt formatierten Schlüssels finden Sie unter Datenverschlüsselung.
Logs des Nachrichtenprozessors anzeigen
Ausführliche Informationen zum Anzeigen und Interpretieren von Nachrichtenprozessor-Logs finden Sie unter Laufzeitlogs.
Einen API-Proxy aus dem Laufzeit-Pod aufrufen
In einigen Situationen hilft es bei der Fehlersuche, zu prüfen, ob ein API-Proxy-Aufruf direkt aus dem Pod apigee-runtime
möglich ist. Damit wird das Ingress-Gateway umgangen.
- Führen Sie folgenden Befehl aus, um an Port 8443 weiterzuleiten. So können Sie die API im Pod aufrufen:
kubectl port-forward -n namespace apigee-runtime-pod-name 8443:8443
- Einen bereitgestellten API-Proxy aufrufen Wenn der Proxy-Basispfad beispielsweise
ilove-apis
lautet: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
Verwaltungs-API prüfen
Sie können die unten beschriebene API verwenden, um zu prüfen, ob die Verwaltungs-API ordnungsgemäß funktioniert.
- Rufen Sie die Namen der Pods in Ihrem Cluster ab:
kubectl get pods -n namespace
- Verwenden Sie die Portweiterleitung, um auf den
apigee-runtime
-Pod zuzugreifen. Die Syntax für die Portweiterleitung lautet wie folgt:kubectl port-forward -n namespace podname 8843:8843
Beispiele:
kubectl port-forward -n apigee \ apigee-runtime-my-organization-test-blue-57965b7789-6j4bp 8843:8843
- Verwenden Sie dann in einem anderen Terminalfenster ein Dienstprogramm wie
curl
, um eine Anfrage an dieclassification/tree
-API zu senden, wie im folgenden Beispiel gezeigt:curl -k https://0:8843/v1/classification/tree
Hier sehen Sie eine Beispielantwort, in der Informationen zu den bereitgestellten Proxys in der "Testumgebung" aufgeführt werden:
[ { "condition" : "(always matches)", "virtualHost" : { "env" : "test", "name" : "default", "org" : "my-organization", "tree" : { "elements" : [ { "application" : "myproxy", "basePath" : "/myproxy", "name" : "default", "revision" : "1" } ], "name" : "IdentificationTree" } } } ]
Logging verwenden, um Probleme mit Laufzeit-Pods zu beheben
Zur Fehlerbehebung können Sie eine Logsitzung erstellen, um eine detaillierte Logausgabe für die apigee-runtime
-Pods zu generieren.
Logsitzung erstellen
So erstellen Sie eine Logsitzung für einen Laufzeit-Pod:
- Listen Sie die Laufzeit-Pods auf. Standardmäßig befinden sie sich im Namespace
apigee
. Wenn Sie einen anderen Namespace ausgewählt haben, verwenden Sie stattdessen diesen:kubectl get pods -n apigee
- Wählen Sie einen der aufgelisteten
apigee-runtime
-Pods zur Fehlerbehebung. - Erstellen Sie mit der
/logsessions
API eine Logsitzung im Laufzeit-Pod, für den Sie Fehler beheben möchten. Weitere Informationen zur API finden Sie unter Informationen zur Logsessions API:kubectl exec -it RUNTIME_POD_NAME -n apigee \ -- curl "https://0:8843/v1/logsessions?loggerNames=ALL&level=FINE&timeout=60000" -k -X POST -v
Beispiele:
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
Die Antwort ist eine Logsitzungs-ID. Beispiel:
9f831a7d-e533-4ead-8e58-12ec1059a622
- Geben Sie die Logs aus:
kubectl logs -f -n apigee RUNTIME_POD_NAME
Logsitzungen auflisten
So rufen Sie eine Liste aller aktiven Logsitzungen für einen Laufzeit-Pod ab:
kubectl exec -it RUNTIME_POD_NAME -n apigee \ -- curl "https://0:8843/v1/logsessions" -k -v
Logsitzung abrufen
So rufen Sie Logsitzungsdetails ab:
kubectl exec -it RUNTIME_POD_NAME -n apigee \ -- curl "https://0:8843/v1/logsessions/LOG_SESSION_ID" -k -v
Logsitzung beenden
So beenden Sie eine Logsitzung:
kubectl exec -it RUNTIME_POD_NAME -n apigee \ -- curl "https://0:8843/v1/logsessions/LOG_SESSION_ID" -k -X DELETE -v
Informationen zur Logsessions API
In diesem Abschnitt werden die Abfrageparameter der Logsessions API beschrieben:
loggerNames
: Gibt den anzuzeigenden Logausgabetyp an. Mögliche Werte sindCONTRACT_REPLICATION
,DEBUG.SESSION
oderALL
.level
: Gibt die Ebene der Logausgabe an. Zulässige Werte sindFINEST
,FINER
,FINE
,INFO
,SEVERE
,ALL
.timeout
: Gibt die Zeit an, die die Logsitzung für die angegebene Logebene ausgeführt wird. Nach Ablauf des Zeitlimits wird die Logebene aufINFO
zurückgesetzt.
Bei Erfolg gibt die API eine Sitzungs-ID für die Logsitzung zurück.