Probleme bei der Trafficverwaltung in Cloud Service Mesh beheben
In diesem Abschnitt werden häufig auftretende Probleme bei Cloud Service Mesh und deren Behebung beschrieben. Weitere Informationen finden Sie unter Support.
Fehler bei der API-Serververbindung in istiod-Logs
Istiod kann keine Verbindung zum apiserver herstellen, wenn Fehler angezeigt werden, die in etwa so aussehen:
error k8s.io/client-go@v0.18.0/tools/cache/reflector.go:125: Failed to watch *crd.IstioSomeCustomResource`…dial tcp 10.43.240.1:443: connect: connection refused
Sie können den regulären Ausdruck /error.*cannot list resource/ verwenden, um diesen Fehler in den Logs zu finden.
Dieser Fehler ist in der Regel nur vorübergehend. Wenn Sie die Proxylogs mit kubectl erreicht haben, ist das Problem möglicherweise bereits behoben. Dieser Fehler wird normalerweise durch Ereignisse verursacht, die den API-Server vorübergehend nicht verfügbar machen, z. B. wenn ein API-Server, der sich nicht in einer Hochverfügbarkeitskonfiguration befindet, für ein Upgrade oder eine Autoscaling-Änderung neu gestartet wird.
Der istio-init-Container stürzt ab
Dieses Problem kann auftreten, wenn die Pod-iptables-Regeln nicht auf den Namespace des Pod-Netzwerks angewendet werden. Mögliche Ursachen:
- Unvollständige Installation von istio-cni
- Unzureichende Arbeitslast-Pod-Berechtigungen (fehlende
CAP_NET_ADMIN-Berechtigung)
Wenn Sie das Istio CNI-Plug-in verwenden, prüfen Sie, ob Sie die Anleitung vollständig befolgt haben. Prüfen Sie, ob der istio-cni-node-Container bereit ist, und prüfen Sie die Logs. Wenn das Problem weiterhin besteht, stellen Sie eine sichere Shell (SSH) im Hostknoten her und suchen Sie in den Knotenlogs nach nsenter-Befehlen und prüfen Sie, ob Fehler vorhanden sind.
Wenn Sie das Istio CNI-Plug-in nicht verwenden, achten Sie darauf, dass der Arbeitslast-Pod die Berechtigung CAP_NET_ADMIN hat, die vom Sidecar-Injektor automatisch festgelegt wird.
Die Verbindung wurde nach dem Start des Pods abgelehnt
Wenn ein Pod gestartet wird und connection refused für die Verbindung mit einem Endpunkt versucht, könnte das Problem sein, dass der Anwendungscontainer vor dem isto-proxy-Container gestartet wurde. In diesem Fall sendet der Anwendungscontainer die Anfrage an istio-proxy, aber die Verbindung wird abgelehnt, da istio-proxy den Port noch nicht überwacht.
In diesem Fall haben Sie folgende Möglichkeiten:
Ändern Sie den Startcode Ihrer Anwendung so, dass kontinuierlich Anfragen an den
istio-proxy-Systemdiagnose gesendet werden, bis die Anwendung den Code 200 empfängt. Der Endpunkt "health"istio-proxyist:http://localhost:15020/healthz/readyFügen Sie Ihrer Anwendungsarbeitslast einen Anfragemechanismus für Wiederholungsversuche hinzu.
Die Ausgabe beim Auflisten von Gateways ist leer
Problem:Wenn Sie Gateways mithilfe von kubectl get gateway --all-namespaces auflisten, nachdem Sie ein Cloud Service Mesh-Gateway erfolgreich erstellt haben, gibt der Befehl No resources found zurück.
Dieses Problem kann unter GKE 1.20 und höher auftreten, da der GKE-Gateway-Controller die GKE-Ressource Gateway.networking.x-k8s.io/v1alpha1 automatisch in Clustern installiert. Problemumgehung:
Prüfen Sie, ob der Cluster mehrere benutzerdefinierte Gateway-Ressourcen enthält:
kubectl api-resources | grep gatewayBeispielausgabe:
gateways gw networking.istio.io/v1beta1 true Gateway gatewayclasses gc networking.x-k8s.io/v1alpha1 false GatewayClass gateways gtw networking.x-k8s.io/v1alpha1 true Gateway
Wenn in der Liste andere Einträge als Gateways mit dem
apiVersionnetworking.istio.io/v1beta1angezeigt werden, verwenden Sie im Befehlkubectlden vollständigen Ressourcennamen oder die erkennbaren Kurznamen. Führen Sie beispielsweisekubectl get gwoderkubectl get gateways.networking.istio.ioanstelle vonkubectl get gatewayaus, damit die Istio-Gateways aufgelistet werden.
Weitere Informationen zu diesem Problem finden Sie unter Kubernetes-Gateways und Istio-Gateways.
Envoy-Proxy hängt bei der Initialisierung
Wenn Debug-Logs darauf hinweisen, dass der Envoy-Proxy während der Initialisierung hängt, können Sie mit dem folgenden Befehl ermitteln, was den Prozess blockiert:
kubectl -n <ns> -c istio-proxy exec -it POD_NAME -- /usr/local/bin/pilot-agent request POST /init_dump
Fehlerbehebung bei HTTP-Antwortfehlern vom Typ 5xx
Beim Zugriff auf Anwendungen über das Istio-Ingress-Gateway können HTTP-Antwortfehler vom Typ 5xx auftreten. Führen Sie die folgenden Schritte aus, um das Problem zu diagnostizieren und zu beheben.
- Steuerungsebene identifizieren
- Mögliche Fehlkonfigurationen prüfen
- Pod-Erkennung prüfen
- Zugriffslogs analysieren
Steuerungsebene identifizieren
Bestimmen Sie die Version und Konfiguration der Steuerungsebene, da sich verschiedene Versionen auf die Diagnoseprozesse auswirken können. Führen Sie den folgenden Befehl aus, um den Status der verwalteten Steuerungsebene zu prüfen:
gcloud container fleet mesh describe --project PROJECT_ID
Der Status ACTIVE gibt an, dass die verwaltete Steuerungsebene normal ausgeführt wird.
Mögliche Fehlkonfigurationen prüfen
Häufige Fehlkonfigurationen können zu Routingfehlern führen:
- Namespace-Konflikt: Der
VirtualServicemuss sich im selben Namespace wie der GKE-Backend-Dienst befinden. - Konflikt bei der Gateway-Referenz: Der
VirtualServicemuss explizit auf das richtigeGatewayverweisen. Wenn derVirtualServicebeispielsweise aufistio-system/istio-ingressgatewayverweist, sich das Gateway aber im Namespacedefaultbefindet, wird der Traffic nicht korrekt weitergeleitet.
Pod-Erkennung prüfen
Achten Sie darauf, dass der Anwendungspod vom Mesh-Netzwerk korrekt erkannt wird:
istioctl proxy-config endpoints POD_NAME
Zugriffslogs analysieren
Aktivieren Sie Zugriffslogs, um zu ermitteln, ob Fehler von der Backend-Anwendung oder vom Proxy stammen. Wichtige Felder sind RESPONSE_FLAGS, UPSTREAM_LOCAL_ADDRESS und RESPONSE_CODE.
Wenn Logs Upstream-Fehler anzeigen, führen Sie einen direkten curl-Test für den GKE-Dienst von einem Pod im selben Namespace aus. Wenn die curl-Anfrage denselben 5xx-Fehler zurückgibt, stammt das Problem von der Backend-Anwendung selbst.
Fehlerbehebung bei SSL-Zertifikatproblemen
SSL-Zertifikatfehler am Istio-Ingress-Gateway können durch abgelaufene Zertifikate, Protokollkonflikte oder falsche Secret-Konfigurationen verursacht werden.
SSL-Fehler identifizieren
Prüfen Sie die Logs aus dem Istio-Ingress-Gateway-Pod:
kubectl logs -l app=istio-ingressgateway -n GATEWAY_NAMESPACE
Zertifikate und Schlüssel prüfen
Achten Sie darauf, dass das Zertifikat und der private Schlüssel gültig sind und übereinstimmen. Verwenden Sie dazu MD5-Hashes:
openssl x509 -noout -modulus -in CERTIFICATE.CRT | openssl md5
openssl rsa -noout -modulus -in PRIVATE_KEY | openssl md5
Prüfen Sie, ob das Zertifikat nicht abgelaufen ist und ob der allgemeine Name (Common Name, CN) oder der alternative Antragstellername (Subject Alternative Name, SAN) mit der Domain übereinstimmt.
TLS-Protokoll und Secret-Konfiguration prüfen
Prüfen Sie die TLS-Version und die Chiffresammlungen in der Gateway-CRD. Achten Sie darauf, dass sich das Kubernetes-Secret mit dem Zertifikat und dem Schlüssel im selben Namespace wie das Ingress-Gateway befindet und dass credentialName mit dem Secret-Namen übereinstimmt.
Fehlerbehebung bei zeitweiligen Timeouts für externe Endpunkte
Zeitweilige Timeouts können auftreten, wenn Anfragen an externe Endpunkte (z. B. NLB von Drittanbietern) gestellt werden, die zu mehreren IP-Adressen aufgelöst werden.
Mögliche Ursache: Auflösung von ServiceEntry
Wenn spec.resolution auf DNS gesetzt ist, verwendet Istio „strikte DNS“, die den Lastenausgleich über alle aufgelösten IP-Adressen hinweg durchführt. Einige NLBs unterstützen dies nicht.
Lösung
Setzen Sie die Auflösung für den ServiceEntry auf DNS_ROUND_ROBIN, um dieses Problem zu beheben.
Fehlerbehebung bei ungleichmäßiger Trafficverteilung
Wenn der Traffic nicht gleichmäßig auf die Anwendungspods verteilt ist, prüfen Sie Folgendes:
- Pod-Status: Achten Sie darauf, dass alle Anwendungspods während des Ungleichgewichts fehlerfrei waren.
- Load-Balancing-Algorithmus: Prüfen Sie die
DestinationRuleKonfiguration für dieloadBalancerEinstellung (z.B.consistentHashoderROUND_ROBIN). - Ort-Load-Balancing: Prüfen Sie, ob
localityLbSettingaktiviert ist. Diese Einstellung wird nicht von derTRAFFIC_DIRECTOR-Steuerungsebene unterstützt.
Fehlerbehebung bei der Dienstweitergabe und Kontingentproblemen
Wenn neue Dienste oder Netzwerkkonfigurationen nicht im Mesh-Netzwerk berücksichtigt werden, kann dies daran liegen, dass die Ressourcenkontingente im Flottenprojekt erreicht wurden.
Symptome
- Netzwerkkonfigurationen wie
VirtualServiceoderDestinationRulewerden nicht an Sidecar-Proxys übertragen. - Neue Dienste sind für das Mesh-Netzwerk „unsichtbar“, obwohl sie korrekt definiert sind.
Schritte zur Identifizierung und Behebung
- Ressourcenkontingente prüfen: Prüfen Sie, ob das Flottenprojekt sein Kontingent
für
BackendServiceRessourcen erreicht hat. Prüfen Sie dazu das Kontingent Globale interne Traffic Director-Backend-Dienste im Flottenprojekt. Cloud Service Mesh erstellt in der Regel einenBackendServicepro Kubernetes-Dienstport. - Skalierungsgrenzen prüfen: Achten Sie darauf, dass Ihre Konfiguration die unterstützten Skalierungsgrenzen für Cloud Service Mesh nicht überschreitet.
- Kontingente erhöhen: Wenn Kontingente erreicht wurden, fordern Sie eine Erhöhung für die betroffene Ressource im Flottenprojekt an, um die normale Dienst weitergabe wiederherzustellen.
Fehlerbehebung bei der Auswertung von VirtualService
Wenn sich ein VirtualService nicht wie erwartet verhält, denken Sie daran, dass Routen in der Reihenfolge ausgewertet werden, in der sie aufgeführt sind. Wenn Sie mehrere Virtual Services für denselben Host haben, werden ihre Routen zusammengeführt. Die Routen aus „älteren“ Virtual Services haben eine höhere Priorität und werden daher in der zusammengeführten Liste vor Routen aus „neueren“ Virtual Services platziert. Dadurch wird die Regel „Erste Übereinstimmung“ verstärkt.
Fehlerbehebung beim Ort-Load-Balancing
Standardmäßig leitet das Ort-Load-Balancing den Client-Traffic an Endpunkte in derselben Zone weiter (die primäre Zone oder Priorität 0). Envoy leitet den Traffic nur an Failover-Zonen (Priorität 1 oder höher) weiter, wenn Endpunkte in der primären Zone fehlerhaft oder nicht verfügbar sind.
Wenn Sie Ihre Endpunkte nicht so skalieren, dass sie die gesamte zonale Last bewältigen können, oder wenn Sie den Traffic auf mehrere Zonen aufteilen möchten, haben Sie folgende Möglichkeiten:
- Skalieren Sie die Pods in den jeweiligen Zonen, um die lokale Trafficlast zu bewältigen.
- Deaktivieren Sie die Einstellung für das Ort-Load-Balancing.
Einstellungen für das Ort-Load-Balancing identifizieren
Das Ort-Load-Balancing verwendet Knoten-Topologie-Labels, um Endpunkte zu gruppieren. Verwenden Sie die folgenden Befehle, um Knotenlabels zu prüfen und Einstellungen zu prüfen:
Knoten-Topologie-Labels prüfen:
kubectl get nodes -o custom-columns=NAME:.metadata.name,\ REGION:.metadata.labels."topology\\.kubernetes\\.io/region",\ ZONE:.metadata.labels."topology\\.kubernetes\\.io/zone"Prüfen Sie für GKE-DestinationRules die Ortseinstellungen:
kubectl get destinationrule DESTINATION_RULE_NAME -o yaml
Suchen Sie in der Ausgabe nach
localityLbSetting: enabled: true.So prüfen Sie Envoy-Proxy-Endpunkte, ‑Prioritäten und ‑Status:
istioctl proxy-config endpoints POD_NAME.NAMESPACE \ --cluster "outbound|PORT||SERVICE_FQDN" -o jsonSuchen Sie in der Endpunktkonfiguration nach dem Feld
priority.So rufen Sie die detaillierte Konfiguration der aktiven Cluster auf:
istioctl proxy-config cluster POD_NAME.NAMESPACE \ --fqdn SERVICE_FQDN -o json