Vissza a bloghoz

Hogyan hárítsuk el a hibákat és vizsgáljuk meg a Kubernetes hálózatkezelést

Hogyan hárítsuk el a hibákat és vizsgáljuk meg a Kubernetes hálózatkezelést

Kubernetes egy nyílt forráskódú eszköz, amely kulcsfontosságú a konténer-orkesztrációban. A Kubernetes segít a fürtök (cluster) méretezhető orkesztrációjában és kezelésében a különböző felhőkörnyezetekben vagy akár a helyszíni (on-premise) szervereken. A fürt konténerizált alkalmazások és szolgáltatások futtatására szolgáló gazdagépek (hostok) halmaza. Egy fürt működéséhez legalább két csomópontra (node) van szükség – egy master csomópontra és egy worker csomópontra. A Kubernetes infrastruktúrát további worker csomópontok hozzáadásával méretezheti. A master csomópontnak és a worker csomópontoknak képesnek kell lenniük hálózaton keresztül kommunikálni az infrastruktúra működéséhez. A Kubernetes legfontosabb funkcióinak áttekintéséhez kövesse az alábbi útmutatónkat: Ismerkedés a Kubernetes-szel.

Ebben az útmutatóban bemutatunk számos olyan eszközt és technikát, amelyek segítenek a Kubernetes hálózatkezelésének vizsgálatában és hibaelhárításában.

Előfeltételek

  • Szüksége lesz továbbá a kubectl helyi telepítésére is. A helyi környezetétől függően kövesse a hivatalos dokumentációt a Kubernetes eszközök telepítéséről. A kubectl eszközt úgy kell konfigurálni, hogy csatlakozzon a fürthöz. Ezt az alábbi szakaszban részletesebben is elmagyarázzuk.

Számos parancsot fogunk futtatni helyben és a Kubernetes csomóponton is. Kezdjük el!

A helyi kubectl konfigurálása távoli Kubernetes fürthöz való csatlakozáshoz

Kezdjük a kubectl telepítésével. A mi helyi környezetünk Ubuntu-t futtat, kövesse ezt a linket, ha más helyi környezetet használ. A kubectl eszközök Ubuntu/Debian helyi környezetben történő telepítéséhez az apt csomagkezelővel, futtassa az alábbi parancsokat az apt adattár frissítéséhez és a szükséges csomagok telepítéséhez:

Ezután futtassa a következő parancsot a Google Cloud nyilvános aláíró kulcsának letöltéséhez:

Ezután adja hozzá a Kubernetes apt adattárat:

Ezt követően frissítse az apt indexet, és telepítse a kubectl eszközt a következő paranccsal:

Ezután ellenőrizze, hogy a kubectl telepítve van-e, a verzió ellenőrzésével a következő paranccsal:

Íme a kimenet, ha éppen most telepítette a kubectl eszközt helyben:

kubectl version

A fenti képernyőképen a kubectl megpróbál csatlakozni a helyi Kubernetes fürthöz. Ez azonban sikertelen, mert még nem fut Kubernetes fürt a helyi gépünkön.

A távoli Kubernetes fürthöz való csatlakozáshoz először le kell töltenie a Kubernetes hitelesítő adatokat a távoli fürtről. Íme egy parancs a hitelesítő adatok másolásához a master csomópontról:

Cserélje ki a kiemelt részeket a saját ssh felhasználónevére és a master csomópont nyilvános IP-címére. Miután a hitelesítő adatok letöltése befejeződött, másolja azokat a saját home könyvtárába:

Ez minden. A helyi kubectl eszköznek képesnek kell lennie csatlakozni a távoli Kubernetes fürthöz és parancsokat kiadni azon. Annak megerősítéséhez, hogy a helyi kubectl csatlakozik a távoli fürthöz, ellenőrizze újra a version paranccsal:

Itt látható a kimenet, amely a sikeres kapcsolatot mutatja:

kubectl version json

Opcionálisan végrehajthatja a get nodes parancsot a következőképpen:

kubectl get nodes

Egy Pod Cluster IP-címének lekérdezése

Egy Pod Cluster IP-címét a következő parancs futtatásával kérdezheti le: kubectl get pod parancsot a helyi gépén. Ha további információkat szeretne kilistázni, például a podot kiszolgáló csomópontot és a pod cluster IP-címét, adja hozzá a -o wide jelzőt a parancshoz:

Itt látható a Kubernetes-fürtünk kimenete. Az előfeltételként szolgáló oktatóanyagban egy Nginx webszerver telepítést hoztunk létre, amint látható:

kubectl get pod -o wide

Az IP oszlop az egyes podok belső IP-címét mutatja. Ha a keresett pod nem jelenik meg a listában, előfordulhat, hogy egy másik névtérben (namespace) van. A következő paranccsal listázhatja ki a podokat az összes namespaces:

