Netwerkproblemen in AKS-clusters oplossen
Netwerkproblemen kunnen optreden in nieuwe installaties van Kubernetes of wanneer u de Kubernetes-belasting verhoogt. Andere problemen die betrekking hebben op netwerkproblemen kunnen ook optreden. Controleer altijd de AKS-gids voor probleemoplossing om te zien of uw probleem daar wordt beschreven. In dit artikel worden aanvullende details en overwegingen beschreven vanuit het perspectief van het oplossen van netwerkproblemen en specifieke problemen die zich kunnen voordoen.
Client kan de API-server niet bereiken
Deze fouten hebben betrekking op verbindingsproblemen die optreden wanneer u de API-server van een AKS-cluster (Azure Kubernetes Service) niet kunt bereiken via het opdrachtregelprogramma kubernetes-cluster (kubectl) of een ander hulpprogramma, zoals de REST API via een programmeertaal.
Fout
Mogelijk ziet u fouten die er als volgt uitzien:
Unable to connect to the server: dial tcp <API-server-IP>:443: i/o timeout
Unable to connect to the server: dial tcp <API-server-IP>:443: connectex: A connection attempt
failed because the connected party did not properly respond after a period, or established
connection failed because connected host has failed to respond.
Oorzaak 1
Het is mogelijk dat IP-bereiken die door de API-server zijn geautoriseerd, zijn ingeschakeld op de API-server van het cluster, maar het IP-adres van de client is niet opgenomen in deze IP-bereiken. Gebruik de volgende az aks show
opdracht in Azure CLI om te bepalen of IP-bereiken zijn ingeschakeld. Als de IP-bereiken zijn ingeschakeld, produceert de opdracht een lijst met IP-bereiken.
az aks show --resource-group <cluster-resource-group> \
--name <cluster-name> \
--query apiServerAccessProfile.authorizedIpRanges
Oplossing 1
Zorg ervoor dat het IP-adres van uw client binnen de bereiken valt die zijn geautoriseerd door de API-server van het cluster:
Zoek uw lokale IP-adres. Zie Mijn IP-adres vinden voor meer informatie over hoe u het kunt vinden in Windows en Linux.
Werk het bereik bij dat is geautoriseerd door de API-server met behulp van de
az aks update
opdracht in Azure CLI. Autoriseren van het IP-adres van uw client. Zie De geautoriseerde IP-bereiken van een clusterserver bijwerken voor instructies.
Oorzaak 2
Als uw AKS-cluster een privécluster is, heeft het EINDPUNT van de API-server geen openbaar IP-adres. U moet een virtuele machine gebruiken die netwerktoegang heeft tot het virtuele netwerk van het AKS-cluster.
Oplossing 2
Zie de opties voor het maken van verbinding met een privécluster voor meer informatie over het oplossen van dit probleem.
Pod kan het IP-adres niet toewijzen
Fout
De pod is vastgelopen in de ContainerCreating
status en de gebeurtenissen melden een Failed to allocate address
fout:
Normal SandboxChanged 5m (x74 over 8m) kubelet, k8s-agentpool-00011101-0 Pod sandbox
changed, it will be killed and re-created.
Warning FailedCreatePodSandBox 21s (x204 over 8m) kubelet, k8s-agentpool-00011101-0 Failed
create pod sandbox: rpc error: code = Unknown desc = NetworkPlugin cni failed to set up pod
"deployment-azuredisk6-874857994-487td_default" network: Failed to allocate address: Failed to
delegate: Failed to allocate address: No available addresses
Of een not enough IPs available
fout:
Failed to create pod sandbox: rpc error: code = Unknown desc = failed to setup network for sandbox
'ac1b1354613465324654c1588ac64f1a756aa32f14732246ac4132133ba21364': plugin type='azure-vnet'
failed (add): IPAM Invoker Add failed with error: Failed to get IP address from CNS with error:
%w: AllocateIPConfig failed: not enough IPs available for 9c6a7f37-dd43-4f7c-a01f-1ff41653609c,
waiting on Azure CNS to allocate more with NC Status: , IP config request is [IPConfigRequest:
DesiredIPAddress , PodInterfaceID a1876957-eth0, InfraContainerID
a1231464635654a123646565456cc146841c1313546a515432161a45a5316541, OrchestratorContext
{'PodName':'a_podname','PodNamespace':'my_namespace'}]
Controleer de toegewezen IP-adressen in het IPAM-archief van de invoegtoepassing. Mogelijk vindt u dat alle IP-adressen zijn toegewezen, maar het aantal is veel kleiner dan het aantal actieve pods:
Als u kubenet gebruikt:
# Kubenet, for example. The actual path of the IPAM store file depends on network plugin implementation.
chroot /host/
ls -la "/var/lib/cni/networks/$(ls /var/lib/cni/networks/ | grep -e "k8s-pod-network" -e "kubenet")" | grep -v -e "lock\|last\|total" -e '\.$' | wc -l
244
Notitie
Voor kubenet zonder Calico is /var/lib/cni/networks/kubenet
het pad . Voor kubenet met Calico is /var/lib/cni/networks/k8s-pod-network
het pad . Het bovenstaande script selecteert automatisch het pad tijdens het uitvoeren van de opdracht.
# Check running Pod IPs
kubectl get pods --field-selector spec.nodeName=<your_node_name>,status.phase=Running -A -o json | jq -r '.items[] | select(.spec.hostNetwork != 'true').status.podIP' | wc -l
7
Als u Azure CNI gebruikt voor dynamische IP-toewijzing:
kubectl get nnc -n kube-system -o wide
NAME REQUESTED IPS ALLOCATED IPS SUBNET SUBNET CIDR NC ID NC MODE NC TYPE NC VERSION
aks-agentpool-12345678-vmss000000 32 32 subnet 10.18.0.0/15 559e239d-f744-4f84-bbe0-c7c6fd12ec17 dynamic vnet 1
# Check running Pod IPs
kubectl get pods --field-selector spec.nodeName=aks-agentpool-12345678-vmss000000,status.phase=Running -A -o json | jq -r '.items[] | select(.spec.hostNetwork != 'true').status.podIP' | wc -l
21
Oorzaak 1
Deze fout kan worden veroorzaakt door een fout in de netwerkinvoegtoepassing. De invoegtoepassing kan de toewijzing van het IP-adres niet ongedaan maken wanneer een pod wordt beëindigd.
Oplossing 1
Neem contact op met Microsoft voor een tijdelijke oplossing of oplossing.
Oorzaak 2
Het maken van pods is veel sneller dan garbagecollection van beëindigde pods.
Oplossing 2
Configureer snelle garbagecollection voor de kubelet. Zie de documentatie voor de Garbagecollection van Kubernetes voor instructies.
Service is niet toegankelijk binnen Pods
De eerste stap voor het oplossen van dit probleem is om te controleren of eindpunten automatisch zijn gemaakt voor de service:
kubectl get endpoints <service-name>
Als u een leeg resultaat krijgt, is de labelkiezer van uw service mogelijk onjuist. Controleer of het label juist is:
# Query Service LabelSelector.
kubectl get svc <service-name> -o jsonpath='{.spec.selector}'
# Get Pods matching the LabelSelector and check whether they're running.
kubectl get pods -l key1=value1,key2=value2
Als de voorgaande stappen verwachte waarden retourneren:
Controleer of de pod
containerPort
hetzelfde is als de servicecontainerPort
.Controleer of
podIP:containerPort
het werkt:# Testing via cURL. curl -v telnet ://<Pod-IP>:<containerPort> # Testing via Telnet. telnet <Pod-IP>:<containerPort>
Dit zijn enkele andere mogelijke oorzaken van serviceproblemen:
- De container luistert niet naar de opgegeven
containerPort
. (Controleer de beschrijving van de pod.) - Er treedt een CNI-invoegtoepassingsfout of netwerkroutefout op.
- kube-proxy wordt niet uitgevoerd of iptables-regels zijn niet juist geconfigureerd.
- Netwerkbeleid werpt verkeer op. Zie het overzicht van Azure Kubernetes-netwerkbeleid voor informatie over het toepassen en testen van netwerkbeleid.
- Als u Calico als uw netwerkinvoegtoepassing gebruikt, kunt u ook netwerkbeleidsverkeer vastleggen. Zie de Calico-site voor meer informatie over het configureren daarvan.
Knooppunten kunnen de API-server niet bereiken
Veel invoegtoepassingen en containers moeten toegang hebben tot de Kubernetes-API (bijvoorbeeld kube-dns en operatorcontainers). Als er fouten optreden tijdens dit proces, kunt u met de volgende stappen de oorzaak van het probleem bepalen.
Controleer eerst of de Kubernetes-API toegankelijk is binnen Pods:
kubectl run curl --image=mcr.microsoft.com/azure-cli -i -t --restart=Never --overrides='[{"op":"add","path":"/spec/containers/0/resources","value":{"limits":{"cpu":"200m","memory":"128Mi"}}}]' --override-type json --command -- sh
Voer vervolgens het volgende uit vanuit de container waarnaar u nu bent geshelld.
# If you don't see a command prompt, try selecting Enter.
KUBE_TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
curl -sSk -H "Authorization: Bearer $KUBE_TOKEN" https://$KUBERNETES_SERVICE_HOST:$KUBERNETES_SERVICE_PORT/api/v1/namespaces/default/pods
De uitvoer in orde ziet er ongeveer als volgt uit.
{
"kind": "PodList",
"apiVersion": "v1",
"metadata": {
"selfLink": "/api/v1/namespaces/default/pods",
"resourceVersion": "2285"
},
"items": [
...
]
}
Als er een fout optreedt, controleert u of de kubernetes-internal
service en de eindpunten in orde zijn:
kubectl get service kubernetes-internal
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes-internal ClusterIP 10.96.0.1 <none> 443/TCP 25m
kubectl get endpoints kubernetes-internal
NAME ENDPOINTS AGE
kubernetes-internal 172.17.0.62:6443 25m
Als beide tests antwoorden retourneren zoals de voorgaande en het IP-adres en de poort die zijn geretourneerd, overeenkomen met de antwoorden voor uw container, is het waarschijnlijk dat kube-apiserver niet wordt uitgevoerd of wordt geblokkeerd voor het netwerk.
Er zijn vier belangrijke redenen waarom de toegang mogelijk wordt geblokkeerd:
- Uw netwerkbeleid. Ze verhinderen mogelijk de toegang tot het API Management-vlak. Zie het overzicht van netwerkbeleid voor informatie over het testen van netwerkbeleid.
- De toegestane IP-adressen van uw API. Zie De geautoriseerde IP-adresbereiken van een clusterserver bijwerken voor informatie over het oplossen van dit probleem.
- Uw privéfirewall. Als u het AKS-verkeer routeert via een privéfirewall, moet u ervoor zorgen dat er uitgaande regels zijn, zoals beschreven in vereiste regels voor uitgaande netwerken en FQDN's voor AKS-clusters.
- Uw privé-DNS. Als u een privécluster host en u de API-server niet kunt bereiken, zijn uw DNS-doorstuurservers mogelijk niet juist geconfigureerd. Voltooi de stappen in Hub en spoke met aangepaste DNS om de juiste communicatie te garanderen.
U kunt ook kube-apiserverlogboeken controleren met behulp van Container Insights. Zie Logboeken opvragen uit Container Insights voor meer informatie over het uitvoeren van query's op kube-apiserver-logboeken en vele andere query's.
Ten slotte kunt u de status van de kube-apiserver en de bijbehorende logboeken in het cluster zelf controleren:
# Check kube-apiserver status.
kubectl -n kube-system get pod -l component=kube-apiserver
# Get kube-apiserver logs.
PODNAME=$(kubectl -n kube-system get pod -l component=kube-apiserver -o jsonpath='{.items[0].metadata.name}')
kubectl -n kube-system logs $PODNAME --tail 100
Als er een 403 - Forbidden
fout wordt geretourneerd, is kube-apiserver waarschijnlijk geconfigureerd met op rollen gebaseerd toegangsbeheer (RBAC) en is uw container ServiceAccount
waarschijnlijk niet gemachtigd voor toegang tot resources. In dit geval moet u de juiste RoleBinding
objecten maken.ClusterRoleBinding
Zie Access en identiteit voor informatie over rollen en rolbindingen. Zie RBAC-autorisatie gebruiken voor voorbeelden van het configureren van RBAC in uw cluster.
Medewerkers
Dit artikel wordt onderhouden door Microsoft. De tekst is oorspronkelijk geschreven door de volgende Inzenders.
Hoofdauteur:
- Michael Walters | Senior Consultant
Andere Inzenders:
- Mick Alberts | Technische schrijver
- Ayobami Ayodeji | Senior Program Manager
- Bahram Rushenas | Architect
Volgende stappen
- Netwerkconcepten voor toepassingen in AKS
- Problemen met toepassingen oplossen
- Fouten opsporen in services
- Kubernetes-clusternetwerken
- De beste netwerkinvoegtoepassing voor AKS kiezen