Kubernetes je open-source nástroj, ktorý je kľúčový v orchestrácii kontajnerov. Kubernetes pomáha pri orchestrácii a správe klastrov vo veľkom meradle v rôznych cloudových prostrediach alebo dokonca na lokálnych (on-premise) serveroch. Klaster je skupina hostiteľov určených na spúšťanie kontajnerizovaných aplikácií a služieb. Klaster potrebuje na fungovanie minimálne dva uzly – jeden riadiaci uzol (master node) a jeden pracovný uzol (worker node). Svoju infraštruktúru Kubernetes môžete škálovať pridaním ďalších pracovných uzlov. Riadiaci uzol a jeho pracovné uzly musia byť schopné komunikovať cez sieť, aby infraštruktúra fungovala. Pre prehľad najdôležitejších funkcií Kubernetes postupujte podľa nášho návodu na Zoznámenie sa s Kubernetes.
V tomto návode vám ukážeme niekoľko nástrojov a techník, ktoré vám pomôžu pri kontrole a riešení problémov so sieťou v Kubernetes.
Požiadavky
-
Ak chcete postupovať podľa tohto návodu, mali by ste mať klaster Kubernetes. Máme návod, ktorý vysvetľuje Ako nainštalovať a používať Kubernetes na Ubuntu 20.04 ktorý vás môže viesť pri nastavení základného klastra pre demonštráciu.
-
Mali by ste mať tiež kubectl nainštalovaný lokálne. V závislosti od vášho lokálneho prostredia postupujte podľa oficiálnej dokumentácie o inštalácii nástrojov Kubernetes. Nástroj kubectl by mal byť nakonfigurovaný na pripojenie k vášmu klastru. Podrobnejšie to vysvetlíme v sekcii nižšie.
Spustíme niekoľko príkazov lokálne aj na uzle Kubernetes. Začnime!
Konfigurácia lokálneho kubectl na pripojenie k vzdialenému klastru Kubernetes
Začnime inštaláciou kubectl. Naše lokálne prostredie beží na Ubuntu, postupujte podľa tohto odkazu, ak používate iné lokálne prostredie. Ak chcete nainštalovať nástroje kubectl v lokálnom prostredí Ubuntu/Debian pomocou správcu balíkov apt, spustite nasledujúce príkazy na aktualizáciu repozitára apt a inštaláciu potrebných balíkov:
|
1 2 |
sudo apt-get update sudo apt-get install -y apt-transport-https ca-certificates curl |
Ďalej spustite nasledujúci príkaz na stiahnutie verejného podpisového kľúča Google Cloud:
|
1 |
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg |
Potom pridajte repozitár apt Kubernetes:
|
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 |
Potom aktualizujte index apt a nainštalujte kubectl pomocou nasledujúceho príkazu:
|
1 2 |
sudo apt-get update sudo apt-get install -y kubectl |
Potom overte, že kubectl je nainštalovaný skontrolovaním verzie pomocou nasledujúceho príkazu:
|
1 |
kubectl version |
Tu je výstup, ak ste práve nainštalovali kubectl lokálne:

Na snímke obrazovky vyššie sa kubectl pokúša pripojiť k lokálnemu klastru Kubernetes. Zlyháva to však, pretože na našom lokálnom počítači ešte nemáme spustený žiadny klaster Kubernetes.
Ak chcete pripojiť k vzdialenému klastru Kubernetes, najprv si stiahnete prihlasovacie údaje Kubernetes zo vzdialeného klastra. Tu je príkaz na skopírovanie prihlasovacích údajov z riadiaceho uzla (master node):
|
1 |
scp -r hackins@178.22.66.253:/home/hackins/.kube . |
Nahraďte zvýraznené časti svojím ssh používateľským menom a verejnou IP adresou riadiaceho uzla. Po dokončení sťahovania prihlasovacích údajov ich skopírujte do svojho domovského adresára:
|
1 |
cp -r .kube $HOME/ |
To je všetko. Váš lokálny kubectl by mal byť schopný pripojiť sa k vášmu vzdialenému klastru Kubernetes a spúšťať na ňom príkazy. Ak chcete potvrdiť, že váš lokálny kubectl je pripojený k vzdialenému klastru, znova to skontrolujte pomocou príkazu version:
|
1 |
kubectl version --output='json' |
Tu je výstup, ktorý ukazuje úspešné pripojenie:

