Grundläggande felsökning av utgående anslutningar från ett AKS-kluster
I den här artikeln beskrivs hur du utför grundläggande felsökning av utgående anslutningar från ett AkS-kluster (Microsoft Azure Kubernetes Service) och identifierar felaktiga komponenter.
Förutsättningar
Kubernetes kubectl-verktyget eller ett liknande verktyg för att ansluta till klustret. Om du vill installera kubectl med hjälp av Azure CLI kör du kommandot az aks install-cli .
Kommandoradsverktyget apt-get för hantering av paket.
Verktyget Klient-URL (cURL) eller ett liknande kommandoradsverktyg.
Kommandoradsverktyget
nslookup
(dnsutils) för att kontrollera DNS-matchning.
Scenarier för utgående trafik i Azure Kubernetes Service
Trafik som kommer från AKS-klustret, oavsett om den kommer från en podd eller en arbetsnod, anses vara den utgående trafiken från klustret. Vad händer om det finns ett problem i det utgående flödet för ett AKS-kluster? Innan du felsöker bör du först titta på scenarierna för utgående trafikflöde.
Utgående trafik från ett AKS-kluster kan klassificeras i följande kategorier:
Trafik till en podd eller tjänst i samma kluster (intern trafik).
Trafik till en enhet eller slutpunkt i samma virtuella nätverk eller ett annat virtuellt nätverk som använder peering för virtuella nätverk.
Trafik till en lokal miljö via en VPN-anslutning eller en Azure ExpressRoute-anslutning.
Trafik utanför AKS-nätverket via Azure Load Balancer (offentlig utgående trafik).
Trafik utanför AKS-nätverket via Azure Firewall eller en proxyserver (offentlig utgående trafik).
Intern trafik
Ett grundläggande flöde för begäranden för intern trafik från ett AKS-kluster liknar det flöde som visas i följande diagram.
Offentlig utgående trafik via Azure Load Balancer
Om trafiken är för ett mål på Internet är standardmetoden att skicka trafiken via Azure Load Balancer.
Offentlig utgående trafik via Azure Firewall eller en proxyserver
I vissa fall måste utgående trafik filtreras och det kan kräva Azure Firewall.
En användare kanske vill lägga till en proxyserver i stället för en brandvägg eller konfigurera en NAT-gateway för utgående trafik. Det grundläggande flödet förblir detsamma som i diagrammet.
Det är viktigt att du förstår utgående flöde för klustret så att du kan fortsätta felsökningen.
Överväganden vid felsökning
Kontrollera din utgående enhet
När du felsöker utgående trafik i AKS är det viktigt att veta vad din utgående enhet är (dvs. den enhet genom vilken trafiken passerar). Här kan utgående enhet vara en av följande komponenter:
- Azure Load Balancer
- Azure Firewall eller en anpassad brandvägg
- En NAT-gateway (network address translation)
- En proxyserver
Flödet kan också skilja sig beroende på målet. Intern trafik (det vill säga i klustret) går till exempel inte via utgående enhet. Den interna trafiken skulle endast använda klustrets nätverk. För offentlig utgående trafik kontrollerar du om det finns en utgående enhet som passerar och kontrollerar enheten.
Kontrollera varje hopp i trafikflödet
När du har identifierat utgående enhet kontrollerar du följande faktorer:
Källan och målet för begäran.
Hoppen mellan källan och målet.
Flödet för begäran-svar.
Hoppen som förbättras av extra säkerhetslager, till exempel följande lager:
- Brandvägg
- Nätverkssäkerhetsgrupp (NSG)
- Nätverksprincip
Om du vill identifiera ett problematiskt hopp kontrollerar du svarskoderna före och efter det. Om du vill kontrollera om paketen anländer korrekt i ett visst hopp kan du fortsätta med paketinsamlingar.
Kontrollera HTTP-svarskoder
När du kontrollerar varje komponent hämtar och analyserar du HTTP-svarskoder. Dessa koder är användbara för att identifiera problemets art. Koderna är särskilt användbara i scenarier där programmet svarar på HTTP-begäranden.
Ta paketinsamlingar från klienten och servern
Om andra felsökningssteg inte ger några avgörande resultat kan du ta paketinsamlingar från klienten och servern. Paketinsamlingar är också användbara när icke-HTTP-trafik ingår mellan klienten och servern. Mer information om hur du samlar in paketinsamlingar för AKS-miljön finns i följande artiklar i datainsamlingsguiden:
Felsöka checklistor
Följ dessa steg för grundläggande felsökning för utgående trafik från ett AKS-kluster:
Kontrollera att DNS-matchningen (Domain Name System) för slutpunkten fungerar korrekt.
Se till att du kan nå slutpunkten via en IP-adress.
Kontrollera om klustret kan nå någon annan extern slutpunkt.
Kontrollera om en brandvägg eller proxy blockerar trafiken.
Kontrollera om AKS-tjänstens huvudnamn eller hanterade identitet har de behörigheter för AKS-tjänsten som krävs för att göra nätverksändringar i Azure-resurser.
Kommentar
Förutsätter att det inte finns något servicenät när du utför grundläggande felsökning. Om du använder ett tjänstnät, till exempel Istio, ger det ovanliga resultat för TCP-baserad trafik.
Kontrollera om podden och noden kan nå slutpunkten
Inifrån podden kan du köra en DNS-sökning till slutpunkten.
Vad händer om du inte kan köra kommandot kubectl exec för att ansluta till podden och installera DNS Utils-paketet? I det här fallet kan du starta en testpodd i samma namnområde som den problematiska podden och sedan köra testerna.
Kommentar
Om DNS-matchningen eller utgående trafik inte låter dig installera nödvändiga nätverkspaket kan du använda Docker-avbildningen rishasi/ubuntu-netutil:1.0
. I den här avbildningen är de nödvändiga paketen redan installerade.
Exempelprocedur för att kontrollera DNS-matchning för en Linux-podd
Starta en testpodd i samma namnområde som den problematiska podden:
kubectl run -it --rm aks-ssh --namespace <namespace> --image=debian:stable --overrides='{"spec": { "nodeSelector": {"kubernetes.io/os": "linux"}}}'
När testpodden har körts får du åtkomst till podden.
Kör följande
apt-get
kommandon för att installera andra verktygspaket:# Update and install tool packages apt-get update && apt-get install -y dnsutils curl
När paketen har installerats kör du kommandot nslookup för att testa DNS-matchningen till slutpunkten:
$ nslookup microsoft.com # Microsoft.com is used as an example Server: <server> Address: <server IP address>#53 ... ... Name: microsoft.com Address: 20.53.203.50
Prova DNS-matchningen direkt från den överordnade DNS-servern. I det här exemplet används Azure DNS:
$ nslookup microsoft.com 168.63.129.16 Server: 168.63.129.16 Address: 168.63.129.16#53 ... ... Address: 20.81.111.85
Ibland är det problem med själva slutpunkten i stället för ett kluster-DNS. I sådana fall bör du överväga följande kontroller:
Kontrollera om den önskade porten är öppen på fjärrvärden:
curl -Ivm5 telnet://microsoft.com:443
Kontrollera HTTP-svarskoden:
curl -Ivm5 https://microsoft.com
Kontrollera om du kan ansluta till någon annan slutpunkt:
curl -Ivm5 https://kubernetes.io
Kontrollera att slutpunkten kan nås från noden där den problematiska podden finns och sedan verifiera DNS-inställningarna genom att följa dessa steg:
Ange noden där den problematiska podden finns i via felsökningspodden. Mer information om hur du gör detta finns i Ansluta till AKS-klusternoder (Azure Kubernetes Service) för underhåll eller felsökning.
Testa DNS-matchningen till slutpunkten:
$ nslookup microsoft.com Server: 168.63.129.16 Address: 168.63.129.16#53 Non-authoritative answer: Name: microsoft.com Address: 20.112.52.29 Name: microsoft.com Address: 20.81.111.85 Name: microsoft.com Address: 20.84.181.62 Name: microsoft.com Address: 20.103.85.33 Name: microsoft.com Address: 20.53.203.50
Kontrollera filen resolve.conf för att avgöra om de förväntade namnservrarna läggs till:
cat /etc/resolv.conf cat /run/systemd/resolve/resolv.conf
Exempelprocedur för att kontrollera DNS-matchning för en Windows-podd
Kör en testpodd i Windows-nodpoolen:
# For a Windows environment, use the Resolve-DnsName cmdlet. kubectl run dnsutil-win --image='mcr.microsoft.com/windows/servercore:ltsc2022' --overrides='{"spec": { "nodeSelector": {"kubernetes.io/os": "windows"}}}' -- powershell "Start-Sleep -s 3600"
Kör kommandot kubectl exec för att ansluta till podden med hjälp av PowerShell:
kubectl exec -it dnsutil-win -- powershell
Kör cmdleten Resolve-DnsName i PowerShell för att kontrollera om DNS-matchningen fungerar för slutpunkten:
PS C:\> Resolve-DnsName www.microsoft.com Name Type TTL Section NameHost ---- ---- --- ------- -------- www.microsoft.com CNAME 20 Answer www.microsoft.com-c-3.edgekey.net www.microsoft.com-c-3.edgekey. CNAME 20 Answer www.microsoft.com-c-3.edgekey.net.globalredir.akadns.net net www.microsoft.com-c-3.edgekey. CNAME 20 Answer e13678.dscb.akamaiedge.net net.globalredir.akadns.net Name : e13678.dscb.akamaiedge.net QueryType : AAAA TTL : 20 Section : Answer IP6Address : 2600:1408:c400:484::356e Name : e13678.dscb.akamaiedge.net QueryType : AAAA TTL : 20 Section : Answer IP6Address : 2600:1408:c400:496::356e Name : e13678.dscb.akamaiedge.net QueryType : A TTL : 12 Section : Answer IP4Address : 23.200.197.152
I ett ovanligt scenario som omfattar DNS-matchning får DNS-frågorna ett korrekt svar från noden men misslyckas från podden. I det här scenariot kan du överväga att kontrollera DNS-matchningsfel inifrån podden, men inte från arbetsnoden. Om du vill kontrollera DNS-matchning för en slutpunkt i klustret kan du kontrollera DNS-matchningsstatusen i klustret.
Om DNS-matchningen lyckas fortsätter du till nätverkstesterna. Annars kontrollerar du DNS-konfigurationen för klustret.
Ansvarsfriskrivning för tredje part
Microsoft tillhandahåller kontaktinformation från tredje part som hjälper dig att hitta ytterligare information om det här ämnet. Denna kontaktinformation kan ändras utan föregående meddelande. Microsoft garanterar inte att kontaktinformation från tredje part är korrekt.
Kontakta oss för att få hjälp
Om du har frågor eller behöver hjälp skapar du en supportförfrågan eller frågar Azure community support. Du kan också skicka produktfeedback till Azure-feedbackcommunityn.