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
-
Az útmutató követéséhez szüksége lesz egy Kubernetes fürtre. Van egy útmutatónk, amely elmagyarázza, Hogyan telepítsük és használjuk a Kubernetes-t Ubuntu 20.04-en ez segíthet egy alapvető fürt beállításában a bemutatóhoz.
-
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:
|
1 2 |
sudo apt-get update sudo apt-get install -y apt-transport-https ca-certificates curl |
Ezután futtassa a következő parancsot a Google Cloud nyilvános aláíró kulcsának letöltéséhez:
|
1 |
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg |
Ezután adja hozzá a Kubernetes apt adattárat:
|
1 |
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list |
Ezt követően frissítse az apt indexet, és telepítse a kubectl eszközt a következő paranccsal:
|
1 2 |
sudo apt-get update sudo apt-get install -y kubectl |
Ezután ellenőrizze, hogy a kubectl telepítve van-e, a verzió ellenőrzésével a következő paranccsal:
|
1 |
kubectl version |
Íme a kimenet, ha éppen most telepítette a kubectl eszközt helyben:

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:
|
1 |
scp -r hackins@178.22.66.253:/home/hackins/.kube . |
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:
|
1 |
cp -r .kube $HOME/ |
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:
|
1 |
kubectl version --output='json' |
Itt látható a kimenet, amely a sikeres kapcsolatot mutatja:

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

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:
|
1 |
kubectl get pod -o wide |
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ó:

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:
|
1 |
kubectl get pod -o wide --all-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:
|
1 |
kubectl get service --all-namespaces |
A fenti parancs kimenete a következő. A Service IP a cluster-ip oszlopban található:

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:
|
1 |
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:
|
1 |
docker inspect --format '{{ .State.Pid }}' container-id-vagy-name |
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ó:

Most, hogy megvan a folyamatazonosító, használhatjuk a nsenter parancs futtatására a folyamat hálózati névterén belül:
|
1 |
sudo nsenter -t container-pid -n ip addr |
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:
|
1 |
sudo nsenter -t container-pid -n ip addr |
A parancs kilistázza a pod interfészeit:

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:
|
1 |
ip addr |
A parancs az alábbiak szerint listázza az interfészeket:

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:
|
1 |
iptables-save |
A parancs kimenete hosszú lehet, ezért elmentheti egy fájlba a későbbi vizsgálathoz:
|
1 |
iptables-save > iptables.txt |
A kimenet lapozásához használhatja a less parancsot is:
|
1 |
iptables-save | less |
Mivel minket csak a Kubernetes NAT szabályok érdekelnek, adja hozzá a -L jelzőt a megfelelő cél megadásához:
|
1 |
sudo iptables -t nat -L KUBE-SERVICES |
Íme a kimenet:

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:
|
1 |
sudo apt install ipvsadm |
Most már futtathatja a következő parancsot:
|
1 |
sudo ipvsadm -Ln |
Egyetlen Service IP megjelenítéséhez adja hozzá a -t jelzőt, megadva a kívánt IP-címet:
|
1 |
ipvsadm -Ln -t 10.244.1.255 |
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:
|
1 |
sudo apt 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:
|
1 |
kubectl get service -n kube-system kube-dns |
A parancs kimenete:

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:
|
1 |
sudo nsenter -t 27168 -n dig kubernetes.default.svc.cluster.local @10.96.0.10 |
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:

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:
|
1 |
sudo conntrack -L |
A kimenet a képernyőképhez hasonló lesz:

Adja hozzá az -E jelzőt a bejövő kapcsolatok folyamatos figyeléséhez:
|
1 |
sudo conntrack -E |
Egy adott célcímre irányuló kapcsolatok megtekintéséhez adja hozzá a -d jelzőt, és adja meg a célcímet:
|
1 |
sudo conntrack -L -d 80.45.6.4 |
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:
|
1 |
Mar 07 19:12:11 worker-105 kernel: nf_conntrack: tábla tele, eldobás csomag. |
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:
|
1 |
sysctl net.netfilter.nf_conntrack_max |
A kimenet:

Az értéket a következő használatával módosíthatja: -w jelzővel:
|
1 |
sudo sysctl -w net.netfilter.nf_conntrack_max=231074 |
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:
|
1 |
sudo nano /etc/sysctl.conf |
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:
|
1 |
net.netfilter.nf_conntrack_max=231074 |
Ö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!
Hozzászólások
Még nincsenek hozzászólások. Legyen Ön az első.