Voliteľne môžete spustiť príkaz get nodes nasledovne:

Získanie Cluster IP adresy Podu
Cluster IP adresu Podu môžete získať spustením príkazu kubectl get pod na vašom lokálnom stroji. Ak chcete zobraziť viac informácií, ako napríklad uzol hosťujúci pod a cluster IP podu, pridajte príznak -o wide k príkazu:
|
1 |
kubectl get pod -o wide |
Tu je výstup z nášho Kubernetes clustera. V predchádzajúcom návode sme vytvorili deployment webového servera Nginx, ako môžete vidieť:

Stĺpec IP zobrazuje internú IP adresu jednotlivých podov. Ak sa pod, ktorý hľadáte, v zozname nenachádza, môžete byť v inom namespace. Na zobrazenie podov vo všetkých namespaces:
|
1 |
kubectl get pod -o wide --all-namespaces |
Získanie IP adresy služby (Service)
Môžete tiež získať IP adresu služby (Service) vo vašom clusteri. Pridaním príznaku --all-namespaces získate všetky služby bežiace v clusteri:
|
1 |
kubectl get service --all-namespaces |
Výstup z vyššie uvedeného príkazu je nasledujúci. IP adresa služby (Service IP) sa nachádza v stĺpci cluster-ip :

Získanie a prístup k sieťovým namespacom podov
Každý pod v Kubernetes má priradený sieťový namespace. Sieťové namespace, označované aj ako netns, sú natívne sieťové knižnice v Linuxe, ktoré poskytujú izoláciu medzi sieťovými zariadeniami.
Ak chcete skontrolovať preklad DNS alebo všeobecnú sieťovú konektivitu, môžete spustiť príkazy v rámci sieťového namespace podu. Aby ste to dosiahli, začnite vyhľadaním ID procesu (PID) jedného z kontajnerov v pode. To môžete jednoducho urobiť v Docker pomocou príkazov špecifických pre Docker. Prvý príkaz zobrazí zoznam kontajnerov bežiacich na uzle. Prihláste sa do jedného zo svojich worker uzlov a spustite nasledujúci príkaz:
|
1 |
docker ps |

Vo výstupe nás zaujíma stĺpec s ID kontajnera (container ID) alebo názvami (Names). Všimnite si kontajner Nginx, ktorý sme nasadili v predchádzajúcom návode How to Install and Use Kubernetes on Ubuntu 20.04.
Potom skopírujte ID alebo názov kontajnera, pretože ho použijeme v nasledujúcom príkaze na zistenie ID procesu:
|
1 |
docker inspect --format '{{ .State.Pid }}' container-id-alebo-name |
Nahraďte zvýraznenú časť vašou hodnotou skopírovanou z predchádzajúceho príkazu. Nižšie je uvedený výstup, ktorý sme dostali, čo je ID procesu:

