Proxyprobleme in Cloud Service Mesh beheben
In diesem Dokument werden häufig auftretende Cloud Service Mesh-Probleme und deren Behebung erläutert. Weitere Informationen finden Sie unter Support.
Beim Erreichen eines Endpunkts mit Istio wurde die Verbindung abgelehnt
Möglicherweise treten zeitweise Fehler aufgrund einer abgelehnten Verbindung (ECONNREFUSED
) auf.
mit der Kommunikation von Ihren Clustern zu Ihren Endpunkten, z. B. Memorystore
Redis, CloudSQL oder ein anderer externer Dienst, den Ihre Anwendungsarbeitslast benötigt
Reichweite.
Dies kann auftreten, wenn Ihre Anwendungsarbeitslast schneller gestartet wird als
istio-proxy (Envoy
) und versucht, einen externen Endpunkt zu erreichen. Weil
istio-init (initContainer
) bereits ausgeführt, sind
iptables-Regeln eingerichtet haben, die den gesamten ausgehenden Traffic an Envoy
weiterleiten. Seit
istio-proxy noch nicht bereit ist, leiten die iptables-Regeln den Traffic
Sidecar-Proxy, der noch nicht gestartet wurde, sodass die Anwendung
ECONNREFUSED
Fehler.
So prüfen Sie, ob dieser Fehler vorliegt:
Prüfen Sie die Stackdriver-Protokolle mit dem folgenden Filter, um zu ermitteln, bei welchen Pods das Problem aufgetreten ist.
Das folgende Beispiel zeigt eine typische Fehlermeldung:
Error: failed to create connection to feature-store redis, err=dial tcp 192.168.9.16:19209: connect: connection refused [ioredis] Unhandled error event: Error: connect ECONNREFUSED
Suchen Sie nach einem Auftreten des Problems. Wenn Sie Legacy-Stackdriver verwenden, Verwenden Sie dann
resource.type="container"
.resource.type="k8s_container" textPayload:"$ERROR_MESSAGE$"
Maximieren Sie die letzte Zeile, um den Namen des Pods zu sehen, und notieren Sie sich die
pod_name
unterresource.labels
.Rufen Sie das erste Auftreten des Problems für diesen Pod ab:
resource.type="k8s_container" resource.labels.pod_name="$POD_NAME$"
Beispielausgabe:
E 2020-03-31T10:41:15.552128897Z post-feature-service post-feature-service-v1-67d56cdd-g7fvb failed to create connection to feature-store redis, err=dial tcp 192.168.9.16:19209: connect: connection refused post-feature-service post-feature-service-v1-67d56cdd-g7fvb
Notieren Sie sich den Zeitstempel des ersten Fehlers für diesen Pod.
Verwenden Sie den folgenden Filter, um die Pod-Startereignisse zu sehen.
resource.type="k8s_container" resource.labels.pod_name="$POD_NAME$"
Beispielausgabe:
I 2020-03-31T10:41:15Z spec.containers{istio-proxy} Container image "docker.io/istio/proxyv2:1.3.3" already present on machine spec.containers{istio-proxy} I 2020-03-31T10:41:15Z spec.containers{istio-proxy} Created container spec.containers{istio-proxy} I 2020-03-31T10:41:15Z spec.containers{istio-proxy} Started container spec.containers{istio-proxy} I 2020-03-31T10:41:15Z spec.containers{APP-CONTAINER-NAME} Created container spec.containers{APP-CONTAINER-NAME} W 2020-03-31T10:41:17Z spec.containers{istio-proxy} Readiness probe failed: HTTP probe failed with statuscode: 503 spec.containers{istio-proxy} W 2020-03-31T10:41:26Z spec.containers{istio-proxy} Readiness probe failed: HTTP probe failed with statuscode: 503 spec.containers{istio-proxy} W 2020-03-31T10:41:28Z spec.containers{istio-proxy} Readiness probe failed: HTTP probe failed with statuscode: 503 spec.containers{istio-proxy} W 2020-03-31T10:41:31Z spec.containers{istio-proxy} Readiness probe failed: HTTP probe failed with statuscode: 503 spec.containers{istio-proxy} W 2020-03-31T10:41:58Z spec.containers{istio-proxy} Readiness probe failed: HTTP probe failed with statuscode: 503 spec.containers{istio-proxy}
Anhand der Zeitstempel der Fehler und der Istio-Proxy-Startereignisse können Sie prüfen, ob die Fehler auftreten, wenn
Envoy
nicht bereit ist.Wenn die Fehler auftreten, während der Istio-Proxy-Container noch nicht bereit ist, ist es normal, dass Fehlermeldungen zur Verbindungsverweigerung angezeigt werden. Im vorherigen Beispiel hat der Pod bereits ab
2020-03-31T10:41:15.552128897Z
versucht, eine Verbindung zu Redis herzustellen. Bis zum2020-03-31T10:41:58Z
hat der Istio-Proxy jedoch weiterhin keine Bereitschaftstests bestanden.Obwohl der istio-proxy-Container zuerst gestartet wurde, ist es möglich, dass er war nicht schnell genug bereit, bevor die App bereits versuchte, eine Verbindung herzustellen an den externen Endpunkt.
Wenn dies Ihr Problem ist, fahren Sie mit der folgenden Schritten zur Fehlerbehebung.
Fügen Sie die Anmerkungen auf Pod-Ebene hinzu. Dies ist nur im Pod verfügbar und nicht auf globaler Ebene.
annotations: proxy.istio.io/config: '{ "holdApplicationUntilProxyStarts": true }'
Ändern Sie den Anwendungscode so, dass geprüft wird, ob
Envoy
bereit ist, bevor weitere Anfragen an externe Dienste gesendet werden. Zum Beispiel auf Anwendungsstart, Initiieren einer Schleife, über die Anfragen an den istio-proxy gesendet werden und wird erst fortgesetzt, wenn der Fehler 200 erreicht wird. Der Endpunkt „health“ des Istio-Proxys lautet:http://localhost:15020/healthz/ready
Race-Bedingung bei der Sidecar-Injection zwischen Vault und Istio
Bei Verwendung von vault
für die Verwaltung von Secrets wird manchmal durch vault
eine Sidecar-Datei eingeschleust
vor istio
, wodurch Pods im Status Init
hängen bleiben. In diesem Fall bleiben die erstellten Pods nach dem Neustart einer Bereitstellung oder der Bereitstellung einer neuen Bereitstellung im Status „Init“ hängen. Beispiel:
E 2020-03-31T10:41:15.552128897Z
post-feature-service post-feature-service-v1-67d56cdd-g7fvb failed to create
connection to feature-store redis, err=dial tcp 192.168.9.16:19209: connect:
connection refused post-feature-service post-feature-service-v1-67d56cdd-g7fvb
Dieses Problem wird durch eine Race-Bedingung verursacht. Sowohl Istio als auch vault
fügen den Sidecar ein und Istio muss dies als Letztes tun. Der istio
-Proxy wird während der Initialisierung von Containern nicht ausgeführt. Der istio
-Init-Container richtet Iptables-Regeln ein, um den gesamten Traffic an den Proxy weiterzuleiten. Da sie noch nicht ausgeführt wird,
und alle Zugriffe werden blockiert. Deshalb muss der Init-Container als letzter ausgeführt werden, damit der Proxy sofort nach der Einrichtung der iptables-Regeln einsatzbereit ist. Leider ist die Reihenfolge nicht deterministisch. Wenn also Istio injiziert wird,
aber zuerst geht es kaputt.
Um dieses Problem zu beheben, lassen Sie die IP-Adresse von vault
zu, damit der Traffic
wird nicht an den nicht bereitstehenden Envoy-Proxy weitergeleitet.
wodurch die Kommunikation blockiert wird. Dazu muss eine neue Anmerkung mit dem Namen excludeOutboundIPRanges
hinzugefügt werden.
Bei verwaltetem Cloud Service Mesh ist dies nur auf Bereitstellungs- oder Podebene unter spec.template.metadata.annotations
möglich, z. B.:
apiVersion: apps/v1
kind: Deployment
...
...
...
spec:
template:
metadata:
annotations:
traffic.sidecar.istio.io/excludeOutboundIPRanges:
Für ein clusterinternes Cloud Service Mesh gibt es die Möglichkeit, es unter spec.values.global.proxy.excludeIPRanges
mit einem IstioOperator als globales Service Mesh festzulegen, z. B.:
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
values:
global:
proxy:
excludeIPRanges: ""
Starten Sie Ihre Arbeitslasten neu, nachdem Sie die Anmerkung hinzugefügt haben.