Tunnelkonnektivitätsprobleme
Microsoft Azure Kubernetes Service (AKS) verwendet eine bestimmte Komponente für die tunnelierte, sichere Kommunikation zwischen den Knoten und der Steuerebene. Der Tunnel besteht aus einem Server auf der Steuerebene und einem Client auf der Clusterknotenseite. In diesem Artikel wird erläutert, wie Sie Probleme behandeln und beheben können, die sich auf die Tunnelkonnektivität in AKS beziehen.
Notiz
Zuvor war tunnel-front
die AKS-Tunnelkomponente . Sie wurde nun zum Konnectivity-Dienst, einer upstream-Kubernetes-Komponente, migriert. Weitere Informationen zu dieser Migration finden Sie in den AKS-Versionshinweisen und dem Änderungsprotokoll.
Voraussetzungen
Symptome
Sie erhalten eine Fehlermeldung, die den folgenden Beispielen zu Port 10250 ähnelt:
Fehler vom Server: Abrufen von "https://< aks-node-name>:10250/containerLogs/<namespace>/<pod-name>/<container-name>": dial tcp <aks-node-ip>:10250: i/o timeout
Fehler vom Server: Fehler beim Wähl-Back-End: Dial tcp <aks-node-ip>:10250: i/o timeout
Der Kubernetes-API-Server verwendet Port 10250, um eine Verbindung mit dem Kubelet eines Knotens herzustellen, um die Protokolle abzurufen. Wenn Port 10250 blockiert ist, funktionieren die Kubectl-Protokolle und andere Features nur für Pods, die auf den Knoten ausgeführt werden, in denen die Tunnelkomponente geplant ist. Weitere Informationen finden Sie unter Kubernetes-Ports und -Protokolle: Workerknoten.
Da die Tunnelkomponenten oder die Konnektivität zwischen Server und Client nicht hergestellt werden können, funktionieren Funktionen wie die folgenden nicht wie erwartet:
Admission Controller-Webhooks
Möglichkeit des Protokollabrufs (mithilfe des Befehls "Kubectl-Protokolle ")
Ausführen eines Befehls in einem Container oder Abrufen innerhalb eines Containers (mithilfe des Kubectl exec-Befehls )
Weiterleiten eines oder mehrerer lokaler Ports eines Pods (mithilfe des Befehls "kubectl port-forward ")
Ursache 1: Eine Netzwerksicherheitsgruppe (NSG) blockiert Port 10250
Notiz
Diese Ursache gilt für alle Tunnelkomponenten, die Sie möglicherweise in Ihrem AKS-Cluster haben.
Sie können eine Azure-Netzwerksicherheitsgruppe (Azure Network Security Group , NSG) verwenden, um netzwerkdatenverkehr zu und von Azure-Ressourcen in einem virtuellen Azure-Netzwerk zu filtern. Eine Netzwerksicherheitsgruppe enthält Sicherheitsregeln, die eingehenden und ausgehenden Netzwerkdatenverkehr zwischen verschiedenen Arten von Azure-Ressourcen zulassen oder verweigern. Für jede Regel können Sie die Quelle und das Ziel, den Port und das Protokoll angeben. Weitere Informationen finden Sie unter Filtern von Netzwerkdatenverkehr mit Netzwerksicherheitsgruppen.
Wenn der NSG Port 10250 auf virtueller Netzwerkebene blockiert, funktionieren Tunnelfunktionen (z. B. Protokolle und Codeausführung) nur für die Pods, die auf den Knoten geplant sind, in denen Tunnel pods geplant sind. Die anderen Pods funktionieren nicht, da ihre Knoten nicht in der Lage sind, den Tunnel zu erreichen, und der Tunnel wird auf anderen Knoten geplant. Um diesen Zustand zu überprüfen, können Sie die Konnektivität mithilfe von Netcat (nc
) oder Telnet-Befehlen testen. Sie können den Befehl "az vmss run-command invoke " ausführen, um den Verbindungstest durchzuführen und zu überprüfen, ob er erfolgreich ist, ein Zeitüberschreitungs- oder ein anderes Problem verursacht:
az vmss run-command invoke --resource-group <infra-or-MC-resource-group> \
--name <virtual-machine-scale-set-name> \
--command-id RunShellScript \
--instance-id <instance-id> \
--scripts "nc -v -w 2 <ip-of-node-that-schedules-the-tunnel-component> 10250" \
--output tsv \
--query 'value[0].message'
Lösung 1: Hinzufügen einer NSG-Regel zum Zulassen des Zugriffs auf Port 10250
Wenn Sie eine NSG verwenden und bestimmte Einschränkungen haben, stellen Sie sicher, dass Sie eine Sicherheitsregel hinzufügen, die Datenverkehr für Port 10250 auf der Ebene des virtuellen Netzwerks zulässt. Die folgende Azure-Portal Abbildung zeigt eine Beispielsicherheitsregel:
Wenn Sie restriktiver sein möchten, können Sie nur zugriff auf Port 10250 auf Subnetzebene zulassen.
Notiz
Das Feld "Priorität " muss entsprechend angepasst werden. Wenn Sie z. B. über eine Regel verfügen, die mehrere Ports verweigert (einschließlich Port 10250), sollte die im Bild angezeigte Regel eine niedrigere Priorität haben (niedrigere Nummern haben eine höhere Priorität). Weitere Informationen zu Priorität finden Sie unter "Sicherheitsregeln".
Wenn nach der Anwendung dieser Lösung keine Verhaltensänderung angezeigt wird, können Sie die Tunnelkomponenten-Pods neu erstellen. Das Löschen dieser Pods bewirkt, dass sie neu erstellt werden.
Ursache 2: Das Tool Unkomplizierte Firewall (UFW) blockiert Port 10250
Notiz
Dies gilt für alle Tunnelkomponenten, die Sie in Ihrem AKS-Cluster haben.
Die unkomplizierte Firewall (UFW) ist ein Befehlszeilenprogramm für die Verwaltung einer Netfilter-Firewall . AKS-Knoten verwenden Ubuntu. Daher ist UFW standardmäßig auf AKS-Knoten installiert, aber UFW ist deaktiviert.
Wenn UFW aktiviert ist, wird standardmäßig der Zugriff auf alle Ports blockiert, einschließlich Port 10250. In diesem Fall ist es unwahrscheinlich, dass Sie Secure Shell (SSH) verwenden können, um eine Verbindung mit AKS-Clusterknoten zur Problembehandlung herzustellen. Dies liegt daran, dass UFW möglicherweise auch Port 22 blockiert. Zur Problembehandlung können Sie den Befehl "az vmss run-command invoke " ausführen, um einen ufw-Befehl aufzurufen, der überprüft, ob UFW aktiviert ist:
az vmss run-command invoke --resource-group <infra-or-MC-resource-group> \
--name <virtual-machine-scale-set-name> \
--command-id RunShellScript \
--instance-id <instance-id> \
--scripts "ufw status" \
--output tsv \
--query 'value[0].message'
Was geschieht, wenn in den Ergebnissen angegeben wird, dass UFW aktiviert ist und port 10250 nicht ausdrücklich zugelassen wird? In diesem Fall funktionieren Tunnelfunktionen (z. B. Protokolle und Codeausführung) nicht für die Pods, die auf den Knoten geplant sind, die UFW aktiviert haben. Um das Problem zu beheben, wenden Sie eine der folgenden Lösungen auf UFW an.
Wichtig
Bevor Sie dieses Tool verwenden, um Änderungen vorzunehmen, überprüfen Sie die AKS-Supportrichtlinie (insbesondere die Knotenwartung und den Zugriff), um zu verhindern, dass Ihr Cluster in ein nicht unterstütztes Szenario eintritt.
Notiz
Wenn nach dem Anwenden einer Lösung keine Verhaltensänderung angezeigt wird, können Sie die Tunnelkomponenten-Pods neu erstellen. Das Löschen dieser Pods führt dazu, dass sie neu erstellt werden.
Lösung 2a: Unkomplizierte Firewall deaktivieren
Führen Sie den folgenden az vmss run-command invoke
Befehl aus, um UFW zu deaktivieren:
az vmss run-command invoke --resource-group <infra-or-MC-resource-group> \
--name <virtual-machine-scale-set-name> \
--command-id RunShellScript \
--instance-id <instance-id> \
--scripts "ufw disable" \
--output tsv \
--query 'value[0].message'
Lösung 2b: Konfigurieren der unkomplizierten Firewall für den Zugriff auf Port 10250
Führen Sie den folgenden az vmss run-command invoke
Befehl aus, um den Zugriff auf Port 10250 zu erzwingen:
az vmss run-command invoke --resource-group <infra-or-MC-resource-group> \
--name <virtual-machine-scale-set-name> \
--command-id RunShellScript \
--instance-id <instance-id> \
--scripts "ufw allow 10250" \
--output tsv \
--query 'value[0].message'
Ursache 3: Das Iptables-Tool blockiert Port 10250
Notiz
Dies gilt für alle Tunnelkomponenten, die Sie in Ihrem AKS-Cluster haben.
Mit dem Iptables-Tool kann ein Systemadministrator die IP-Paketfilterregeln einer Linux-Firewall konfigurieren. Sie können die Regeln so konfigurieren, dass die iptables
Kommunikation an Port 10250 blockiert wird.
Sie können die Regeln für Ihre Knoten anzeigen, um zu überprüfen, ob Port 10250 blockiert ist oder die zugehörigen Pakete verworfen werden. Führen Sie dazu den folgenden iptables
Befehl aus:
iptables --list --line-numbers
In der Ausgabe werden die Daten in mehrere Ketten gruppiert, einschließlich der INPUT
Kette. Jede Kette enthält eine Regeltabelle unter den folgenden Spaltenüberschriften:
num
(Regelnummer)target
prot
(Protokoll)opt
source
destination
Enthält die INPUT
Kette eine Regel, in der das Ziel ist DROP
, das Protokoll ist tcp
, und das Ziel ist tcp dpt:10250
? Wenn dies der Fall ist, iptables
wird der Zugriff auf Zielport 10250 blockiert.
Lösung 3: Löschen der IPTables-Regel, die den Zugriff auf Port 10250 blockiert
Führen Sie einen der folgenden Befehle aus, um die iptables
Regel zu löschen, die den Zugriff auf Port 10250 verhindert:
iptables --delete INPUT --jump DROP --protocol tcp --source <ip-number> --destination-port 10250
iptables --delete INPUT <input-rule-number>
Um Ihr genaues oder potenzielles Szenario zu beheben, empfehlen wir, die iptables manuell zu überprüfen, indem Sie den iptables --help
Befehl ausführen.
Wichtig
Bevor Sie dieses Tool verwenden, um Änderungen vorzunehmen, überprüfen Sie die AKS-Supportrichtlinie (insbesondere die Knotenwartung und den Zugriff), um zu verhindern, dass Ihr Cluster in ein nicht unterstütztes Szenario eintritt.
Ursache 4: Ausgang Port 1194 oder 9000 wird nicht geöffnet
Notiz
Dies gilt nur für die und aks-link
die tunnel-front
Pods.
Gibt es Einschränkungen für den Ausgehenden Datenverkehr, z. B. von einer AKS-Firewall? Wenn vorhanden, ist Port 9000 erforderlich, um die korrekte Funktionalität des tunnel-front
Pods zu aktivieren. Ebenso ist Port 1194 für den aks-link
Pod erforderlich.
Konnectivity basiert auf Port 443. Dieser Port ist standardmäßig geöffnet. Daher müssen Sie sich keine Gedanken über Konnektivitätsprobleme auf diesem Port machen.
Lösung 4: Port 9000 öffnen
Obwohl tunnel-front
der Konnectivity-Dienst verschoben wurde, werden einige AKS-Cluster weiterhin verwendettunnel-front
, die auf Port 9000 basieren. Stellen Sie sicher, dass die virtuelle Appliance oder ein beliebiges Netzwerkgerät oder eine beliebige Netzwerksoftware den Zugriff auf Port 9000 ermöglicht. Weitere Informationen zu den erforderlichen Regeln und Abhängigkeiten finden Sie unter Azure Global erforderliche Netzwerkregeln.
Ursache 5: SNAT-Portausschöpfung (Source Network Address Translation)
Notiz
Dies gilt für alle Tunnelkomponenten, die Sie in Ihrem AKS-Cluster haben. Sie gilt jedoch nicht für private AKS-Cluster. Die SNAT-Portausschöpfung (Source Network Address Translation) kann nur für die öffentliche Kommunikation erfolgen. Bei privaten AKS-Clustern befindet sich der API-Server im virtuellen AKS-Netzwerk oder Subnetz.
Wenn die SNAT-Portausschöpfung auftritt (fehlgeschlagene SNAT-Ports), können die Knoten keine Verbindung mit dem API-Server herstellen. Der Tunnelcontainer befindet sich auf der API-Serverseite. Daher wird keine Tunnelkonnektivität hergestellt.
Wenn die SNAT-Portressourcen erschöpft sind, schlagen die ausgehenden Flüsse fehl, bis die vorhandenen Flüsse einige SNAT-Ports freigeben. Azure Load Balancer gibt die SNAT-Ports zurück, wenn der Fluss geschlossen wird. Es verwendet einen vierminütigen Leerlauftimeout, um die SNAT-Ports aus den Leerlaufflüssen zurückzufordern.
Sie können die SNAT-Ports entweder aus den AKS-Lastenausgleichsmetriken oder der Dienstdiagnose anzeigen, wie in den folgenden Abschnitten beschrieben. Weitere Informationen zum Anzeigen von SNAT-Ports finden Sie unter Gewusst wie Auschecken meiner Ausgehenden Verbindungsstatistiken?.
Metriken des AKS-Lastenausgleichs
Führen Sie die folgenden Schritte aus, um die SNAT-Ports mithilfe von AKS Load Balancer-Metriken anzuzeigen:
Suchen Sie im Azure-Portal nach Kubernetes-Diensten, und wählen Sie sie aus.
Wählen Sie in der Liste der Kubernetes-Dienste den Namen Ihres Clusters aus.
Suchen Sie im Menübereich des Clusters die Überschrift "Einstellungen", und wählen Sie dann "Eigenschaften" aus.
Wählen Sie den Namen aus, der unter " Infrastrukturressourcengruppe" aufgeführt ist.
Wählen Sie den Kubernetes-Lastenausgleich aus.
Suchen Sie im Menübereich des Lastenausgleichs die Überschrift "Überwachung", und wählen Sie dann "Metriken" aus.
Wählen Sie für den Metriktyp SNAT Connection Count aus.
Klicken Sie auf Apply splitting (Teilung anwenden).
Legen Sie "Aufteilen nach"-Verbindungsstatus fest.
Dienstdiagnose
Führen Sie die folgenden Schritte aus, um die SNAT-Ports mithilfe der Dienstdiagnose anzuzeigen:
Suchen Sie im Azure-Portal nach Kubernetes-Diensten, und wählen Sie sie aus.
Wählen Sie in der Liste der Kubernetes-Dienste den Namen Ihres Clusters aus.
Wählen Sie im Menübereich des Clusters "Diagnostizieren" aus, und lösen Sie Probleme.
Wählen Sie Konnektivitätsprobleme aus.
Wählen Sie unter "SNAT-Verbindung" und "Portzuweisung" die Option "Details anzeigen" aus.
Verwenden Sie bei Bedarf die Schaltfläche "Zeitbereich ", um den Zeitrahmen anzupassen.
Lösung 5a: Stellen Sie sicher, dass die Anwendung verbindungspooling verwendet
Dieses Verhalten kann auftreten, da eine Anwendung vorhandene Verbindungen nicht verwendet. Es wird empfohlen, pro Anforderung keine ausgehende Verbindung zu erstellen. Eine solche Konfiguration kann zu Verbindungsausschöpfung führen. Überprüfen Sie, ob der Anwendungscode bewährte Methoden verwendet und Verbindungspooling verwendet. Die meisten Bibliotheken unterstützen verbindungspooling. Daher sollten Sie keine neue ausgehende Verbindung pro Anforderung erstellen müssen.
Lösung 5b: Anpassen der zugewiesenen ausgehenden Ports
Wenn alles in der Anwendung ok ist, müssen Sie die zugeordneten ausgehenden Ports anpassen. Weitere Informationen zur Ausgehenden Portzuweisung finden Sie unter Konfigurieren der zugewiesenen ausgehenden Ports.
Lösung 5c: Verwenden eines NAT-Gateways (Managed Network Address Translation) beim Erstellen eines Clusters
Sie können einen neuen Cluster einrichten, um ein NAT-Gateway (Managed Network Address Translation) für ausgehende Verbindungen zu verwenden. Weitere Informationen finden Sie unter Erstellen eines AKS-Clusters mit einem verwalteten NAT-Gateway.
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.
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.