Teraz, keď máme ID procesu, môžeme ho použiť na spustenie príkazu nsenter vo vnútri sieťového namespace daného procesu:
|
1 |
sudo nsenter -t container-pid -n ip addr |
Nahraďte zvýraznenú časť ID procesu, ktoré ste získali v predchádzajúcom príkaze. Potom namiesto ip addr, môžete zadať akýkoľvek príkaz, ktorý chcete spustiť v sieťovom namespace podu. V prípade, že dostanete chybu odmietnutia prístupu (permission denied), môžete ho spustiť aj pomocou sudo.
Príkaz nsenter vám umožňuje spustiť širšiu škálu príkazov dostupných na uzle v porovnaní s použitím docker exec ktorý vás obmedzuje iba na príkazy nainštalované vo vnútri kontajnera.
Získanie virtuálneho ethernetového rozhrania podu
Sieťový namespace v pode komunikuje s koreňovým netns uzla prostredníctvom virtuálneho ethernetového prepojenia (pipe). Na strane uzla sa toto prepojenie javí ako zariadenie, ktorého názov začína na veth a končí jedinečným identifikátorom, ako napríklad veth742f721 alebo veth90. Zatiaľ čo vo vnútri podu sa toto prepojenie identifikuje ako eth0.
Možno budete chcieť vedieť, ktoré veth zariadenie je spárované s ktorým podom. Môžete začať vypísaním všetkých sieťových zariadení na uzle a potom vypísať všetky zariadenia v sieti podu. Ak chcete zistiť, ktoré veth zariadenie je spárované s konkrétnym podom, môžete porovnať čísla zariadení medzi týmito dvoma výpismi.
Použite príkaz nsenter na spustenie príkazu ip addr v sieťovom namespace podu. Budete musieť poznať ID procesu jedného z kontajnerov. Informácie o tom nájdete v predchádzajúcej časti o Získaní a prístupe k sieťovým namespacom podov.
Ďalej spustite nasledujúci príkaz v termináli vášho worker uzla a príslušným spôsobom nahraďte zvýraznenú časť:
|
1 |
sudo nsenter -t container-pid -n ip addr |
Príkaz vypíše zoznam rozhraní podu:

Všimnite si if7 znaky za eth0@ vo výstupe vyššie. To znamená, že eth0 je spárované so 7. rozhraním uzla. Ďalej vypíšte rozhrania v predvolenom mennom priestore uzla spustením príkazu ip addr :
|
1 |
ip addr |
Príkaz vypíše rozhrania, ako je znázornené nižšie:

Vo výstupe je 7. rozhranie veth254b50e6@if3 – virtuálne ethernetové prepojenie spárované s podom, voči ktorému testujeme.
Kontrola pravidiel iptables
Môžete spustiť príkaz iptables-save na vypísanie všetkých iptables na uzle:
|
1 |
iptables-save |
Výstup príkazu môže byť dlhý, takže ho môžete uložiť do súboru pre neskoršiu kontrolu:
|
1 |
iptables-save > iptables.txt |
Môžete tiež použiť less na stránkovanie výstupu:
|
1 |
iptables-save | less |
Keďže nás zaujímajú iba pravidlá NAT pre Kubernetes, pridajte príznak -L na špecifikovanie správneho cieľa:
|
1 |
sudo iptables -t nat -L KUBE-SERVICES |
Tu je výstup:

Kontrola podrobností IPVS
Kube-proxy je sieťová proxy bežiaca na každom uzle vo vašom Kubernetes klastri. Môže sa použiť na konfiguráciu IPVS na spracovanie prekladu virtuálnych IP adries služieb (Service IPs) na IP adresy podov. Na vypísanie prekladovej tabuľky IP adries môžete použiť príkaz ipvsadm . Najprv ho musíte nainštalovať na svoj uzol:
|
1 |
sudo apt install ipvsadm |
Teraz môžete spustiť nasledujúci príkaz:
|
1 |
sudo ipvsadm -Ln |
Ak chcete zobraziť jednu IP adresu služby, pridajte príznak -t a špecifikujte požadovanú IP adresu:
|
1 |
ipvsadm -Ln -t 10.244.1.255 |
Dopytovanie DNS klastra
Existuje niekoľko spôsobov, ako môžete ladiť preklad DNS vášho klastra. Oficiálna dokumentácia popisuje jeden spôsob ako nasadenie ladiaceho kontajnera so všetkými potrebnými nástrojmi a následné použitie kubectl na exec nslookup.
Voliteľne môžete dopytovať DNS pomocou príkazov dig and nsenter priamo z uzla. Najprv budete musieť nainštalovať dig na vašom master uzle. V prípade Ubuntu ho nainštalujte pomocou príkazu apt :
|
1 |
sudo apt install dnsutils |

