Dela via


TCP-tidsgränser när kubectl eller andra verktyg från tredje part ansluter till API-servern

I den här artikeln beskrivs hur du felsöker TCP-timeouter som inträffar när kubectl eller andra verktyg från tredje part används för att ansluta till API-servern i Microsoft Azure Kubernetes Service (AKS). För att säkerställa sina servicenivåmål (SLA) och serviceavtal (SLA) använder AKS kontrollplan med hög tillgänglighet (HA) som skalas vertikalt och horisontellt, baserat på antalet kärnor.

Symptom

Du får upprepade tidsgränser för anslutningen.

Orsak 1: Poddar som ansvarar för nod-till-kontroll-plankommunikation körs inte

Om bara några av dina API-kommandon är konsekventa är följande poddar kanske inte i ett körningstillstånd:

  • konnectivity-agent
  • tunnelfront
  • aks-link

Kommentar

I nyare AKS-versioner tunnelfront aks-link och ersätts med konnectivity-agent, så ser du bara konnectivity-agent.

Dessa poddar ansvarar för kommunikationen mellan en nod och kontrollplanet.

Lösning: Minska användningen eller belastningen för nodvärdarna

Kontrollera att noderna som är värdar för dessa poddar inte används för mycket eller är stressade. Överväg att flytta noderna till sin egen systemnodpool.

Kör följande kommandon för att kontrollera vilken nod konnectivity-agent podden finns på och användningen av noden:

# Check which node the konnectivity-agent pod is hosted on
$ kubectl get pod -n kube-system -o wide
    
# Check the usage of the node hosting the pod
$ kubectl top node

Orsak 2: Åtkomst blockeras på vissa nödvändiga portar, FQDN och IP-adresser

Om de portar som krävs, fullständigt kvalificerade domännamn (FQDN) och IP-adresser inte öppnas, kan flera kommandoanrop misslyckas. Säker, tunnelbaserad kommunikation på AKS mellan API-servern och kubeleten (via konnectivity-agent podden) kräver att vissa av dessa objekt fungerar.

Lösning: Öppna nödvändiga portar, FQDN och IP-adresser

Mer information om vilka portar, FQDN och IP-adresser som behöver öppnas finns i Utgående nätverk och FQDN-regler för AkS-kluster (Azure Kubernetes Service).

Orsak 3: TLS-tillägget application-layer protocol negotiation blockeras

För att upprätta en anslutning mellan kontrollplanet och noderna konnectivity-agent kräver podden TLS-tillägget (Transport Layer Security) för Application-Layer Protocol Negotiation (ALPN). Du kanske tidigare har blockerat det här tillägget.

Lösning: Aktivera ALPN-tillägget

Aktivera ALPN-tillägget på konnectivity-agent podden för att förhindra TCP-timeouter.

Orsak 4: API-serverns IP-auktoriserade intervall täcker inte din aktuella IP-adress

Om du använder auktoriserade IP-adressintervall på DIN API-server blockeras dina API-anrop om din IP-adress inte ingår i de auktoriserade intervallen.

Lösning: Ändra de auktoriserade IP-adressintervallen så att det täcker din IP-adress

Ändra de auktoriserade IP-adressintervallen så att din IP-adress omfattas. Mer information finns i Uppdatera ett klusters API-serverauktoriserade IP-intervall.

Orsak 5: En klient eller ett program läcker anrop till API-servern

Frekventa GET-anrop kan ackumulera och överbelasta API-servern.

Lösning: Använd klockor i stället för GET-anrop, men se till att programmet inte läcker dessa anrop

Kontrollera att du använder klockor i stället för frekventa GET-anrop till API-servern. Du måste också se till att dina program från tredje part inte läcker några klockanslutningar eller GET-samtal. I till exempel istio-mikrotjänstarkitekturen skapar en bugg i mixerprogrammet en ny API-serverbevakningsanslutning när en hemlighet läss internt. Eftersom det här beteendet sker med jämna mellanrum ackumuleras klockanslutningarna snabbt. Dessa anslutningar gör så småningom att API-servern överbelastas oavsett skalningsmönster.

Orsak 6: För många versioner i Helm-distributionerna

Om du använder för många versioner i dina distributioner av Helm (Kubernetes-pakethanteraren) börjar noderna förbruka för mycket minne. Det resulterar också i en stor mängd (konfigurationsdata ConfigMap ) objekt, vilket kan orsaka onödiga användningstoppar på API-servern.

Lösning: Begränsa det maximala antalet revisioner för varje version

Eftersom det maximala antalet revisioner för varje version är oändligt som standard måste du köra ett kommando för att ange det maximala antalet till ett rimligt värde. För Helm 2 är kommandot helm init. För Helm 3 är kommandot helm-uppgradering. Ange parametern --history-max <value> när du kör kommandot.

Version Command
Helm 2 helm init --history-max <maximum-number-of-revisions-per-release> ...
Helm 3 helm upgrade ... --history-max <maximum-number-of-revisions-per-release> ...

Orsak 7: Intern trafik mellan noder blockeras

Det kan finnas interna trafikblockeringar mellan noder i AKS-klustret.

Lösning: Felsöka felet "dial tcp <Node_IP>:10250: i/o timeout"

Se Felsöka TCP-timeouter, till exempel "dial tcp <Node_IP>:10250: i/o timeout".

Orsak 8: Klustret är privat

Klustret är ett privat kluster, men klienten som du försöker komma åt API-servern från finns i ett offentligt eller annat nätverk som inte kan ansluta till det undernät som används av AKS.

Lösning: Använda en klient som har åtkomst till AKS-undernätet

Eftersom klustret är privat och dess kontrollplan finns i AKS-undernätet kan det inte anslutas till API-servern om det inte finns i ett nätverk som kan ansluta till AKS-undernätet. Det är ett förväntat beteende.

I det här fallet kan du försöka komma åt API-servern från en klient i ett nätverk som kan kommunicera med AKS-undernätet. Kontrollera dessutom att nätverkssäkerhetsgrupper (NSG:er) eller andra enheter mellan nätverk inte blockerar paket.

Ansvarsfriskrivning för information från tredje part

De produkter från andra tillverkare som diskuteras i denna artikel tillverkas oberoende av Microsoft. Produkternas funktion eller tillförlitlighet kan därför inte garanteras.

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.