Behandeln von Verbindungsproblemen mit einer App, die in einem AKS-Cluster gehostet wird
In aktuellen dynamischen Cloudumgebungen ist die Gewährleistung einer nahtlosen Verbindung mit Anwendungen, die in Azure Kubernetes Service (AKS)-Clustern gehostet werden, entscheidend für die Aufrechterhaltung der optimalen Leistung und Benutzererfahrung. In diesem Artikel wird beschrieben, wie Sie Konnektivitätsprobleme behandeln und beheben, die durch verschiedene Faktoren verursacht werden, einschließlich anwendungsseitiger Probleme, Netzwerkrichtlinien, Netzwerksicherheitsgruppenregeln (Network Security Group, NSG) oder anderen.
Notiz
Informationen zum Beheben häufig auftretender Probleme beim Herstellen einer Verbindung mit dem AKS-API-Server finden Sie unter Grundlegende Problembehandlung von Clusterverbindungsproblemen mit dem API-Server.
Voraussetzungen
Das Client-URL-Tool (cURL) oder ein ähnliches Befehlszeilentool.
Das Apt-get-Befehlszeilentool zum Behandeln von Paketen.
Das Befehlszeilentool Netcat (
nc
) für TCP-Verbindungen.Das Kubernetes-Kubectl-Tool oder ein ähnliches Tool zum Herstellen einer Verbindung mit dem Cluster. Führen Sie zum Installieren von Kubectl mithilfe der Azure CLI den Befehl "az aks install-cli " aus.
Faktoren, die Sie berücksichtigen sollten
In diesem Abschnitt werden die Schritte zur Problembehandlung behandelt, die ausgeführt werden müssen, wenn Sie Probleme haben, wenn Sie versuchen, eine Verbindung mit der Anwendung herzustellen, die in einem AKS-Cluster gehostet wird.
In jedem Netzwerkszenario sollten Administratoren bei der Problembehandlung die folgenden wichtigen Faktoren berücksichtigen:
Was ist die Quelle und das Ziel für eine Anforderung?
Was sind die Hops zwischen der Quelle und dem Ziel?
Was ist der Anforderungsantwortfluss?
Welche Hops über zusätzliche Sicherheitsebenen verfügen, z. B. die folgenden Elemente:
- Firewall
- Netzwerksicherheitsgruppe (NSG)
- Netzwerkrichtlinie
Wenn Sie jede Komponente überprüfen, rufen Sie HTTP-Antwortcodes ab und analysieren sie. Diese Codes sind nützlich, um die Art des Problems zu identifizieren und besonders hilfreich in Szenarien, in denen die Anwendung auf HTTP-Anforderungen reagiert.
Wenn andere Schritte zur Problembehandlung kein abschließendes Ergebnis liefern, nehmen Sie Paketerfassungen vom Client und Server ab. Paketerfassungen sind auch hilfreich, wenn nicht-HTTP-Datenverkehr zwischen Client und Server beteiligt ist. Weitere Informationen zum Sammeln von Paketerfassungen für die AKS-Umgebung finden Sie in den folgenden Artikeln im Leitfaden zur Datensammlung:
Erfassen Sie ein TCP-Dump von einem Linux-Knoten in einem AKS-Cluster.
Erfassen Sie ein TCP-Dump von einem Windows-Knoten in einem AKS-Cluster.
Wenn Sie wissen, wie Sie die HTTP-Antwortcodes abrufen und Paketerfassungen übernehmen, ist es einfacher, ein Netzwerkverbindungsproblem zu beheben.
Grundlegender Netzwerkfluss für Anwendungen auf AKS
Wenn Anwendungen mit dem Azure Load Balancer-Diensttyp verfügbar gemacht werden, lautet der Anforderungsfluss für den Zugriff auf diese Anwendungen wie folgt:
Client-DNS-Name >> >> AKS Load Balancer IP-Adresse >> AKS-Knoten >> Pods
Es gibt andere mögliche Situationen, in denen zusätzliche Komponenten beteiligt sein können. Zum Beispiel:
- Der verwaltete NGINX-Ingress mit dem Add-On-Feature für das Anwendungsrouting ist aktiviert.
- Das Anwendungsgateway wird über den Application Gateway Ingress Controller (AGIC) anstelle von Azure Load Balancer verwendet.
- Azure Front Door und API Management können über dem Lastenausgleich verwendet werden.
- Der Prozess verwendet einen internen Lastenausgleich.
- Die Verbindung endet möglicherweise nicht am Pod und der angeforderten URL. Dies kann davon abhängen, ob der Pod eine Verbindung mit einer anderen Entität herstellen kann, z. B. einer Datenbank oder einem anderen Dienst im selben Cluster.
Es ist wichtig, den Anforderungsfluss für die Anwendung zu verstehen.
Ein grundlegender Anforderungsfluss zu Anwendungen in einem AKS-Cluster würde dem Fluss ähneln, der im folgenden Diagramm dargestellt wird.
Problembehandlung im Innenbereich
Bei der Problembehandlung von Konnektivitätsproblemen kann es sich um viele Prüfungen handeln, aber der Inside-Out-Ansatz kann dazu beitragen, die Quelle des Problems zu finden und den Engpass zu identifizieren. Bei diesem Ansatz beginnen Sie mit dem Pod selbst und überprüfen, ob die Anwendung auf die IP-Adresse des Pods reagiert. Überprüfen Sie dann jede Komponente, um den Endclient zu aktivieren.
Schritt 1: Überprüfen, ob der Pod ausgeführt wird und die App oder der Container innerhalb des Pods ordnungsgemäß reagiert
Führen Sie einen der folgenden Kubectl-Get-Befehle aus, um zu ermitteln, ob der Pod ausgeführt wird:
# List pods in the specified namespace.
kubectl get pods -n <namespace-name>
# List pods in all namespaces.
kubectl get pods -A
Was geschieht, wenn der Pod nicht ausgeführt wird? Überprüfen Sie in diesem Fall die Pod-Ereignisse mithilfe des Kubectl-Beschreibungsbefehls :
kubectl describe pod <pod-name> -n <namespace-name>
Wenn sich der Pod nicht in einem Ready
Oder Zustand befindet oder Running
es mehrmals neu gestartet wurde, überprüfen Sie die kubectl describe
Ausgabe. Die Ereignisse zeigen alle Probleme auf, die verhindern, dass Sie den Pod starten können. Oder wenn der Pod gestartet wurde, ist die Anwendung innerhalb des Pods möglicherweise fehlgeschlagen, sodass der Pod neu gestartet wird. Problembehandlung für den Pod entsprechend , um sicherzustellen, dass er sich in einem geeigneten Zustand befindet.
Wenn der Pod ausgeführt wird, kann es auch hilfreich sein, die Protokolle der Container zu überprüfen, die sich innerhalb des Pods befinden. Führen Sie die folgende Reihe von Kubectl-Protokollbefehlen aus:
kubectl logs <pod-name> -n <namespace-name>
# Check logs for an individual container in a multicontainer pod.
kubectl logs <pod-name> -n <namespace-name> -c <container-name>
# Dump pod logs (stdout) for a previous container instance.
kubectl logs <pod-name> --previous
# Dump pod container logs (stdout, multicontainer case) for a previous container instance.
kubectl logs <pod-name> -c <container-name> --previous
Wird der Pod ausgeführt? Testen Sie in diesem Fall die Konnektivität, indem Sie einen Test pod im Cluster starten. Über den Test pod können Sie direkt auf die POD-IP-Adresse der Anwendung zugreifen und überprüfen, ob die Anwendung ordnungsgemäß reagiert. Führen Sie die Kubectl-Ausführung und cURL
apt-get
befehle wie folgt aus:
# Start a test pod in the cluster:
kubectl run -it --rm aks-ssh --image=debian:stable
# After the test pod is running, you will gain access to the pod.
# Then you can run the following commands:
apt-get update -y && apt-get install dnsutils -y && apt-get install curl -y && apt-get install netcat-traditional -y
# After the packages are installed, test the connectivity to the application pod:
curl -Iv http://<pod-ip-address>:<port>
Für Anwendungen, die auf andere Protokolle lauschen, können Sie relevante Tools innerhalb des Test pods wie das Netcat-Tool installieren und dann die Verbindung mit dem Anwendungs pod überprüfen, indem Sie den folgenden Befehl ausführen:
# After the packages are installed, test the connectivity to the application pod using netcat/nc command:
nc -z -v <pod-ip-address> <port>
Weitere Befehle zur Problembehandlung von Pods finden Sie unter Debuggen ausgeführter Pods.
Schritt 2: Überprüfen, ob die Anwendung vom Dienst aus erreichbar ist
Bei Szenarien, in denen die Anwendung innerhalb des Pods ausgeführt wird, können Sie sich hauptsächlich auf die Problembehandlung konzentrieren, wie der Pod verfügbar gemacht wird.
Wird der Pod als Dienst verfügbar gemacht? Überprüfen Sie in diesem Fall die Dienstereignisse. Überprüfen Sie außerdem, ob die Pod-IP-Adresse und der Anwendungsport als Endpunkt in der Dienstbeschreibung verfügbar sind:
# Check the service details.
kubectl get svc -n <namespace-name>
# Describe the service.
kubectl describe svc <service-name> -n <namespace-name>
Überprüfen Sie, ob die IP-Adresse des Pods als Endpunkt im Dienst vorhanden ist, wie im folgenden Beispiel gezeigt:
$ kubectl get pods -o wide # Check the pod's IP address.
NAME READY STATUS RESTARTS AGE IP NODE
my-pod 1/1 Running 0 12m 10.244.0.15 aks-agentpool-000000-vmss000000
$ kubectl describe service my-cluster-ip-service # Check the endpoints in the service.
Name: my-cluster-ip-service
Namespace: default
Selector: app=my-pod
Type: ClusterIP
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.0.174.133
IPs: 10.0.174.133
Port: <unset> 80/TCP
TargetPort: 80/TCP
Endpoints: 10.244.0.15:80 # <--- Here
$ kubectl get endpoints # Check the endpoints directly for verification.
NAME ENDPOINTS AGE
my-cluster-ip-service 10.244.0.15:80 14m
Wenn die Endpunkte nicht auf die richtige POD-IP-Adresse verweisen, überprüfen Sie die Und für den Pod und den Dienst.If the endpoints aren't pointing to the correct pod IP address, verify the Labels
and Selectors
for the service.
Sind die Endpunkte im Dienst richtig? Wenn ja, greifen Sie auf den Dienst zu, und überprüfen Sie, ob die Anwendung erreichbar ist.
Zugreifen auf den ClusterIP-Dienst
Für den ClusterIP
Dienst können Sie einen Test pod im Cluster starten und auf die Dienst-IP-Adresse zugreifen:
# Start a test pod in the cluster:
kubectl run -it --rm aks-ssh --image=debian:stable
# After the test pod is running, you will gain access to the pod.
# Then, you can run the following commands:
apt-get update -y && apt-get install dnsutils -y && apt-get install curl -y && apt-get install netcat-traditional -y
# After the packages are installed, test the connectivity to the service:
curl -Iv http://<service-ip-address>:<port>
Für Anwendungen, die auf andere Protokolle lauschen, können Sie relevante Tools innerhalb des Test pods wie das Netcat-Tool installieren und dann die Verbindung mit dem Anwendungs pod überprüfen, indem Sie den folgenden Befehl ausführen:
# After the packages are installed, test the connectivity to the application pod using netcat/nc command:
nc -z -v <pod-ip-address> <port>
Wenn der vorherige Befehl keine entsprechende Antwort zurückgibt, überprüfen Sie die Dienstereignisse auf Fehler.
Zugreifen auf den LoadBalancer-Dienst
Für den LoadBalancer
Dienst können Sie von außerhalb des Clusters auf die IP-Adresse des Lastenausgleichs zugreifen.
curl -Iv http://<service-ip-address>:<port>
Für Anwendungen, die auf andere Protokolle lauschen, können Sie relevante Tools innerhalb des Test pods wie das Netcat-Tool installieren und dann die Verbindung mit dem Anwendungs pod überprüfen, indem Sie den folgenden Befehl ausführen:
nc -z -v <pod-ip-address> <port>
Gibt die IP-Adresse des LoadBalancer
Diensts eine richtige Antwort zurück? Wenn dies nicht der Fehler ist, führen Sie die folgenden Schritte aus:
Überprüfen Sie die Ereignisse des Diensts.
Überprüfen Sie, ob die Netzwerksicherheitsgruppen (Network Security Groups, NSGs), die den AKS-Knoten und dem AKS-Subnetz zugeordnet sind, den eingehenden Datenverkehr im Dienstport zulassen.
Weitere Befehle zur Problembehandlung von Diensten finden Sie unter Debugdienste.
Szenarien, die einen Eingangsschritt anstelle eines Diensts verwenden
Für Szenarien, in denen die Anwendung mithilfe einer Ingress
Ressource verfügbar gemacht wird, ähnelt der Datenverkehrsfluss der folgenden Entwicklung:
Client-DNS-Name >> >> Load Balancer oder Anwendungsgateway-IP-Adresse >> Ingress-Controller-Pods innerhalb des Clusterdiensts >> oder -pods
Sie können auch hier den inside-out-Ansatz der Problembehandlung anwenden. Sie können auch die Ressource "Ingress kubernetes" und die Details des Eingangscontrollers überprüfen, um weitere Informationen zu erhalten:
$ kubectl get ing -n <namespace-of-ingress> # Checking the ingress details and events.
NAME CLASS HOSTS ADDRESS PORTS AGE
hello-world-ingress <none> myapp.com 20.84.x.x 80, 443 7d22h
$ kubectl describe ing -n <namespace-of-ingress> hello-world-ingress
Name: hello-world-ingress
Namespace: <namespace-of-ingress>
Address: 20.84.x.x
Default backend: default-http-backend:80 (<error: endpoints "default-http-backend" not found>)
TLS:
tls-secret terminates myapp.com
Rules:
Host Path Backends
---- ---- --------
myapp.com
/blog blog-service:80 (10.244.0.35:80)
/store store-service:80 (10.244.0.33:80)
Annotations: cert-manager.io/cluster-issuer: letsencrypt
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /$1
nginx.ingress.kubernetes.io/use-regex: true
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Sync 5m41s nginx-ingress-controller Scheduled for sync
Normal Sync 5m41s nginx-ingress-controller Scheduled for sync
Dieses Beispiel enthält eine Ingress
Ressource, die:
- Lauscht auf dem
myapp.com
Host. - Es sind zwei
Path
Zeichenfolgen konfiguriert. - Routes to two
Services
in the back end.
Überprüfen Sie, ob die Back-End-Dienste ausgeführt werden, und reagieren Sie auf den Port, der in der Beschreibung des Eingangs erwähnt wird:
$ kubectl get svc -n <namespace-of-ingress>
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)
ingress-basic blog-service ClusterIP 10.0.155.154 <none> 80/TCP
ingress-basic store-service ClusterIP 10.0.61.185 <none> 80/TCP
ingress-basic nginx-ingress-ingress-nginx-controller LoadBalancer 10.0.122.148 20.84.x.x 80:30217/TCP,443:32464/TCP
Überprüfen Sie die Protokolle für die Eingangscontroller-Pods, wenn ein Fehler auftritt:
$ kubectl get pods -n <namespace-of-ingress> # Get the ingress controller pods.
NAME READY STATUS RESTARTS AGE
aks-helloworld-one-56c7b8d79d-6zktl 1/1 Running 0 31h
aks-helloworld-two-58bbb47f58-rrcv7 1/1 Running 0 31h
nginx-ingress-ingress-nginx-controller-9d8d5c57d-9vn8q 1/1 Running 0 31h
nginx-ingress-ingress-nginx-controller-9d8d5c57d-grzdr 1/1 Running 0 31h
$ # Check logs from the pods.
$ kubectl logs -n ingress-basic nginx-ingress-ingress-nginx-controller-9d8d5c57d-9vn8q
Was geschieht, wenn der Client Anforderungen an den Eingangshostnamen oder die IP-Adresse anfordert, aber keine Einträge in den Protokollen des Eingangscontroller-Pods angezeigt werden? In diesem Fall erreichen die Anforderungen möglicherweise nicht den Cluster, und der Benutzer erhält möglicherweise eine Connection Timed Out
Fehlermeldung.
Eine weitere Möglichkeit besteht darin, dass die Komponenten über den Eingangs pods, z. B. Load Balancer oder Application Gateway, die Anforderungen nicht ordnungsgemäß an den Cluster weiterleiten. Wenn dies zutrifft, können Sie die Back-End-Konfiguration dieser Ressourcen überprüfen.
Wenn Sie eine Connection Timed Out
Fehlermeldung erhalten, überprüfen Sie die Netzwerksicherheitsgruppe, die den AKS-Knoten zugeordnet ist. Überprüfen Sie auch das AKS-Subnetz. Möglicherweise wird der Datenverkehr vom Lastenausgleichsmodul oder Anwendungsgateway zu den AKS-Knoten blockiert.
Weitere Informationen zur Problembehandlung beim Eingangsausgang (z. B. Nginx Ingress) finden Sie unter "Ingress-nginx-Problembehandlung".
Kontaktieren Sie uns für Hilfe
Wenn Sie Fragen haben oder Hilfe mit Ihren Azure-Gutschriften benötigen, dann erstellen Sie beim Azure-Support eine Support-Anforderung oder fragen Sie den Azure Community-Support. Sie können auch Produktfeedback an die Azure Feedback Community senden.
Haftungsausschluss für Kontaktinformationen von Drittanbietern
Die Kontaktinformationen zu den in diesem Artikel erwähnten Drittanbietern sollen Ihnen helfen, zusätzliche Informationen zu diesem Thema zu finden. Diese Kontaktinformationen können ohne vorherige Ankündigung geändert werden. Sie werden von Microsoft ohne jede Gewähr weitergegeben.