Vráťte sa do terminálu na vašom lokálnom počítači a spustením nižšie uvedeného príkazu nájdite IP adresu klastra pre službu kube-dns :
|
1 |
kubectl get service -n kube-system kube-dns |
Príkaz vypíše:

Stĺpec cluster-ip obsahuje hodnotu, ktorú potrebujeme. Teraz môžeme použiť nsenter na spustenie dig v mennom priestore kontajnera. Na prístup k jeho mennému priestoru však budete potrebovať ID procesu kontajnera. Pozrite si časť Získanie a prístup k sieťovým menným priestorom podov vyššie pre návod.
Keď máte container-id, spustite nasledujúci príkaz na vašom master uzle:
|
1 |
sudo nsenter -t 27168 -n dig kubernetes.default.svc.cluster.local @10.96.0.10 |
Príkaz dig prevezme IP adresu DNS služby klastra ( @10.96.0.10) a vyhľadá úplný názov domény služby service-name.namespace.svc.cluster.local:

Informácie o hľadaní názvov služieb a menných priestorov nájdete v časti Získanie IP adresy služby.
Kontrola sledovania pripojení Conntrack
Môžete použiť príkaz conntrack na zobrazenie všetkých aktuálne sledovaných pripojení:
|
1 |
sudo conntrack -L |
Vypíše niečo podobné ako na snímke obrazovky:

Pridajte príznak -E na nepretržité sledovanie prichádzajúcich pripojení:
|
1 |
sudo conntrack -E |
Ak chcete zobraziť pripojenia sledované na konkrétnu cieľovú adresu, pridajte príznak -d a špecifikujte cieľovú adresu:
|
1 |
sudo conntrack -L -d 80.45.6.4 |
Niekedy sa tabuľka sledovania spojení zaplní, čo vedie k zahadzovaniu nových spojení. To spôsobuje problémy, ktoré bránia vašim uzlom nadviazať spoľahlivé spojenia. Ak k tomu dôjde, v systémových logoch na mieste uvidíte správy ako napríklad:/var/log/syslog:
|
1 |
Mar 07 19:12:11 worker-105 kernel: nf_conntrack: tabuľka plná, zahadzuje sa paket. |
Existuje systémové nastavenie pre maximálny počet sledovaných spojení. Na zobrazenie aktuálnej hodnoty použite nasledujúci príkaz:
|
1 |
sysctl net.netfilter.nf_conntrack_max |
Výstupom je:

Hodnotu môžete upraviť pomocou -w príznaku:
|
1 |
sudo sysctl -w net.netfilter.nf_conntrack_max=231074 |
Možno budete chcieť upraviť svoj /etc/sysctl.conf súbor, aby bola hodnota trvalá a zabezpečilo sa jej zachovanie aj po reštarte. Otvorte súbor pomocou nano:
|
1 |
sudo nano /etc/sysctl.conf |
Ďalej upravte hodnotu, ak riadok existuje, alebo pridajte riadok na koniec súboru s uvedením novej hodnoty:
|
1 |
net.netfilter.nf_conntrack_max=231074 |
Záver
Pri nasadzovaní viacerých kontajnerizovaných služieb budete mať z Kubernetes veľký úžitok, pretože vám poskytuje centrálny bod správy. Aby sme zabezpečili konektivitu medzi rôznymi podmi Kubernetes, ukázali sme vám niekoľko príkazov na kontrolu siete, ktoré môžete použiť na riešenie akýchkoľvek problémov s infraštruktúrou Kubernetes.
Ak sa chcete dozvedieť viac o Kubernetes, jeho výhodách, nastavovaní a nasadzovaní aplikácií v Kubernetes, pozrite si naše rôzne Kubernetes tutoriály.
Príjemnú prácu!
Komentáre
Zatiaľ žiadne komentáre. Buďte prvý.