Egy Service IP-címének lekérdezése

A fürtön lévő Service IP-címét is lekérdezheti. Ha hozzáadja a --all-namespaces jelzőt, megkapja a fürtön futó összes szolgáltatást:

A fenti parancs kimenete a következő. A Service IP a cluster-ip oszlopban található:

kubectl get svc

Pod hálózati névterek lekérdezése és elérése

Minden Kubernetes podhoz hozzá van rendelve egy hálózati névtér (network namespace). A hálózati névterek, más néven netns-ek, olyan natív hálózati könyvtárak Linuxban, amelyek elszigetelést biztosítanak a hálózati eszközök között.

A DNS-feloldás vagy az általános hálózati kapcsolat ellenőrzéséhez parancsokat futtathat egy pod hálózati névterén belül. Ennek eléréséhez először meg kell keresnie a pod egyik konténerének folyamatazonosítóját (process ID). Ezt könnyen megteheti a Docker rendszerben Docker-specifikus parancsok használatával. Az első parancs kilistázza a csomóponton futó konténereket. Jelentkezzen be az egyik munkavégző csomópontjára (worker node), és futtassa a következő parancsot:

docker ps

A kimenetben a konténerazonosító (container ID) vagy a Names (Nevek) oszlop érdekel minket. Figyelje meg az Nginx konténert, amelyet az előfeltételként szolgáló Hogyan telepítsük és használjuk a Kubernetes-t Ubuntu 20.04-en.

Ezután másolja ki a konténerazonosítót vagy nevet, mivel ezt fogjuk használni a következő parancsban a folyamatazonosító megkereséséhez:

Cserélje ki a kiemelt részt az előző parancsból kimásolt értékre. Alább látható a kapott kimenet, amely a folyamatazonosító:

docker inspect

Most, hogy megvan a folyamatazonosító, használhatjuk a nsenter parancs futtatására a folyamat hálózati névterén belül:

Cserélje ki a kiemelt részt az előző parancsban kapott folyamatazonosítóra. Ezután a ip addr helyére bármilyen parancsot beírhat, amelyet a pod hálózati névterén belül szeretne futtatni. Sudo-val is futtathatja, ha engedély megtagadva (permission denied) hibát kap.

A nsenter parancs lehetővé teszi a csomóponton elérhető parancsok szélesebb körének futtatását, ellentétben a docker exec használatával, amely csak a konténerbe telepített parancsokra korlátozza Önt.

Egy Pod virtuális Ethernet interfészének lekérése

Egy pod hálózati névtere egy virtuális ethernet csatornán (pipe) keresztül kommunikál a csomópont gyökér netns-ével. A csomópont oldalán ez a csatorna olyan eszközként jelenik meg, amelynek a neve a következővel kezdődik: veth és egy egyedi azonosítóval végződik, mint például veth742f721 vagy veth90. Miközben a podon belül a csatorna azonosítója eth0.

Szeretné tudni, hogy melyik veth eszköz melyik podhoz van párosítva. Kezdheti azzal, hogy kilistázza a csomópont összes hálózati eszközét, majd kilistázza a pod hálózatában lévő összes eszközt. Annak azonosításához, hogy melyik veth eszköz van párosítva egy adott podhoz, összevetheti a két listában szereplő eszközszámokat.

Használja a nsenter parancsot a ip addr parancs futtatásához a pod hálózati névterében. Ismernie kell a konténer egyik folyamatazonosítóját. Ehhez olvassa el az előző, Pod hálózati névterek lekérdezése és elérése.

Ezután futtassa a következő parancsot a worker csomópont terminálján, megfelelően helyettesítve a kiemelt részt:

A parancs kilistázza a pod interfészeit:

nsenter ip addr

Figyelje meg a if7 karaktereket a eth0@ után a fenti kimenetben. Ez azt jelenti, hogy a pod eth0 a csomópont 7. interfészével van párosítva. Ezután listázza ki a csomópont alapértelmezett névterében lévő interfészeket a ip addr parancs futtatásával:

A parancs az alábbiak szerint listázza az interfészeket:

Kubernetes Networking ip addr

A kimenetben a 7. interfész a veth254b50e6@if3  – a virtuális ethernet csatorna, amely a tesztelt podhoz van párosítva.

Iptables szabályok áttekintése

A következő parancs futtatásával iptables-save kilistázhatja egy csomópont összes iptables szabályát:

A parancs kimenete hosszú lehet, ezért elmentheti egy fájlba a későbbi vizsgálathoz:

A kimenet lapozásához használhatja a less parancsot is:

Mivel minket csak a Kubernetes NAT szabályok érdekelnek, adja hozzá a -L jelzőt a megfelelő cél megadásához:

Íme a kimenet:

Kubernetes Networking iptables

IPVS részleteinek vizsgálata

A kube-proxy egy hálózati proxy, amely a Kubernetes-fürt minden egyes csomópontján fut. Segítségével beállítható az IPVS a virtuális Service IP-k pod IP-kké történő fordításának kezelésére. Az IP-fordítási táblázat kilistázásához használhatja az ipvsadm parancsot. Először telepítenie kell a csomópontjára:

Most már futtathatja a következő parancsot:

Egyetlen Service IP megjelenítéséhez adja hozzá a -t jelzőt, megadva a kívánt IP-címet:

Fürt DNS lekérdezése

Többféleképpen is hibakeresést végezhet a fürt DNS-feloldásában. A hivatalos dokumentáció az egyik módszerként egy hibakereső konténer telepítését írja le az összes szükséges eszközzel, majd a kubectl használatát a nslookup.

végrehajtásához. Alternatív megoldásként lekérdezheti a DNS-t a dig és nsenter parancsokkal magáról a csomópontról is. Először telepítenie kell a dig eszközt a master csomópontra. Ubuntu esetén a telepítéshez használja az apt parancsot:

Kubernetes Networking install dnsutils

Menjen vissza a helyi gép termináljához, és futtassa az alábbi parancsot a kube-dns szolgáltatás fürt IP-címének megkereséséhez:

A parancs kimenete:

get kube dns service

A cluster-ip oszlop tartalmazza a szükséges értéket. Most már használhatjuk a nsenter parancsot a dig futtatásához a konténer névterében. A névteréhez való hozzáféréshez azonban szüksége lesz a konténer folyamatazonosítójára (PID). Útmutatásért tekintse meg a fenti Getting and Accessing Pod Network Namespaces című részt.

Miután megvan a container-id, futtassa a következő parancsot a master csomóponton:

A dig parancs a fürt DNS szolgáltatás IP-címét ( @10.96.0.10) veszi alapul, és kikeresi a Service teljes tartománynevét: service-name.namespace.svc.cluster.local:

Kubernetes Networking nsenter dig

A szolgáltatásnevek és névterek megkeresésével kapcsolatos információkért tekintse meg a Getting the IP address of a Service.

A Conntrack kapcsolatkövetés áttekintése

A conntrack parancs segítségével megtekintheti az összes jelenleg követett kapcsolatot:

A kimenet a képernyőképhez hasonló lesz:

Kubernetes Networking conntrac -l

Adja hozzá az -E jelzőt a bejövő kapcsolatok folyamatos figyeléséhez:

Egy adott célcímre irányuló kapcsolatok megtekintéséhez adja hozzá a -d jelzőt, és adja meg a célcímet:

Néha a kapcsolatkövetési tábla megtelik, ami az új kapcsolatok eldobását eredményezi. Ez problémákat okoz, megakadályozva, hogy a csomópontok megbízható kapcsolatokat hozzanak létre. Ha ez történik, a következőkhöz hasonló üzeneteket fog látni a rendszernaplókban, a következő helyen: /var/log/syslog:

Létezik egy rendszerbeállítás a nyomon követhető maximális kapcsolatok számához. Használja a következő parancsot az aktuális érték kilistázásához:

A kimenet:

conntrack max

Az értéket a következő használatával módosíthatja: -w jelzővel:

Lehetséges, hogy módosítani szeretné a /etc/sysctl.conf fájlt, hogy az érték állandó legyen, és újraindítások után is megmaradjon. Nyissa meg a fájlt a nano segítségével:

Ezután módosítsa az értéket, ha a sor már létezik, vagy adja hozzá a sort a fájl végéhez, megadva az új értéket:

Összegzés

Több konténerizált szolgáltatás telepítésekor nagy hasznát veszi majd a Kubernetesnek, mivel az központi felügyeleti pontot biztosít. A különböző Kubernetes podok közötti kapcsolat biztosítása érdekében bemutattunk néhány hálózatvizsgáló parancsot, amelyekkel elháríthatja a Kubernetes-infrastruktúrával kapcsolatos problémákat.

Ha szeretne többet megtudni a Kubernetesről, annak előnyeiről, valamint az alkalmazások Kubernetesen történő beállításáról és telepítéséről, tekintse meg a különböző Kubernetes oktatóanyagainkat.

Kellemes számítástechnikát!

author

Pranay Kapgate

Szerző · CloudSigma

Preslav Dobrev a CloudSigma kreatív tervezője, aki hagyományos és innovatív marketingcsatornák segítségével következetes vállalati identitás kialakítására összpontosít. Kiemelkedően képes ötvözni a művészi látásmódot a stratégiai marketinggel, hogy hatásos márkatörténeteket hozzon létre.

Hozzászólások

Még nincsenek hozzászólások. Legyen Ön az első.