Hálózati problémák elhárítása az AKS-fürtökben
A Kubernetes új telepítéseinél vagy a Kubernetes-terhelés növelésekor hálózati problémák léphetnek fel. A hálózatkezelési problémákhoz kapcsolódó egyéb problémák is előfordulhatnak. Mindig tekintse meg az AKS hibaelhárítási útmutatóját, és ellenőrizze, hogy a probléma ott van-e ismertetve. Ez a cikk további részleteket és szempontokat ismertet a hálózati hibaelhárítás szempontjából, valamint az esetlegesen felmerülő konkrét problémákat.
Az ügyfél nem tudja elérni az API-kiszolgálót
Ezek a hibák olyan csatlakozási problémákat okoznak, amelyek akkor fordulnak elő, ha egy Azure Kubernetes Service- (AKS-) fürt API-kiszolgálóját nem éri el a Kubernetes-fürt parancssori eszközén (kubectl) vagy bármely más eszközön keresztül, például a REST API-t egy programozási nyelven keresztül.
Hiba
Az alábbihoz hasonló hibaüzenetek jelenhetnek meg:
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.
1. ok
Lehetséges, hogy az API-kiszolgáló által engedélyezett IP-tartományok engedélyezve vannak a fürt API-kiszolgálóján, de az ügyfél IP-címe nem szerepel ezekben az IP-tartományokban. Annak megállapításához, hogy az IP-tartományok engedélyezve vannak-e, használja az alábbi az aks show
parancsot az Azure CLI-ben. Ha az IP-tartományok engedélyezve vannak, a parancs létrehozza az IP-tartományok listáját.
az aks show --resource-group <cluster-resource-group> \
--name <cluster-name> \
--query apiServerAccessProfile.authorizedIpRanges
1\. megoldás
Győződjön meg arról, hogy az ügyfél IP-címe a fürt API-kiszolgálója által engedélyezett tartományokon belül van:
Keresse meg a helyi IP-címét. A windowsos és a linuxos keresésről a Hogyan találom meg az IP-címemet? című témakörben talál további információt.
Frissítse az API-kiszolgáló által engedélyezett tartományt az
az aks update
Azure CLI parancsával. Engedélyezze az ügyfél IP-címét. Útmutatásért tekintse meg a fürt API-kiszolgálójának engedélyezett IP-tartományainak frissítését.
Ok 2
Ha az AKS-fürt privát fürt, az API-kiszolgáló végpontja nem rendelkezik nyilvános IP-címmel. Olyan virtuális gépet kell használnia, amely hálózati hozzáféréssel rendelkezik az AKS-fürt virtuális hálózatához.
2\. megoldás
A probléma megoldásáról további információt a privát fürthöz való csatlakozás lehetőségeiben talál.
A pod nem tudja lefoglalni az IP-címet
Hiba
A pod elakadt az ContainerCreating
állapotban, és az események hibát jeleznek Failed to allocate address
:
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
Vagy hiba not enough IPs available
:
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'}]
Ellenőrizze a lefoglalt IP-címeket a beépülő modul IPAM-tárolójában. Előfordulhat, hogy az összes IP-cím le van foglalva, de a szám sokkal kisebb, mint a futó podok száma:
Kubenet használata esetén:
# 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
Feljegyzés
A Calico nélküli Kubenet esetében az elérési út ./var/lib/cni/networks/kubenet
A Calico kubenet esetében az elérési út./var/lib/cni/networks/k8s-pod-network
A fenti szkript automatikusan kijelöli az elérési utat a parancs végrehajtása közben.
# 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
Ha az Azure CNI-t használja dinamikus IP-foglaláshoz:
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
1. ok
Ezt a hibát a hálózati beépülő modul hibája okozhatja. A beépülő modul nem tudja felszabadítani az IP-címet a pod leállásakor.
1\. megoldás
Kerülő megoldásért vagy javításért forduljon a Microsofthoz.
Ok 2
A pod létrehozása sokkal gyorsabb, mint a leállított podok szemétgyűjtése.
2\. megoldás
Konfigurálja a kubelet gyors szemétgyűjtését. Útmutatásért tekintse meg a Kubernetes szemétgyűjtési dokumentációját.
A szolgáltatás nem érhető el podokon belül
A probléma megoldásának első lépése annak ellenőrzése, hogy a végpontok automatikusan lettek-e létrehozva a szolgáltatáshoz:
kubectl get endpoints <service-name>
Ha üres eredményt kap, előfordulhat, hogy a szolgáltatás címkeválasztója hibás. Ellenőrizze, hogy a címke helyes-e:
# 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
Ha az előző lépések a várt értékeket adják vissza:
Ellenőrizze, hogy a pod
containerPort
megegyezik-e a szolgáltatássalcontainerPort
.Ellenőrizze, hogy működik-e
podIP:containerPort
:# Testing via cURL. curl -v telnet ://<Pod-IP>:<containerPort> # Testing via Telnet. telnet <Pod-IP>:<containerPort>
A szolgáltatásproblémák további lehetséges okai:
- A tároló nem figyeli a megadott
containerPort
értéket. (Ellenőrizze a pod leírását.) - CNI beépülő modulhiba vagy hálózati útvonalhiba történik.
- A kube-proxy nem fut, vagy az iptables-szabályok nincsenek megfelelően konfigurálva.
- A hálózati házirendek forgalomleadást bonyolítanak. A hálózati szabályzatok alkalmazásával és tesztelésével kapcsolatos információkért tekintse meg az Azure Kubernetes hálózati szabályzatainak áttekintését.
- Ha a Calico-t használja hálózati beépülő modulként, akkor a hálózati házirendek forgalmát is rögzítheti. Ennek konfigurálásáról további információt a Calico webhelyén talál.
A csomópontok nem érik el az API-kiszolgálót
Számos bővítménynek és tárolónak hozzá kell férnie a Kubernetes API-hoz (például kube-dns- és operátortárolókhoz). Ha a folyamat során hibák lépnek fel, az alábbi lépések segíthetnek meghatározni a probléma forrását.
Először ellenőrizze, hogy a Kubernetes API elérhető-e a Podokon belül:
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
Ezután hajtsa végre a következőt a most rendszerhéjba helyezett tárolóból.
# 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
Az kifogástalan kimenet az alábbihoz hasonlóan fog kinézni.
{
"kind": "PodList",
"apiVersion": "v1",
"metadata": {
"selfLink": "/api/v1/namespaces/default/pods",
"resourceVersion": "2285"
},
"items": [
...
]
}
Ha hiba történik, ellenőrizze, hogy a szolgáltatás és végpontjai kubernetes-internal
kifogástalan állapotban vannak-e:
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
Ha mindkét teszt az előzőekhez hasonló válaszokat ad vissza, és a visszaadott IP-cím és port megegyezik a tárolóéval, akkor valószínű, hogy a kube-apiserver nem fut vagy le van tiltva a hálózatról.
A hozzáférés blokkolásának négy fő oka lehet:
- A hálózati házirendek. Előfordulhat, hogy megakadályozzák az API felügyeleti síkhoz való hozzáférést. A hálózati házirendek teszteléséről további információt a Hálózati házirendek áttekintése című témakörben talál.
- Az API engedélyezett IP-címei. A probléma megoldásáról további információt a fürt API-kiszolgálójának engedélyezett IP-tartományainak frissítése című témakörben talál.
- A privát tűzfal. Ha privát tűzfalon keresztül irányítja át az AKS-forgalmat, győződjön meg arról, hogy vannak kimenő szabályok az AKS-fürtök kötelező kimenő hálózati szabályaiban és teljes tartományneveiben leírtak szerint.
- A privát DNS-ét. Ha privát fürtöt üzemeltet, és nem tudja elérni az API-kiszolgálót, előfordulhat, hogy a DNS-továbbítók nincsenek megfelelően konfigurálva. A megfelelő kommunikáció biztosítása érdekében végezze el a hubon a lépéseket, és egyéni DNS-sel küllős legyen.
A Kube-apiserver naplóit a Container Insights használatával is ellenőrizheti. A kube-apiserver-naplók és sok más lekérdezés lekérdezésével kapcsolatos információkért lásd : Naplók lekérdezése a Container Insightsból.
Végül ellenőrizheti a kube-apiserver állapotát és naplóit a fürtön:
# 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
Ha egy 403 - Forbidden
hiba visszatér, a kube-apiserver valószínűleg szerepköralapú hozzáférés-vezérléssel (RBAC) van konfigurálva, és a tároló ServiceAccount
valószínűleg nem jogosult az erőforrások elérésére. Ebben az esetben megfelelő RoleBinding
és ClusterRoleBinding
objektumokat kell létrehoznia. A szerepkörökről és a szerepkörkötésekről az Access és az identitás című témakörben olvashat bővebben. Az RBAC fürtre való konfigurálására vonatkozó példákért lásd az RBAC-hitelesítés használatát ismertető témakört.
Közreműködők
Ezt a cikket a Microsoft tartja karban. Eredetileg a következő közreműködők írták.
Fő szerző:
- Michael Walters | Vezető tanácsadó
Egyéb közreműködők:
- Mick Alberts | Műszaki író
- Ayobami Ayodeji | Vezető programmenedzser
- Bahram Rushenas | Építész
Következő lépések
- AKS-alkalmazások hálózati fogalmai
- Alkalmazások hibaelhárítása
- Szolgáltatások hibakeresése
- Kubernetes-fürt hálózatkezelése
- Az AKS legjobb hálózati beépülő moduljának kiválasztása
Kapcsolódó erőforrások
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: